Concatenate audio files by API: parts, and no top-level url

Sume Timeline audio concat needs a parts array and refuses a top-level url or ranges. Each operation accepts its own keys; mixing them returns a stable code.

4 min readSume
All posts

To concatenate audio with Sume, send operation: "concat" and a parts[] array of 1 to 20 ordered parts. Put no url or ranges at the top level: those are split fields and are refused as audio_concat_takes_no_url and audio_concat_takes_no_ranges.

This is from the Timeline audio docs, read 2026-10-01. HeyGen's Speech Cleanup post describes stitching remaining footage into one take; this API joins audio files you already hold.

Which keys belong to which operation?

Concat and split share an endpoint, POST /v1/timeline-1.0/audio, but not their fields.

Concat field rules from the Timeline audio docs, read 2026-10-01.
RequestCode
Concat without partsaudio_concat_requires_parts
Concat plus top-level urlaudio_concat_takes_no_url
Concat plus top-level rangesaudio_concat_takes_no_ranges

What does a valid concat look like?

Each part is { url, source_in?, duration? }. All URLs must already be on this workspace's media.sume.com. Parts must share one channel layout, or the worker returns audio_parts_channel_mismatch.

The join is sample-domain, so no re-synthesis and no silence at the seams. More in the channel mismatch post.

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: audio-concat-001" \
  -d '{
    "operation": "concat",
    "parts": [
      { "url": "https://media.sume.com/artifacts/artf_demo/line1.wav" },
      { "url": "https://media.sume.com/artifacts/artf_demo/line2.wav" }
    ]
  }'

How do I trim a part before joining?

Use source_in and duration on the part itself, not a top-level range. A trim belongs to the part; ranges belongs to split.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume