output shape, no matter the type. A complete job carries one output object. Read output.data for a computed answer, output.file.url for the file to play or download, and output.files for the full list.
output is present when status is complete. A failed job carries an error object instead. See Job lifecycle for status transitions.
Fields
The computed answer for jobs that return one, such as a probe result, detections, or a transcript.
null for jobs that only write files. The shape is job-type-specific, so each type documents its own. See Per-type data shapes.The headline result you play or download: a single output file, or a stream manifest (
.m3u8 / .mpd, typed playlist). null for data-only jobs and for pure file sets with no single headline. Always one of files.Every file the job produced, the complete list. A single-file job lists one. A stream lists the manifest plus segments. A set lists every member.
[] for data-only jobs.Unix ms when the file URLs expire. Present when
files is non-empty. Re-fetch the job with GET /jobs/{id} to mint fresh URLs.Choosing file vs files
files is the complete list of everything a job wrote. Most jobs return a single output, but some return many: an image sequence, the segments of an HLS stream, or a resolution ladder. When a job can produce more than one file, read files.
file is a shortcut for the common case. When you expect a single output, read output.file.url and you have the result, with no need to index into the list. For a single-output job, file is that one file, so it is the same entry as files[0]. That overlap is on purpose. It keeps the everyday case a one-liner while files stays the honest, complete manifest of what came out.
A job with no single headline sets file to null. So a null file is also the signal that the result is a pure set of files or a data-only answer, not one file you play or download.
The File type
Each entry infile and files is the same shape:
Signed download or serving URL. Expires at
output.expiresAt.The filename the job wrote, such as
output.mp4.Open enum:
video, image, audio, captions, playlist, data, or other. Treat it as open. Tolerate values you don’t recognize, since new types can appear without a version bump.File size in bytes.
Optional probed metadata:
format, width, height, durationMs. Each field is present when known.Invariants
Three rules hold for every job type. Code against them.output.fileis always one ofoutput.files(ornull). The headline is never a file missing from the full list.output.expiresAtis present wheneveroutput.filesis non-empty. Data-only jobs leave bothfilesempty andexpiresAtnull.- A
completejob always hasoutput.dataoroutput.files(or both). It never returns an empty result.
How to consume
The read path is the same every time:output.data, output.file, and output.files mean the same thing for ffmpeg, extract.metadata, caption.extract, and every other type.
Output patterns
Four patterns cover every job. The shape is identical. Which fields are populated depends on what the job produced.Single file
One output file.file is that file, files lists one, data is null. The most common pattern for transform jobs (FFmpeg, transcode, watermark).
Stream
An HLS or DASH stream.file is the manifest, typed playlist. Point a player at file.url directly. files carries the manifest plus every segment.
Set
An unordered set with no single headline, such as an image sequence, a-f segment split, or a resolution ladder. file is null. Read files for the list.
Data-only
A job that computes an answer instead of writing files.data carries the result. file is null, files is empty, expiresAt is null.
Per-type data shapes
output.data is the only part of the output that varies by job type. Transform jobs leave it null and return files. Analysis jobs return their result here and write no file.
The rule of thumb:
- Transform jobs (
ffmpeg,transcode,watermark.*,caption.burn) return files withdata: null. - Analysis jobs (moderation, detection, captions, transcript, OCR, metadata) return their result in
dataand usually write no file.
Status: Only
ffmpeg is live today. The other job types below are documented but not yet callable. See each job type page for its availability banner.| Job type | data shape | Files |
|---|---|---|
ffmpeg | null | The files your command wrote |
extract.metadata | Probe result (see below) | None (data-only) |
extract.scenes | Scene cut list | None (data-only) |
extract.text | Recognized text with positions and timestamps | None (data-only) |
caption.extract | Transcript with word timings | A captions file (.srt / .vtt) |
compliance.moderate | Moderation labels with confidences | None (data-only) |
compliance.gdpr.detect | Detected regions (faces, plates) with bounding boxes | None (data-only) |
watermark.detect | Match result with confidence | None (data-only) |
transcode, watermark.apply, caption.burn | null | The transformed media |
extract.metadata
output.data is the probe result. The job runs ffprobe, returns the result inline, and writes no file.
| Field | Type | Meaning |
|---|---|---|
width | integer | Frame width in pixels |
height | integer | Frame height in pixels |
durationMs | integer | Duration in milliseconds |
codec | string | Video codec, such as h264 |
fps | number | Frames per second |
bitrate | integer | Overall bitrate in bits per second |
audioCodec | string | Audio codec, present when the file has audio |
audioChannels | integer | Channel count, present when the file has audio |
audioSampleRate | integer | Sample rate in Hz, present when the file has audio |
See also
- Job lifecycle: the statuses a job moves through before
outputexists - FFmpeg reference: the response for a file-producing job
- POST /jobs: submit a job and read the result
- Error codes: the
errorshape afailedjob returns instead