Instagram Live ad clip: burn an offer line with caption cues

Add a timed offer line to a Live replay clip with POST /v1/video-captions and cues, no speech needed. Sume bills $0.20 per clip up to 60 seconds.

5 min readSume
All posts

To put an offer line on a clip from an Instagram Live, send cues to POST /v1/video-captions: each cue is text, start and end in seconds, and Sume burns that text exactly at those times without running speech-to-text. A trade tracker lists Instagram Live Ads as rolling out from 2026-09-29 (read 2026-10-06), so replay clips with an on-screen price or code are a natural first test. Each caption job is $0.20 for videos up to 60 seconds.

Facts from Video captions: burn captions onto a video and the Social media platform updates, October 2026 (read 2026-10-06).

Why cues and not script_text?

script_text aligns your words to what the speaker actually says, so it needs audible speech and it can fail with script_alignment_mismatch. A price line is not speech. cues are authored overlay text, so they work on silent clips, they work when the host talks over music, and they cannot misalign. You send only one of script_text, words, cues and segments per request.

What can a cue say, and where does it sit?

Keep each cue short, a price, a code or a day. Use style and design to choose how it looks: design.colors changes the colours, design.placement.anchor_ratio moves the line up or down as a fraction of the frame height, and design.phrasing.max_words limits how many words show at once. A number outside its documented range returns 400 at request time, so a bad look fails before you pay for a render.

Place the line where Instagram's own buttons and captions will not cover it. This post does not give Meta's safe-zone numbers, because they come from Meta's own creative specs and not from Sume's docs; preview the burned result in the app's own player and adjust anchor_ratio until it clears the interface.

import json, os, urllib.request

body = {
    "video_url": "https://media.sume.com/artifacts/artf_demo/live-moment.mp4",
    "style": "black-outline",
    "cues": [
        {"text": "Live price: $24", "start": 0.5, "end": 4.0},
        {"text": "Code LIVE10 at checkout", "start": 4.0, "end": 8.0},
    ],
    "design": {"placement": {"anchor_ratio": 0.7}},
}
req = urllib.request.Request(
    "https://api.sume.com/v1/video-captions",
    data=json.dumps(body).encode(),
    headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
             "Content-Type": "application/json",
             "Idempotency-Key": "live-offer-001"},
)
with urllib.request.urlopen(req) as r:
    print(json.load(r))

Edits without a second transcription

If the first look is wrong, restyle it. Sume reuses the source video's word timings, so a restyle does not run speech-to-text again, and the price does not change because a restyle is still a render. For cues there is nothing to transcribe at all. Change the colour, the anchor or the wording and resubmit with a new Idempotency-Key; the same key with a different body would be a different request.

Caption fields for an offer line, from Sume's video captions page, read 2026-10-06.
FieldUsed forExample
cues[].textThe line to burnCode LIVE10 at checkout
cues[].start / endSeconds on the clip4.0 to 8.0
styleLook and motionblack-outline
design.placement.anchor_ratioVertical position0.7
Idempotency-KeyRetry safetylive-offer-001

Errors you can hit and what they mean

Three failures are specific to this route. Sending more than one of script_text, words, cues and segments is rejected, because only one text source is allowed per request. A URL that is not a public HTTPS video, such as a signed or private link, is rejected at submit, so import a Live replay to Sume or host it publicly before you call. And if you drop cues and rely on speech, a silent clip fails with caption_no_speech, whose suggested next action is to use overlay captions, which is exactly what the cues path is.

Sume can also make a second look from the first one without paying for a new transcription: send source_caption_id instead of video_url with a different style, and the job reuses the stored source video and timings. The price of that restyle is still one caption render, $0.20 under the current fixed estimate.

Limits worth knowing

The source must be a public HTTPS video URL, and the $0.20 rate is for clips up to 60 seconds under the current fixed estimate; confirm it in GET /v1/catalog. The result is a new video, not an edit of the original, so keep the clean version if the offer changes and you need to re-burn.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume