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.

To promote an Instagram Live with a teaser, generate a vertical clip with POST /v1/videos using model: "sume/auto", aspect_ratio: "9:16" and a duration between 3 and 10 seconds. A trade tracker lists Instagram Live Ads as rolling out to everyone from 2026-09-29 (read 2026-10-06), so a short announcement clip is a sensible first asset. This post does not cover Meta's creative rules for the format, so check them on Meta's side before you upload; this post covers only what Sume produces.
Sume facts: Video generation: the /v1/videos API. Platform date: Social media platform updates, October 2026 (read 2026-10-06).
What does sume/auto give you?
sume/auto keeps to one fixed envelope, and Sume does not name the model behind it. It takes text, first-frame images or reference images, with 3 to 10 seconds per clip (8 by default), 360p, 720p, 1080p or 4K, in 16:9 or 9:16, and native synced audio that is always on. Sending generate_audio: false fails, so leave the field out. Anything outside those limits fails closed with 400 unsupported_capability instead of being quietly routed elsewhere.
That fits a teaser well. It is short, vertical and has sound. It does not fit a 15-second or 30-second announcement in one clip; for those, name a catalog model whose supported_durations allow it, which GET /v1/videos/models lists, or join two clips with Timeline.
The request
Submit, then poll. The submit returns 202 with an id; poll GET /v1/videos/{id} until it is completed, then read GET /v1/videos/{id}/content, which redirects to the file. Be specific in the prompt about what is on screen at second 1: this is a thumb-stopper, not a trailer.
import json, os, time, urllib.request
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
"Content-Type": "application/json"}
def call(method, url, body=None):
data = json.dumps(body).encode() if body else None
req = urllib.request.Request(url, data=data, headers=H, method=method)
with urllib.request.urlopen(req) as r:
return json.load(r)
job = call("POST", "https://api.sume.com/v1/videos", {
"model": "sume/auto",
"prompt": "Handheld phone shot of a host smiling at a counter of "
"ceramic mugs, quick push-in, warm light, 'Going live' energy",
"aspect_ratio": "9:16",
"duration": 6,
"resolution": "720p",
})
while job["status"] not in ("completed", "failed", "cancelled"):
time.sleep(5)
job = call("GET", "https://api.sume.com/v1/videos/" + job["id"])
print(job["status"])
What should the teaser say?
Keep the clip about when and what, and put the exact time and handle in the post copy and overlay, not in generated text. Generated video text is the weakest part of any model, so add words afterwards: the caption cues path burns authored text at set times with no speech to text, which is covered in Instagram Live ad clip: add an offer line with caption cues. If you already have a product photo, pin it as a frame_images first frame rather than describing the product in words.
| Setting | Allowed | Default |
|---|---|---|
| duration | 3 to 10 seconds | 8 |
| resolution | 360p, 720p, 1080p, 4K | 720p |
| aspect_ratio | 16:9 or 9:16 | Set 9:16 for a teaser |
| generate_audio | Always on; false is rejected | Leave unset |
| Image inputs | first frame, last frame, references | None |
Before you publish
Watch it with the sound on and off. If the audio carries a line you need, caption it. If the clip looks like a stock ad rather than your host, switch to references of the real set or person instead of describing them. A teaser that does not look like your Live will lose the viewer on arrival.
Sources
Related posts
More in Use cases
- 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.
- LinkedIn video ad thumbnail: pick a still with video frames
LinkedIn's initializeUpload takes an optional thumbnail. Pull up to 24 candidate stills from your MP4 with POST /v1/video-frames and pick one.
Written by Sume