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.

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.
| Field | Used for | Example |
|---|---|---|
| cues[].text | The line to burn | Code LIVE10 at checkout |
| cues[].start / end | Seconds on the clip | 4.0 to 8.0 |
| style | Look and motion | black-outline |
| design.placement.anchor_ratio | Vertical position | 0.7 |
| Idempotency-Key | Retry safety | live-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
- Instagram Live Ads promo: make a 9:16 teaser clip with Sume
Instagram Live Ads started a general rollout on 2026-09-29. Make the 9:16 teaser that sends people to the stream with POST /v1/videos, 3 to 10 seconds.
- Kajabi lesson video from a 16:9 Sume avatar clip: what fits
Kajabi takes MP4 up to 4 GB and recommends 16:9. A 16:9 Sume avatar clip of up to 60 seconds is a lesson intro or recap. The numbers, and where it stops.
- LinkedIn video ad: cut a 3-second bumper from a longer video
LinkedIn's Videos API takes MP4 from 3 seconds to 30 minutes. Cut a 3-second bumper from a finished video with POST /v1/video-trim, $0.02 a job.
- LinkedIn video ad file check in Python before initializeUpload
Check an MP4 against LinkedIn's Videos API range of 75kb to 500MB before you call initializeUpload, and print the fileSizeBytes the request needs.
Written by Sume