Timeline 400 on codec, crf or ffmpeg_args: what a Reel spec can send
Sume Timeline refuses codec, crf, preset, filter_complex and ffmpeg_args with a 400. Which output fields it does accept for a 9:16 Reel or Short and why.

Sume Timeline returns a 400 if the body contains codec, video_codec, audio_codec, preset, crf, filtergraph, filter_complex, ffmpeg_args, args, command, raw, expression, model, endpoint or provider_endpoint. The server compiles ffmpeg itself and callers send a declarative document only. Read from the Timeline docs and API schema on 2026-10-06.
What can an export spec set instead?
| Want | Field | Limit |
|---|---|---|
| Vertical frame | output.width, output.height | Even integers 256 to 2160; default 1080x1920 |
| Frame rate | output.fps | 24, 25, 30 or 60; omit to match sources |
| Fade at start or end | output.fade_in_seconds, fade_out_seconds | 0 to 5 each, sum within the length |
| Length | audio.duration_seconds | 1 to 1800 |
| Crop behavior | video[].fit | cover, contain, stretch or blur |
What do I do when a platform wants a bitrate?
Control the file size with length, resolution and frame rate, which are the inputs you do own. The encode is H.264 at CRF 20, so bitrate follows the footage. If a platform sets a hard bitrate floor, probe the delivered MP4 and see whether it passes before you upload.
Is the 400 a bug?
No. It is the contract: it keeps every render reproducible and keeps filtergraph text out of requests. Remove the field and resend; a 400 means no job was created, so nothing was billed.
Sources
Related posts
More in Developers
- Timeline segment_source_short_looped vs padded: loop or freeze a clip
When a clip is shorter than its slot, Sume Timeline either loops it or holds its last frame. How render.pad_mode auto, loop and freeze decide, with thresholds.
- Timeline mode sync for a 30-second Short: handle both 200 and 202
Sume Timeline mode sync waits up to 30 seconds and returns 200 if the render finished, else 202. Why a Short client must handle both, with a Python poll loop.
- Timeline warning transition_downgraded_to_cut: why a fade became a cut
Sume Timeline turns a fade, wipe or slide into a hard cut when the transition does not fit the clip. Why it happens in short vertical edits and how to avoid it.
- Sume timeline warnings are not failures: a gate for your season
A padded, looped, resampled or clamped clip comes back as a warning on a completed render. A Python allowlist gate stops those episodes before you publish.
Written by Sume