Luggage holiday travel ad: fit a 16:9 clip to 9:16 with blur for $0.11
Reuse a 16:9 luggage ad as a 9:16 Reel: detach the audio for $0.01, then one Timeline render with fit blur for $0.10, instead of $1.00 to regenerate.

To turn a 16:9 luggage ad into a 9:16 Reel without regenerating it, put the clip into a Timeline 1.0 render at 1080x1920 with fit: "blur". The clip sits uncropped in the middle of the frame over a blurred copy of itself. If the original is an 8-second Gemini Omni Flash clip at 720p, regenerating it natively in 9:16 costs $1.00, while detaching its audio ($0.01) and rendering a Timeline ($0.10 for the first output minute) costs $0.11.
That arithmetic is worth running before a holiday travel campaign, because a suitcase ad usually needs a landscape version for the site and a vertical one for social, and the second one does not have to be a second generation.
The two paths side by side
Prices are Sume's documented public rates: Omni 720p at $0.125 a second (the $0.10 list times 1.25), audio detach at $0.01 flat, and Timeline at $0.10 per output minute, rounded up. The reserve for a Timeline job is ceil(audio.duration_seconds / 60) minutes, so an 8-second ad reserves one.
| Path | Jobs | Sume price |
|---|---|---|
| Regenerate natively at 9:16 | 1 Omni job, 8 s at 720p | $1.00 |
| Blur-fit the 16:9 clip | 1 audio detach + 1 Timeline render | $0.11 |
| Difference | $0.89 |
Why the spine, and why blur
Timeline needs an audio spine, because the output length comes from audio.duration_seconds, and the spine is also the sound of the render. That is why the detach step is in the plan: Audio detach turns the audio track of one hosted video into a durable wav or mp3, and you pass that file as audio.url with the same duration_seconds as the clip. The alternative, audio.mode: "silence", declares a length with no spine file and gives a silent ad.
The fit modes are cover (the default, which crops), contain (letterbox bars), stretch (distorts, so skip it for luggage) and blur. A suitcase has hard edges and a logo, so cover risks cutting off a wheel or a handle, and bars on a phone look like an unfinished export. Blur keeps the whole product visible.
The blurred backdrop is built from the clip itself, not from a separate asset. If the brand has a strict palette, review one frame of the output before you roll the process out across a catalogue.
- Import the landscape clip and its audio first; every URL in a Timeline body must be this workspace's
media.sume.comartifact or asset, and off-host links fail withunsupported_media_source. - Use the Omni job's returned artifact URL as
source_url, not the URL of a provider. audio.duration_secondsmust be 1 to 1800, and video coverage can stop at most 0.5 seconds before the end of the spine.- Do not send
filtergraph,codecorcrfkeys: the server compiles ffmpeg and answers 400 to them.
The render body
import os
import uuid
import requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
"Idempotency-Key": f"luggage-916-{uuid.uuid4()}"}
body = {
"audio": {
"url": "https://media.sume.com/artifacts/artf_demo/luggage-audio.mp3",
"duration_seconds": 8,
},
"video": [{
"source_url": "https://media.sume.com/artifacts/artf_demo/luggage-169.mp4",
"start": 0,
"duration": 8,
"fit": "blur",
}],
"output": {"width": 1080, "height": 1920, "fps": 24},
}
r = requests.post("https://api.sume.com/v1/timeline-1.0/render", headers=H, json=body, timeout=60)
print(r.status_code, r.json().get("next_action"))
Plan, then check the frame rate
Run POST /v1/timeline-1.0/plan first with the same body. It is unbilled, needs no Idempotency-Key, creates no job, and returns duration_seconds, segment_count, billable_minutes and estimated_cost_usd_micros. A plan cannot predict warnings about padded or looped short sources.
Set output.fps to the rate of the source, or omit it. If your explicit rate differs from the clip's, the job repeats or drops a frame every few frames and reports output_fps_resamples_sources. Probe the clip with Video inspect to read its real rate rather than guessing 30.
Longer ads and many versions
Fit is a per-slot setting, so a longer ad with several clips can blur-fit some and cover others. A render with more than 12 slots is chunked automatically, and render.strategy: "single" above 12 slots is refused with render_strategy_unsafe; the limits are 1 to 200 slots and 1 to 1800 seconds of audio. For a campaign that needs both aspect ratios in several languages, run one render per aspect and language, each priced by its own output minute. The 4:5 on 9:16 note shows the same fit logic with a feed ratio, and the limits post lists every cap.
Sources
Related posts
More in Use cases
- Live transcription for Korean meetings: MAI-Transcribe-2-Streaming
MAI-Transcribe-2-Streaming claims 60 languages with auto detection and about 100ms to first text. Verify Korean yourself. Sume transcribes files, not live.
- Make an AI voice read an email or order code right: spell, verify
Amazon and Cartesia both claim better codes, emails and phone numbers. The reliable fix is text prep plus a read-back check. Try both on Sume's TTS router.
- Mattress Black Friday video ad: a dimmed bedroom clip and a price card
Make a mattress Black Friday ad with AI: one 8-second bedroom clip, a dim pass, and a price-card overlay on top, about $1.12 in Sume jobs.
- Meta ads on phones taller than 9:16: zoom or black bars, plan for both
Meta may zoom a 9:16 ad on taller phones or pad it with black. Keep text in the safe zone for both and test it with a free Sume crop check on a 1080x1920 clip.
Written by Sume