Add a cold open to a YouTube video: move the best 10 seconds first

Put your best 10 seconds at the start of a video: detach audio once, then one Timeline 1.0 render with audio.parts and source_in. Plan call is free.

5 min readSume
All posts

A cold open is the strongest 10 seconds of a video, shown first, then the video starts from the top. On Sume you do it with two jobs: Audio detach once to get the audio as a wav, then one Timeline 1.0 render whose video slots and audio parts both point back into the original file with source_in. The clip is never cut into separate files.

It suits creators with talking-head or tutorial videos, where the hook is in the middle and the intro is slow.

Why does it need the audio first?

Timeline renders from an audio spine plus ordered video slots. The slots decide the picture; the spine decides the sound and the length. The video's own audio is not used, so you extract it once and cut the spine with audio.parts[], up to 20 gapless slices, each { url, source_in, duration }. The join is sample-domain, with no re-encode of speech and no silence at the seam.

Detach returns sample-exact wav by default, and the output is capped at 900 seconds per job, with a source cap of 1800 seconds. For an 8-minute video one detach is enough.

What does the render body look like?

Say the video is 480 seconds and the hook is 312 to 322. The spine is two parts: the hook (source_in 312, duration 10) and the whole video from 0 for 480 seconds, so audio.duration_seconds is 490. The video slots mirror the same two ranges.

curl -X POST https://api.sume.com/v1/timeline-1.0/render \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: cold-open-vlog-41-v1" \
  -d '{
    "audio": {
      "parts": [
        { "url": "https://media.sume.com/artifacts/artf_demo/vlog.wav", "source_in": 312, "duration": 10 },
        { "url": "https://media.sume.com/artifacts/artf_demo/vlog.wav", "source_in": 0, "duration": 480 }
      ],
      "duration_seconds": 490
    },
    "video": [
      { "source_url": "https://media.sume.com/artifacts/artf_demo/vlog.mp4", "start": 0, "duration": 10, "source_in": 312 },
      { "source_url": "https://media.sume.com/artifacts/artf_demo/vlog.mp4", "start": 10, "duration": 480, "source_in": 0,
        "transition": { "type": "fade", "duration": 0.25 } }
    ],
    "output": { "width": 1920, "height": 1080 }
  }'

Check the numbers once: part durations sum to 490, slot two starts at 10 and runs 480, so coverage ends at 490. If declared part lengths sum to less than duration_seconds, the job is refused with audio_parts_shorter_than_duration.

How do I check it before paying?

Post the same body to POST /v1/timeline-1.0/plan. It is unbilled, needs no idempotency key, and returns duration_seconds, segment_count, billable_minutes and estimated_cost_usd_micros. Render is $0.10 per ceil(output minute), so 490 seconds reserves 9 minutes, $0.90. Add $0.01 for the detach.

Cold open job summary, read 2026-10-02
JobEndpointCostCap that matters
Detach audioPOST /v1/audio-detach$0.01 flat900 s output, 1800 s source
PlanPOST /v1/timeline-1.0/planFreeNone beyond schema
RenderPOST /v1/timeline-1.0/render$0.10 per output minute1800 s audio, 200 slots

What are the limits and honest caveats?

A fade between the hook and the main video is allowed on every slot after the first, at most 1 second and half the shorter neighbour. A hard cut is a better default for a cold open, so omit transition if you want it. Sources must be on media.sume.com, so import the video first with POST /v1/media-imports.

Sume picks nothing for you here. It does not find the best 10 seconds; you choose the timestamps, or read them from a transcript. For that, Video inspect can return a probe, stills and an optional transcript to help you find the line.

Finally, the original file is not changed. The render is a new MP4 and you decide what to upload. Poll GET /v1/jobs/:id/status and read the result as described in Jobs and results.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume