Timeline audio 400: concat takes no url, split takes no parts

Sume's timeline audio endpoint rejects concat with a top-level url and split with parts. Stable error codes and the right shape for each operation.

4 min readSume
All posts

If POST /v1/timeline-1.0/audio returns audio_concat_takes_no_url or audio_split_takes_no_parts, you sent fields from the wrong operation. Concat takes only parts[]. Split takes only a top-level url plus ranges[]. Remove the fields that belong to the other operation and resend; the refusal happens at admission, so nothing was generated.

The endpoint either joins Sume-hosted audio into one gapless file or slices one file into ranges. Because both operations share one URL, the operation field decides which other fields are legal.

What does each operation accept?

Concat needs operation: "concat" and parts[], one to 20 ordered items, each { url, source_in?, duration? }. Split needs operation: "split", a top-level url, and ranges[] of one to 20 items, each { start, end? }. Ranges may overlap, and an omitted end runs to the end of the file.

An Idempotency-Key header is required on both. The default mode is async; pass mode: "sync" to wait up to 30 seconds for a 200, otherwise you get a 202 and poll the job.

# Split: top-level url + ranges, no parts
curl -X POST https://api.sume.com/v1/timeline-1.0/audio \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: timeline-audio-split-001" \
  -d '{
    "operation": "split",
    "url": "https://media.sume.com/artifacts/artf_demo/spine.wav",
    "ranges": [{ "start": 0, "end": 12.4 }, { "start": 12.4 }]
  }'

Which error code means which mistake?

The codes are stable, so you can branch on them in client code instead of matching message text.

Timeline audio refusal codes from Sume's timeline-audio docs, read 2026-10-12.
CodeCauseFix
audio_concat_requires_partsConcat sent without partsAdd parts[]
audio_concat_takes_no_urlConcat sent with a top-level urlMove the file into parts[0].url
audio_concat_takes_no_rangesConcat sent with rangesDrop ranges; trim with source_in and duration
audio_split_requires_urlSplit sent without urlAdd the source file URL
audio_split_requires_rangesSplit sent without rangesAdd ranges[]
audio_split_takes_no_partsSplit sent with partsDrop parts
audio_range_end_before_startA range end is at or before startFix the range
unsupported_media_sourceURL is not Sume-hostedImport the file first

Why is my URL refused even with the right shape?

All URLs must already be this workspace's media.sume.com audio. An outside URL such as https://example.com/take.wav is rejected at admission with unsupported_media_source; a dead or other-workspace URL returns source_not_found. Import the file with POST /v1/media-imports first.

If your source is a video, extract its track once with audio detach, then split the detached file, instead of detaching again for every range.

What comes back and what does it cost?

Concat returns kind: timeline_audio with one audio_url, a duration_seconds, and segments[] giving each part's start offset. Split returns segments[], each with its own audio_url. There is no GET route for this resource, so poll GET /v1/jobs/{id}/status and read /result.

The default output is wav, which is sample-exact; mp3 is smaller but adds priming padding at every edge, so keep wav if you will join again. Sume's docs list the public rate as $0.01 flat per job, with the live rate in GET /v1/catalog. Concat parts must also share a channel layout, or the worker returns audio_parts_channel_mismatch.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume