Looping product banner: same photo as first and last frame
Pin one product photo as both first_frame and last_frame on seedance-2 so a short clip ends where it started, then loop it in a hero banner or a story.

To make a looping product banner, send the same photo twice in frame_images to POST /v1/videos on seedance-2, once as first_frame and once as last_frame. The model animates between two identical frames, so the clip ends where it began and repeats without a visible jump. The catalog lists both frame types for the model.
Why this works
seedance-2 lists first_frame and last_frame in supported_frame_images. When you pin both, the model has to leave the packshot and come back to it. Anything that moves, such as steam, light or a slow rotation, returns to the start pose at the end of the clip.
A loop is a good fit for a hero banner or an in-feed unit, where a short clip repeats. Pick a short duration. A 4 to 6 second clip is easier to keep clean than a long one.
The request
Use the same URL for both frames. The prompt asks for a motion that can return, such as a slow breathing zoom, drifting light or a gentle sway.
curl -X POST https://api.sume.com/v1/videos \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: banner-loop-sku-77" \
-d '{
"model": "seedance-2",
"prompt": "Soft light drifts across the product, steam curls up, then settles",
"duration": 5,
"aspect_ratio": "16:9",
"frame_images": [
{"type": "image_url", "image_url": {"url": "https://example.com/p77.jpg"}, "frame_type": "first_frame"},
{"type": "image_url", "image_url": {"url": "https://example.com/p77.jpg"}, "frame_type": "last_frame"}
]
}'What to check
Play the clip on repeat before you publish. A loop fails in the middle if the model drifts away from the product, and it fails at the seam if the audio does not match. If the model generates audio, decide whether the loop should be silent.
The catalog tells you which models accept which frame types, so read supported_frame_images before you switch models. A model that lists only first_frame cannot close a loop this way.
| Setting | Value |
|---|---|
| Model | seedance-2 |
| Frame types | first_frame, last_frame |
| Durations | 4 to 15 seconds |
| Aspect ratios | 21:9 to 9:16 |
Make it fit the slot
Banners are rarely 16:9. If the slot is a different shape, request the closest supported aspect ratio and crop in the page, or use a Timeline render with cover, contain or blur to fit a canvas.
Sources
Related posts
More in Use cases
- Search a podcast archive for a phrase and jump to the time: STT words
Transcribe episodes with Sume STT, keep words[] with start times in a small index, and find any phrase with a mm:ss link. Python, about 60 cents per hour.
- Swap the seasonal dish in a restaurant clip with Omni Flash edit
Keep one good restaurant clip and edit the dish for each holiday special with Gemini Omni Flash 1.1 video_to_video: $0.125 per output second at 720p.
- Seedance 2.5 takes 30 image references per pass: a shot-list ad
ByteDance lists 30 images, 10 clips and 10 audio files per Seedance 2.5 pass. How to turn a shot list into one seedance-2.5 request on Sume, with limits.
- Go past 30 s with Seedance 2.5 on Sume: hand off the last frame
Seedance 2.5 extends clips in rounds on the vendor side. On Sume, pull a late frame with video frames, feed it to the next job as a first frame, then join.
Written by Sume