Event recap from 87 phone clips: 4 billed minutes, $0.40 on Timeline

Join 87 phone clips into a 235-second event recap on Sume: one Timeline 1.0 render, 87 of 200 slots, chunked automatically, 4 billed minutes at $0.10 = $0.40.

5 min readSume
All posts

An event recap from 87 phone clips fits in one Timeline 1.0 render: it allows 1 to 200 video slots, so 87 is fine. If each clip is 2.7 seconds, the recap runs 234.9 seconds, which bills as 4 minutes at $0.10 per output minute, $0.40. Add $0.125 for a Music 1.0 bed if you generate one.

The limits that matter

Timeline 1.0 takes one audio spine up to 1,800 seconds and up to 200 video slots, and each slot needs a start on the spine, a duration of at least 0.2 seconds and a Sume-hosted source. Video[0].start must be 0, later starts must increase, and coverage can stop at most 0.5 seconds before the end of the spine.

The render strategy is auto by default, and it chunks past 12 segments. Asking for strategy single above 12 slots is refused with render_strategy_unsafe, so leave it on auto for an 87-slot recap.

87 clips of 2.7 s each, Timeline 1.0 (read 2026-10-09)
ItemValueCost
Video slots87 of 200 allowedn/a
Output length87 x 2.7 = 234.9 sn/a
Billed minutesceil(234.9 / 60) = 4$0.40
Music 1.0 bed (optional)one generation, flat$0.125
Total with bed$0.525

Transitions and frame rate

A fade between 87 clips would be a lot of fades, and the job refuses more than 8 adjacent transitions with too_many_chained_transitions. Use hard cuts for most boundaries and keep fades for chapter breaks, each at most 1 second and half of the shorter neighbor.

Phone clips often differ in frame rate. If you omit output.fps the job follows the longest video sources, and it reports output_fps_resamples_sources if a source rate differs, which can show as judder. Set output.fps to 30 if your clips are a mix and you want one consistent rate.

import json
clips = [f"https://media.sume.com/artifacts/artf_demo/c{i:02d}.mp4" for i in range(87)]
slots, t = [], 0.0
for url in clips:
    slots.append({"source_url": url, "start": round(t, 3), "duration": 2.7})
    t += 2.7
body = {"audio": {"url": "https://media.sume.com/artifacts/artf_demo/bed.wav",
                  "duration_seconds": 235},
        "video": slots}
print(len(slots), round(t, 1))
print(json.dumps(body)[:120])

Before you pay

Run POST /v1/timeline-1.0/plan first. It is unbilled and returns duration_seconds, segment_count and billable_minutes. It cannot predict warnings for short sources that get padded or looped. Import the clips with media imports first, because off-host URLs are rejected at admit. Cut long clips to the best 2.7 seconds with video trim at $0.02 each, or use video[].source_in on the render so you do not pay for extra trim jobs.

A practical note

Order matters more than the count. Sort clips by the time they were shot so the recap follows the event, then break the sequence into chapters, such as arrival, talks and evening. Add a title card as a still slot at the start, because Timeline accepts stills as static holds. Check the plan output first: segment_count should be 88 with the card, and billable_minutes should be 4. If a clip fails import, fix only that slot and rerun the plan before you render.

Before you scale

Every price in this post is a Sume list price read from the public catalog on 2026-10-09, and the arithmetic is shown so you can redo it with your own counts. Rates can change, so re-read the catalog before a large batch and run a small test first. Sume bills the job's captured amount, and the job result tells you what was used, so compare the first run's receipt with your estimate before you scale the work to the full set.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume