Nine 20 s voice files, one 180 s spine: Timeline audio.parts
Join nine 20-second voice files into a 180 s Short spine with Timeline 1.0 audio.parts (up to 20 slices, gapless, no re-TTS) for $0.30 inside one render.

Put the nine files in audio.parts[] as nine { url } entries and set audio.duration_seconds to 180. Timeline joins them in the sample domain, with no gap at the seams and no re-synthesis, and the render bills ceil(180 / 60) = 3 minutes at $0.10, so $0.30. A Short can be up to three minutes (YouTube page read 2026-10-08), so 180 seconds is the top of the range; use 179 for margin if the files add up to more.
The rules for parts
audio.parts[] takes 1 to 20 slices. Each slice is a Sume-hosted url with an optional source_in and duration. You cannot send audio.url together with parts (audio_url_and_parts_exclusive), and you cannot use the top-level audio.source_in with parts (audio_source_in_requires_single_spine). If the declared part lengths add up to less than audio.duration_seconds, the request fails with audio_parts_shorter_than_duration.
| Quantity | Value |
|---|---|
| Parts | 9 (limit 20) |
| Length of each part | 20 s |
| Sum of parts | 9 x 20 = 180 s |
audio.duration_seconds | 180 (limit 1-1,800) |
| Timeline minutes | ceil(180 / 60) = 3 |
| Timeline cost | 3 x $0.10 = $0.30 |
Part starts and video slots
Each part begins where the last one ended, so part k starts at 20 x (k - 1) seconds on the spine: 0, 20, 40, and so on to 160. If you want a picture change on every voice line, give the video slots the same starts and a duration of 20. With nine slots, the render is below the 12-slot limit for render.strategy: "single".
With parts, the join is only inside this render. If you need the joined audio as a reusable file, for example to chapter it or to reuse it for an avatar clip, use timeline audio with operation: "concat". It returns one audio_url and segments[] with the start of each part, which you use to re-base the video slots.
- All parts must share a channel layout, or the audio job refuses with
audio_parts_channel_mismatch. - The longest spine that 20 parts can build is limited by the 1,800 s spine cap, not by the part count.
- Voice files must be on
media.sume.com; import them first withPOST /v1/media-imports.
Check before you pay
Run the same body on POST /v1/timeline-1.0/plan. It is unbilled and returns duration_seconds, segment_count, billable_minutes and estimated_cost_usd_micros, so for this program you should see 180 seconds and 3 billable minutes, which is 300,000 micros. A plan does not download media, so it cannot find a part that is too short or a wrong channel layout; those show up when the job runs.
When 20 parts is the limit
A 180-second script of 20-second lines needs 9 parts. A script of 6-second lines needs 30 parts for the same 180 seconds, which is more than the limit of 20. In that case, join in two steps: concat with timeline audio first (up to 20 parts into one file), and use the result and the remaining parts in the final render.
Sources
Related posts
More in Developers
- No progress percent on the Sume video poll: status plus elapsed time
The poll has status, not a percentage. How to build an honest progress label from pending, in_progress and elapsed seconds, with a 30-second interval.
- Node 26.11 isValidHeaderValue: check a Sume Idempotency-Key first
Node 26.11 adds http.isValidHeaderValue. Use it to reject a bad Idempotency-Key before POST /v1/images, with a fallback for older Node, and see its limits.
- Node 26.11 ships Undici 8.11.2: tell a Sume poll timeout from an abort
Catch TimeoutError separately from AbortError when a Sume status poll in Node fetch times out, and know which Sume calls are safe to repeat after that timeout.
- Node 26 enters LTS in October 2026: pin your Sume webhook receiver
Node 26 moves to LTS this month and Node 27 Alpha starts. Pin the runtime that runs your Sume webhook receiver and prove it with a signed self-test.
Written by Sume