Timeline audio 400 codes: what each refusal means and the fix
Sume timeline audio refuses bad concat and split requests with stable codes such as audio_concat_requires_parts. Each code, its cause and the fix.

Why did my timeline audio request fail with a 400? Sume refuses malformed requests with stable codes, so you can branch on the code rather than the message. The most common are audio_concat_requires_parts, audio_split_requires_ranges and audio_parts_channel_mismatch, all documented on the timeline audio page.
The endpoint is POST /v1/timeline-1.0/audio. It concatenates up to 20 parts or splits one file into up to 20 ranges, and costs a flat $0.01 per job.
Refusals and fixes
Concat and split take different fields, and mixing them is the main source of errors.
| Code | Cause | Fix |
|---|---|---|
| audio_concat_requires_parts | Concat without parts | Send parts[] with 1 to 20 items |
| audio_concat_takes_no_url | Concat with a top-level url | Move each url into a parts[] entry |
| audio_concat_takes_no_ranges | Concat with ranges | Remove ranges, or switch to split |
| audio_split_requires_url | Split without url | Send one top-level url |
| audio_split_requires_ranges | Split without ranges | Send ranges[] with 1 to 20 items |
| audio_split_takes_no_parts | Split with parts | Remove parts, or switch to concat |
| audio_range_end_before_start | A range end is not after its start | Fix the range or omit end for the rest of the file |
| audio_parts_channel_mismatch | Parts differ in channel layout | Re-detach or re-render so all parts match |
Source and host errors
unsupported_media_source and source_not_found mean an off-host or dead URL. Every URL must already be this workspace's media.sume.com audio, so a link such as https://example.com/a.wav is rejected at admit; import it first with POST /v1/media-imports.
Provider and ffmpeg keys such as filtergraph, ffmpeg_args, codec and crf return a 400. The server compiles the ffmpeg command itself, so you describe the outcome and never the command.
Limits behind the codes
Concat needs 1 to 20 parts, and split needs 1 to 20 ranges, which may overlap. Produced audio is at most 1,800 seconds. Output is wav by default and mp3 on request; keep WAV when the file will be joined again, because MP3 re-adds priming padding at each edge.
Each part may carry source_in and duration to trim it before the join.
Submit and poll
The Idempotency-Key header is required. The default mode is async; mode: "sync" waits up to 30 seconds for a 200 or returns 202 to poll. There is no GET for the audio resource itself, so poll GET /v1/jobs/:id/status and read GET /v1/jobs/:id/result, as set out in Sume jobs and results.
For more than 20 lines, join in two levels, as shown in joining more than 20 lines.
Handling the codes in code
Because the codes are stable, a client can map them to actions instead of showing a raw message. A reasonable map: the seven shape errors above are bugs in your request builder, so fail the build or the test; unsupported_media_source and source_not_found mean the media step was skipped, so run an import and retry once; and audio_parts_channel_mismatch means the inputs need normalising before a retry. None of these should be retried unchanged, since the same request will fail the same way.
Sources
Related posts
More in Developers
- duck_requires_audio_spine: no music ducking under silence mode
Timeline refuses soundtrack.duck_db when audio.mode is silence, since there is no voice to duck under. The fix, the other silence rules, and a check.
- timeline_must_start_at_zero and transition_on_first_segment fixes
Timeline 1.0 needs video[0].start to be 0 and no transition on slot 0. How to open on a fade or a later in-point, with a Python builder that runs.
- Timeline segment_overlap: set start times when clips cross-fade
Sume Timeline returns segment_overlap when a slot starts before the previous one ends minus the fade. The rule, the fix, and a Python check.
- Timeline transition_too_long: 1 s cap and half the shorter clip
transition_too_long means a Timeline fade is over 1 s or over half the shorter neighbour. Sub-frame fades fail too. Limits, snapping, and a check.
Written by Sume