Sneaker drop teaser: six clips, slideup cuts, one Timeline render

Cut six sneaker clips into one 18-second drop teaser with slideup transitions and a music bed: one Sume Timeline render, $0.10, with a free plan call first.

5 min readSume
All posts

To cut six sneaker clips into one drop teaser, send them to POST /v1/timeline-1.0/render as six video[] slots, give every slot after the first a transition of type slideup, and set the audio to mode: silence with a soundtrack bed. An 18-second teaser is one output minute, so the render is $0.10. The plan call that checks the program first is free.

A drop teaser lives or dies on rhythm: six short shots, a hard movement between them, and a bed that does not fight the product. Timeline gives you all three in one declarative document, and you never write an ffmpeg graph.

The program

Each slot has source_url, start (the on-spine start), duration (at least 0.2 seconds) and an optional transition. video[0].start must be 0, later starts must increase, and the first slot cannot carry a transition (transition_on_first_segment). The six transition types are fade, wipeleft, wiperight, slideup, slidedown and dissolve. A transition lasts at most 1 second and at most 50% of the shorter neighbouring slot.

For a three-second slot that makes 1.5 seconds the ceiling, so a 0.4-second slide is well inside the rule. More than 8 adjacent transitions are refused with too_many_chained_transitions; six clips need five, so you have room for a hard cut or two if the edit asks for it.

Six-clip sneaker teaser, one render (read 2026-10-05)
ItemValueSume price
Slots6 clips, 3 s each, starts 0, 3, 6, 9, 12, 15included
Transitions5 x slideup, 0.4 s eachincluded
Spineaudio.mode silence, duration_seconds 18included
Plan callPOST /v1/timeline-1.0/plan$0.00
Renderceil(18 / 60) = 1 output minute$0.10

Do not force a frame rate

Frame rate is the quiet way a teaser goes wrong. If you omit output.fps, the job renders at the rate of the sources, and the longest video source decides. If you force a rate that differs from a source, the job repeats or drops a frame every few frames and the product judders on a slow orbit. The job reports it as the warning output_fps_resamples_sources, together with the rate the sources wanted.

So shoot all six clips at the same rate, leave output.fps out, and set it to 24, 25, 30 or 60 only when every clip was shot at that rate. The default size is 1080 by 1920, which fits a vertical drop without any extra fields.

The bed goes in soundtrack: url, gain_db, loop and fade_out_seconds (up to 10). duck_db is not available here, because ducking needs a real audio spine and silence has none; the API refuses it with duck_requires_audio_spine. For a music-only teaser you do not need it.

Plan, then render

import os
import uuid
import requests

API = "https://api.sume.com/v1/timeline-1.0"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
clips = [os.environ[f"CLIP_{i}"] for i in range(6)]  # media.sume.com URLs
video = []
for i, url in enumerate(clips):
    slot = {"source_url": url, "start": i * 3, "duration": 3}
    if i:
        slot["transition"] = {"type": "slideup", "duration": 0.4}
    video.append(slot)
body = {
    "audio": {"mode": "silence", "duration_seconds": 18},
    "video": video,
    "soundtrack": {"url": os.environ["BED_URL"], "fade_out_seconds": 2},
}
plan = requests.post(f"{API}/plan", headers=H, json=body, timeout=60).json()
print(plan.get("billable_minutes"), plan.get("estimated_cost_usd_micros"))
r = requests.post(f"{API}/render", json=body, timeout=60,
                  headers={**H, "Idempotency-Key": f"drop-{uuid.uuid4()}"})
print(r.status_code, r.json().get("request_id"))

Result, warnings and import

Render is async by default and returns 202; poll GET /v1/jobs/:id/status and read GET /v1/jobs/:id/result, which carries video_url, duration_seconds, segment_count and billable_minutes. Soft warnings such as snapped transitions arrive in warnings[] and are not failures. If a slide arrives as a hard cut, read the warning before you debug the source; the case is covered in the downgraded crossfade post.

Clips must be this workspace's media.sume.com artifacts or assets, so import phone or camera files with POST /v1/media-imports first. The plan call checks the schema and the host rule without downloading anything, so a typo in a URL fails before you pay for a minute.

Scale the budget by count of teasers, not by clip count: ten colourways, each its own 18-second render, is ten minutes, or $1.00 on the same rate. A 61-second cut would bill two minutes, which is why the plan call returns billable_minutes before you commit.

Pacing is yours to choose, and the limits are generous: slots can be as short as 0.2 seconds, so a fast drop of twelve 1.5-second shots is also one minute. Keep each transition within the 50% rule, and keep the last slot covering the spine to within half a second, because coverage may stop at most 0.5 seconds before the end.

Finally, give the bed room to end. soundtrack.fade_out_seconds takes up to 10, and output.fade_out_seconds (0 to 5) fades the picture as well; the two fades together must not exceed the output length, or the job is refused with an edge-fade code before it starts.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume