Turn six product stills into a 30-second vertical video
When 12 million AI listings share the same still images, a short video stands out. Stitch six stills into a 1080x1920 clip with Sume Timeline 1.0 for $0.10.

To turn a handful of product stills into a vertical video, import the images into Sume, then call POST /v1/timeline-1.0/render with audio.mode set to silence, a 30-second duration and one video slot per still. The default output is a 1080 by 1920 MP4, and a job up to one minute costs $0.10.
The reason to do it: Amazon says independent sellers created more than 12 million AI-generated listings in 2025 (read 2026-10-04). When many listings lean on the same kind of still, motion is one cheap way to look different.
Can Timeline use still images?
Yes. The docs say a video slot's source_url can be a Sume-hosted clip or still, and stills are static holds. A motion setting on a still is accepted and ignored with a motion_ignored warning, so do not expect a zoom.
| Item | Value |
|---|---|
| audio.duration_seconds | 1 to 1800; sets output length |
| audio.mode | silence for a declared length with no audio file |
| video[] | 1 to 200 slots; video[0].start must be 0 |
| video[].fit | cover (default), contain, stretch or blur |
| transition | fade, wipeleft, wiperight, slideup, slidedown or dissolve; up to 1 s |
| Default output | 1080 by 1920 MP4 |
| Price | $0.10 per rounded-up output minute |
What does the call look like?
Six slots of five seconds fill thirty. Every URL must already be on Sume's media host, so import first with POST /v1/media-imports, and send an Idempotency-Key.
import os, requests
stills = ["https://media.sume.com/artifacts/artf_demo/s%d.png" % i for i in range(1, 7)]
slots = []
for i, url in enumerate(stills):
slot = {"source_url": url, "start": i * 5, "duration": 5, "fit": "cover"}
if i:
slot["transition"] = {"type": "fade", "duration": 0.25}
slots.append(slot)
r = requests.post(
"https://api.sume.com/v1/timeline-1.0/render",
headers={
"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
"Idempotency-Key": "slideshow-sku-1001-v1",
},
json={"audio": {"mode": "silence", "duration_seconds": 30}, "video": slots},
timeout=60,
)
print(r.status_code, r.text[:300])
How can you check the plan before paying?
The docs describe a plan step that returns billable_minutes and estimated_cost_usd_micros without creating a job or reserving credits, and without an Idempotency-Key. Use it when a batch will run many renders.
What makes the video worth watching?
Order the stills like an argument: the whole product, then use, then detail, then what is in the box. Each should be a true picture of the item. Add on-screen text with authored caption cues, and check the clip's length against the channel's current limits.
Sources
Related posts
More in Media tools
- Upscale before or after an image edit? Order and cost on Sume
Edit at working size, then upscale once. Sume's image upscale reserves 20 cents per image, so upscaling between every pass multiplies the bill.
- Video analyses: include_transcript false leaves scene audio null
On the legacy Sume video-analyses resource, scene audio is null unless include_transcript was true. Handle both shapes, and know what replaces it for new work.
- Video analyses keyframes: one still per second per scene
A legacy Sume video analysis gives a still for each whole second of a scene plus a keyframe_url near 40%. How stills fail and how to pick your own cover.
- Video filter /check: submit or fix and recheck
POST /v1/video-filter/check is unbilled and returns valid, diagnostics and a next_action of submit_video_filter or fix_program_and_recheck. Branch on it.
Written by Sume