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.

5 min readSume
All posts

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.

Luggage ad, 8 seconds, vertical version (read 2026-10-05)
PathJobsSume price
Regenerate natively at 9:161 Omni job, 8 s at 720p$1.00
Blur-fit the 16:9 clip1 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.com artifact or asset, and off-host links fail with unsupported_media_source.
  • Use the Omni job's returned artifact URL as source_url, not the URL of a provider.
  • audio.duration_seconds must be 1 to 1800, and video coverage can stop at most 0.5 seconds before the end of the spine.
  • Do not send filtergraph, codec or crf keys: 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

All Use cases posts

Written by Sume