Timeline 400: first slot must start at 0 and take no transition

Fix timeline_must_start_at_zero and transition_on_first_segment: start video[0] at 0, use source_in to skip, put fades on slot two, then plan for free.

5 min readSume
All posts

A Timeline render returns timeline_must_start_at_zero when video[0].start is anything but 0, and transition_on_first_segment when the first slot carries a transition. Fix both by starting the first slot at 0 and moving every transition to the slot after it.

Both rules come from the Timeline 1.0 reference. The reasoning is plain once you picture the spine: the audio starts at second 0, so the first picture must be there too, and a transition blends the previous slot into this one, which a first slot does not have.

The two first-slot codes

Timeline 1.0 takes one audio spine and an ordered video[] array of 1 to 200 slots. Each slot has a start on the spine and a duration. The first slot is special in two ways.

First-slot refusals, from the Timeline 1.0 docs (read 2026-10-10)
CodeTriggerFix
timeline_must_start_at_zerovideo[0].start is not 0Set the first start to 0; use source_in to skip into the file
transition_on_first_segmentvideo[0].transition is presentDelete it; put the transition on video[1]
invalid_segment_timingStarts do not increaseMake each later start larger than the one before
segment_overlapSlots overlap past the transitionShorten a duration or move the next start

If you wanted to skip the start of a clip

People hit timeline_must_start_at_zero when they want the render to open on the middle of a source file. The start field is the on-spine position, not a position in the file. To begin partway into the source, leave start at 0 and set source_in, the in-point into the file. Audio has its own matching field: audio.source_in is an in-point into a single url spine, and it is not allowed together with audio.parts[] (audio_source_in_requires_single_spine).

If the opening seconds of a clip are wrong rather than the whole slot, a separate cut is another route: Video trim returns a new MP4 for [start, end) at $0.02 a job, and you then place that file with source_in 0.

Transitions have more rules than the first slot

Once the first slot is clean, the transition rules decide whether a plan passes. A transition type is one of fade, wipeleft, wiperight, slideup, slidedown or dissolve. Its duration is at most 1 second, at most 50% of the shorter neighboring slot, and at least one output frame. Break those and you get transition_too_long or transition_not_frame_aligned.

More than 8 adjacent fades return too_many_chained_transitions; insert a hard cut to break the chain. Declared starts are authoritative: the compiler compensates for the overlap of a cross-fade and never pre-shifts your numbers, so write starts as if the picture cut cleanly and let the compiler handle the blend.

  • Slot coverage can stop at most 0.5 seconds before the end of the spine.
  • Slot duration must be at least 0.2 seconds.
  • Stills are static holds: a motion field is accepted but ignored and reported as motion_ignored.
  • strategy: "single" above 12 slots returns render_strategy_unsafe; leave render.strategy on auto, which chunks past 12 segments.

Check the document before you pay

Do not learn these rules from a paid job. POST /v1/timeline-1.0/plan runs the schema check, the Sume-host URL check and the compiler, and it returns the duration, segment count, billable minutes and an estimated cost. It creates no job, reserves no credits, downloads no media and needs no Idempotency-Key. The sample below passes: the first slot starts at 0 with no transition, and the fade sits on the second slot.

A plan cannot predict warnings about short sources being padded or looped, so still read warnings[] on the real result.

curl -X POST https://api.sume.com/v1/timeline-1.0/plan \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "audio": {"url": "https://media.sume.com/artifacts/artf_demo/voice.wav", "duration_seconds": 24},
    "video": [
      {"source_url": "https://media.sume.com/artifacts/artf_demo/intro.mp4", "start": 0, "duration": 8},
      {"source_url": "https://media.sume.com/artifacts/artf_demo/talk.mp4", "start": 8, "duration": 16,
       "transition": {"type": "fade", "duration": 0.25}}
    ]
  }'

What the render costs once the plan passes

The public rate is $0.10 per ceil output minute, and the reservation is ceil(audio.duration_seconds / 60) minutes. The 24-second example above reserves one minute, so $0.10. The default output is 1080 by 1920; set output.width, output.height and output.fps if your sources differ, or the job reports output_fps_resamples_sources when it has to repeat or drop frames. Every URL in the document must already be a media.sume.com artifact of your workspace, so import files first with POST /v1/media-imports; see Media inputs for how Sume treats URLs.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume