Skip to main content
POST
Submit Upload Job
One endpoint serves both Inter-2 models. Name the model in the model form field:
  • inter-2 reads the video: picture and sound together. It accepts mp4, mov, avi, mkv, webm, or mpeg-ts files carrying both a video and an audio track, and reports all ten social signals.
  • inter-2-audio reads the audio alone. It accepts wav, flac, mp3, m4a, or ogg files, or a webm or mp4 carrying an audio track (any video track is ignored), and reports agreement, confidence, frustration, hesitation, interest, and uncertainty.
For either model, the file must hold at least 3 seconds of media, be no larger than 32 MB, and be no longer than 30 minutes. Both need the interhumanai.upload scope, and both return the same job envelope and result shape. A file without the track a model reads is refused: ih5008 when a file has no audio, and ih5001 when an inter-2 file has no video or any file is empty. A format the model does not read is refused with ih4002. Quickstarts: Video Analysis · Audio Analysis
Have an existing POST /v1/upload/analyze integration? See Migrate from V1 to V2 for the request, job lifecycle, and result changes. A new integration, including any use of Inter-2 Audio, needs no migration.

Response Headers

header
Unique identifier for the request. Include this when contacting support.Example: f47ac10b-58cc-4372-a567-0e02b2c3d479

Authorizations

Authorization
string
header
required

Send your API key, or a client token minted by POST /v1/client_tokens, in the Authorization header as Bearer <credential>. This endpoint requires the interhumanai.upload scope: an API key must hold it, and a client token must be minted with it (the minting key must have held it). A credential without it is refused with ih2003.

Headers

X-Client-Request-Id
string

Optional identifier supplied by the client to correlate this request with their own logs. When provided, the value is recorded alongside the server-assigned correlation ID in Interhuman logs to aid lookup and support investigations. This header is not echoed back in the response; the server returns its own correlation ID in the X-Correlation-ID HTTP response header.

Body

multipart/form-data
file
file
required

The file to analyze. For inter-2, an mp4, mov, avi, mkv, webm or mpeg-ts video carrying both a video and an audio track. For inter-2-audio, a wav, flac, mp3, m4a or ogg audio file, or a webm or mp4 carrying an audio track. At least 3 seconds of media, at most 32 MB, and no longer than the deployment's maximum duration (30 minutes by default).

model
enum<string>
required

The Inter-2 model to analyze with: inter-2, which reads the video, picture and sound together, or inter-2-audio, which reads the audio alone and reports a subset of the signals inter-2 reports. Either way the credential must carry the interhumanai.upload scope.

Available options:
inter-2,
inter-2-audio
wait_seconds
integer
default:0

Hold the request open for up to this many seconds waiting for the job to finish. 0 (the default) answers 202 at once. Values above the deployment's bound are rejected with ih4005.

Required range: x >= 0
include[]
enum<string>[]

Optional flags naming whole-file sections the job's result should carry. conversation_quality_overall and/or conversation_quality_timeline, the same values as POST /v1/upload/analyze, add the Conversation Quality Index as conversation_quality. signals adds signals: every window's signals in one chronological list, with same-type signals in adjacent windows merged by the same rules as POST /v1/upload/analyze, and no modality. Each section is built once the job completes and is absent when its flag is omitted.

Optional sections a POST /v2/upload/analyze job's result carries.

conversation_quality_overall: Include the overall conversation quality index. conversation_quality_timeline: Include the conversation quality timeline. signals: Include the whole-file signal list, with adjacent same-type signals merged.

Available options:
conversation_quality_overall,
conversation_quality_timeline,
signals

Response

The job reached a terminal state within wait_seconds: completed with result, or failed with error.

The job envelope, returned by both v2 upload routes.

job_id
string
required

Identifier of the job. Use it with GET /v2/upload/jobs/{job_id}.

Example:

"3f1c2b7a9d4e4c8fa1b2c3d4e5f60718"

status
enum<string>
required

Where the job is: queued (accepted, not started), running, completed (result is set) or failed (error is set).

Available options:
queued,
running,
completed,
failed
Example:

"queued"

model
enum<string>
required

The model the job was submitted for.

Available options:
inter-2,
inter-2-audio
Example:

"inter-2"

created_at
string<date-time>
required

When the job was accepted (UTC).

Example:

"2026-09-11T10:00:00Z"

expires_at
string<date-time>
required

When the job record, and its result, stop being readable (UTC). A read after this time answers ih4021.

Example:

"2026-09-11T11:00:00Z"

status_url
string
required

Path of the job's status resource, relative to the API base URL: /v2/upload/jobs/{job_id}.

Example:

"/v2/upload/jobs/3f1c2b7a9d4e4c8fa1b2c3d4e5f60718"

result
UploadJobResult · object | null

The result of a completed upload job: one entry per analyzed window.

signals and conversation_quality are whole-file views of those windows, each present only when the submit's include[] asked for it.

error
ErrorResponse · object | null

Structured error returned by all HTTP error paths.

Only error_id is required. The other fields are included when available.