Holiday lookbook video from stills: timeline fades at $0.10 a minute

Build a gift-guide lookbook from product stills with Sume Timeline 1.0: fades up to 1 s, a 1080x1920 default, $0.10 per output minute. Limits and refusals.

5 min readSume
All posts

A holiday lookbook from stills is one Timeline 1.0 request: a list of hosted images with start times on one audio spine, optional fades between them, and a default 1080 by 1920 MP4 output. The public rate is $0.10 per ceil(output minute), so a 45 second lookbook costs $0.10 and a 90 second one costs $0.20. Stills are static holds: the job accepts a motion field on a still, ignores it and reports motion_ignored, so do not plan on a camera move.

Run the unbilled POST /v1/timeline-1.0/plan first. It compiles your program as a preflight and refuses bad timing before you pay.

Shape of the program

You declare audio.duration_seconds (1 to 1800) and either a hosted audio.url, audio.parts[] or audio.mode: silence. Each video[] entry has a source_url, a start on the spine and a duration of at least 0.2 seconds. The first start must be 0 and later starts must increase. Coverage can stop at most 0.5 seconds before the end of the spine.

Timeline fields for a lookbook (read 2026-10-04, from the docs)
FieldRule
video[0].startMust be 0
video[].durationAt least 0.2 s
transition.typefade, wipeleft, wiperight, slideup, slidedown, dissolve
transition durationAt most 1 s and 50% of the shorter neighbor
Chained fadesMore than 8 adjacent is refused
Default output1080x1920 MP4

Segments and chunking

With render.strategy left on auto, Sume chunks the render past 12 segments. If you force single above 12 slots, it refuses with render_strategy_unsafe. A 24-look lookbook is therefore a 24-segment auto render, not a single pass. Plan roughly one look every 2 to 3 seconds for a gift guide, so 15 looks fit a 45 second spine with a little time for the closing card.

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": {"mode": "silence", "duration_seconds": 6},
    "video": [
      {"source_url": "https://media.sume.com/artifacts/a/look1.jpg", "start": 0, "duration": 3},
      {"source_url": "https://media.sume.com/artifacts/a/look2.jpg", "start": 3, "duration": 3,
       "transition": {"type": "fade", "duration": 0.5}}
    ]
  }'

Check the output

Submit the real render with an Idempotency-Key, poll GET /v1/jobs/:id/status and read /result, which returns video_url, duration_seconds, segment_count, billable_minutes and any soft warnings[]. Soft warnings, like padded or looped short sources, are not failures; read them anyway.

Run a frame check of the first still, a mid transition and the end card, because a fade that is too long can wash out a price card.

  • Plan first, render second.
  • Use fade, at most 1 s, and a hard cut after 8 chained fades.
  • Confirm the live rate in GET /v1/catalog.

A worked 45 second lookbook

Take 15 gift ideas, each held for 3 seconds: 15 x 3 = 45 seconds, which fits a 45 second spine exactly. Start times run 0, 3, 6 and so on to 42. Put a 0.5 second fade on every slot after the first; the docs cap a fade at 1 second and at half the shorter neighbor, so a 3 second slot can carry a fade up to 1 second, and 0.5 is a safe, quiet value. Fifteen slots is over the 12-segment threshold, so the render chunks under auto, and that is expected.

For the spine, use a hosted music file with a declared duration, or audio.mode: silence and add a soundtrack bed separately. The output is one MP4: 45 seconds bills one minute, $0.10. If you later stretch the spine to 61 seconds to fit a closing card, that bills two, $0.20, so decide the length with the price in mind.

Finish with a lookbook check. Confirm each still is a hosted artifact, since the job reads Sume-hosted media only. Confirm each slot's duration is at least 0.2 seconds. Read segment_count in the result: it should equal your slot count, and a different number means your program was not what you meant.

Related posts

More in Use cases

All Use cases posts

Written by Sume