Fast-cut Shorts in Timeline: eight chained fades, then a hard cut
Timeline refuses more than 8 adjacent fades with too_many_chained_transitions. Transitions must be 1 s or less and half the shorter neighbour. How to plan cuts.

In a Timeline render you can chain at most eight adjacent fades; a ninth is refused with too_many_chained_transitions, and the docs tell you to insert a hard cut. A hard cut is a slot with no transition. Each transition must be at most 1 second, at most 50% of the shorter neighbouring slot, and at least one output frame. So a fast-cut Short with many slots needs a mix: transitions where you want softness, hard cuts everywhere else.
Transitions are optional and are set per slot after the first. video[0] cannot carry one; that is refused with transition_on_first_segment.
The rules in one place
The types are fade, wipeleft, wiperight, slideup, slidedown and dissolve. The duration sits in the transition object. Because the compiler compensates for the crossfade overlap and never pre-shifts the declared starts, you keep writing each slot's start as the moment it begins on the spine.
The 50% rule bites with short clips. For two neighbours of 0.8 and 2 seconds, the shorter is 0.8, so the transition cannot exceed 0.4 seconds. At 30 fps one output frame is 1/30 = 0.033 seconds, so very small durations are also refused as transition_not_frame_aligned.
| Rule | Limit | Refusal code |
|---|---|---|
| Maximum transition length | 1 s | transition_too_long |
| Relative to neighbours | At most 50% of the shorter one | transition_too_long |
| Minimum | At least one output frame | transition_not_frame_aligned |
| Adjacent fades in a row | 8 | too_many_chained_transitions |
| On the first slot | Not allowed | transition_on_first_segment |
Planning a 30-slot Short
YouTube's three-minute Shorts page says Shorts can run up to 3 minutes. A Short of that length built from 6-second clips has 30 slots. If you gave every slot a fade you would hit the limit at slot nine, so group the slots: fade within a scene of four or five clips, then hard-cut between scenes.
Past 12 slots the render strategy matters as well. render.strategy: auto, the default, chunks the job; single above 12 is refused with render_strategy_unsafe. Leave it on auto for a long cut.
import json, os, urllib.request
body = {
"audio": {"mode": "silence", "duration_seconds": 12},
"video": [
{"source_url": "https://media.sume.com/artifacts/artf_demo/a.mp4",
"start": 0, "duration": 4},
{"source_url": "https://media.sume.com/artifacts/artf_demo/b.mp4",
"start": 4, "duration": 4,
"transition": {"type": "fade", "duration": 0.5}},
{"source_url": "https://media.sume.com/artifacts/artf_demo/c.mp4",
"start": 8, "duration": 4},
],
}
req = urllib.request.Request(
"https://api.sume.com/v1/timeline-1.0/plan",
data=json.dumps(body).encode(),
headers={
"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
"Content-Type": "application/json",
},
)
print(urllib.request.urlopen(req).read().decode())What the plan tells you
The plan call takes the same body as render, creates no job and needs no idempotency key. It returns segment_count, billable_minutes and filtergraph_summary, so you can confirm a 12-second silent program as three segments and one billable minute, $0.10. It is a way to catch a bad transition before you spend anything on the render.
Silence mode is handy for cut tests, since it takes no audio file; audio.mode: "silence" takes no url, parts, gain_db or source_in.
Cuts that read as fast
A hard cut is often better for pace than a fade: a fade of 0.5 seconds on a 2-second clip spends a quarter of the clip blending. Reserve fades for scene changes, use hard cuts inside a scene, and your video stays inside the chain limit without having to count.
Counting transitions in a program
Before you send a long program, count the adjacent slots that carry a transition. Only a run of consecutive fades counts toward the limit of eight, and a slot without a transition ends the run. In a 30-slot cut, a pattern of four fades and then one hard cut repeated six times never gets near the limit.
You can generate the program rather than write it by hand. Loop over your clips, give every slot a start equal to the sum of the earlier durations, and attach a transition only when the slot index is not a multiple of five. The starts must increase and video[0].start must be 0, or the render is refused with timeline_must_start_at_zero or invalid_segment_timing.
Run the plan call on the generated program. It costs nothing and its segment_count should equal your slot count, which catches an off-by-one in the loop before a render does.
Cost of the cut
Transitions do not change the price. A 180-second program is 3 billable minutes, $0.30, whether it has no transitions or twenty. The price follows the length of the audio spine, so a long fast-cut costs the same as a long slow one.
If a refusal does arrive, fix the program and submit again.
Sources
Related posts
More in Developers
- Fix an underexposed photo: curves first, AI edit only if needed
Underexposed photo? Try Pillow autocontrast and gamma for free, then an ideogram/ideogram-v4.5 edit at $0.075 only if noise or colour needs more.
- How do I fix one sentence in finished AI narration without redoing it?
Retake just the wrong sentence with a one-cent TTS job, then splice it into the original file with a $0.01 Timeline audio concat using source_in and duration.
- Get transcript text from a captioned video: caption jobs return none
A Sume caption job returns the burned video, not the transcript. For text and word times run STT or video inspect with transcribe. Prices and a recipe.
- Handle every Sume API error with one switch on next_action
Sume errors share one envelope. Branch on next_action, retryable and retry_after_seconds, and your client handles new codes without a code change. JS sample.
Written by Sume