12 product photos to 4-second clips: price by resolution
Twelve product photos animated into 4-second clips cost $6.00 on Wan 3.0 at 720p. Totals at 480p, 720p and 1080p on Wan 3.0, Omni Flash and Seedance 2.5.

Animating 12 product photos into 4-second clips costs $6.00 on Wan 3.0 at 720p ($0.50 each) and $12.00 at 1080p. Seedance 2.5 at 720p, 9:16 costs $27.7344 for the same set.
The photo is the first frame. You send it in frame_images with frame_type: first_frame, and the estimate depends on the model, the resolution, the seconds and, for Seedance, the aspect ratio.
Twelve clips, nine settings
Each clip is 4 seconds. Total = 12 x clip price. Seedance 2.5 is 9:16 and its 4-second length is its minimum.
| Model | Resolution | One clip | Twelve clips |
|---|---|---|---|
| Wan 3.0 | 480p | $0.25 | $3.00 |
| Wan 3.0 | 720p | $0.50 | $6.00 |
| Wan 3.0 | 1080p | $1.00 | $12.00 |
| Gemini Omni Flash 1.1 | 360p | $0.15 | $1.80 |
| Gemini Omni Flash 1.1 | 720p | $0.50 | $6.00 |
| Gemini Omni Flash 1.1 | 1080p | $0.75 | $9.00 |
| Seedance 2.5 | 480p | $1.0747 | $12.8965 |
| Seedance 2.5 | 720p | $2.3112 | $27.7344 |
| Seedance 2.5 | 1080p | $5.6862 | $68.2344 |
The request
The body follows the OpenRouter-compatible video shape in the docs. Use one idempotency key per photo.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
photos = ["https://example.com/p1.jpg", "https://example.com/p2.jpg"]
for i, url in enumerate(photos, 1):
body = {"model": "wan-3.0", "prompt": "Slow push-in, soft light",
"resolution": "720p", "duration": 4,
"frame_images": [{"type": "image_url", "image_url": {"url": url},
"frame_type": "first_frame"}]}
r = requests.post("https://api.sume.com/v1/videos", json=body, timeout=60,
headers={**H, "Idempotency-Key": f"photo-clip-{i:02d}"})
print(i, r.status_code)What to check
Omni Flash starts at 360p, not 480p, so its first row is 360p. Confirm supported_frame_images includes first_frame for the model in GET /v1/videos/models before a batch. Check that every photo URL is a public HTTPS image, because an unreachable URL fails the job rather than the request (image_not_fetchable).
Start with 480p for a look at motion on three photos: 3 Wan 3.0 clips at 480p cost $0.75. Move to 720p or 1080p once a prompt style works.
- Clips are separate jobs; with a small plan they queue, they do not fail.
- A failed job is released before capture, a completed clip you dislike is spent.
- No v1 model takes a seed, so a re-roll is a new generation.
Sources
Related posts
More in Use cases
- 14-page read-aloud video: per-page TTS, one concat, page-turn offsets
Narrate 14 pages of 160 characters with Sume TTS ($0.11), join for $0.01, set page starts from segments[]. About $0.32 with a 2-minute render.
- 15 thumbnail tests (5 videos x 3 variants): $2.25 at 2K on Sume
Three 16:9 thumbnail variants for each of five videos is 15 images: $1.50 at 1K, $2.25 at 2K or $3.00 at 4K on Nano Banana 2.1 via Sume. YouTube's size rules.
- 150-second YouTube Short from three avatar jobs (60+60+30): cost
A 150-second avatar Short built from 60, 60 and 30 second jobs costs $27.60 at standard video, plus $0.125 music and $0.30 Timeline render.
- A 2-second product hero clip on Wan 3.0 costs $0.125 at 480p
Wan 3.0's shortest clip is 2 seconds: $0.125 at 480p, $0.25 at 720p, $0.50 at 1080p. Here is the price ladder for 2, 3 and 5 seconds.
Written by Sume