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
- 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.
- Video inspect fast seek: requested_times vs sample_times
A fast-seek inspect grid returns requested_times and sample_times. Use sample_times for what the tiles show, then trim from them, never from the request.
Written by Sume