A 20 s 9:16 clip: only Wan 3.0 and Seedance 2.5, $2.50 vs $11.56
Only Wan 3.0 and Seedance 2.5 take a 20 s prompt-driven clip on Sume. At 720p, 9:16 that is $2.50 on Wan and $11.56 on 2.5. A Python filter finds them.

Among Sume's prompt-driven video rows, only Wan 3.0 (2 to 30 s) and Seedance 2.5 (4 to 30 s) accept a 20-second clip. Every other text-to-video row stops at 15 seconds, and Gemini Omni Flash 1.1 stops at 10. At 720p and 9:16 the billable price is $2.50 on Wan 3.0 and $11.56 on Seedance 2.5.
Read the limits from the API
GET /v1/videos/models returns supported_durations, supported_aspect_ratios and generate_audio for each model, and the docs say limits differ by model. This filter runs on a response shaped like the documented one; in production replace sample with the real JSON.
sample = {"data": [
{"id": "seedance-2.5", "supported_aspect_ratios": ["9:16", "16:9"],
"supported_durations": list(range(4, 31))},
{"id": "wan-3.0", "supported_aspect_ratios": ["9:16", "1:1"],
"supported_durations": list(range(2, 31))},
{"id": "seedance-2", "supported_aspect_ratios": ["9:16"],
"supported_durations": list(range(4, 16))},
{"id": "gemini-omni-flash-1.1", "supported_aspect_ratios": ["9:16", "16:9"],
"supported_durations": list(range(3, 11))},
]}
def models_for(data, seconds, ratio):
return [m["id"] for m in data["data"]
if seconds in m["supported_durations"]
and ratio in m["supported_aspect_ratios"]]
print(models_for(sample, 20, "9:16"))Price at 20 seconds
Billable prices, which are the provider list price times 1.25 rounded up to the cent.
| Model | 480p | 720p | 1080p |
|---|---|---|---|
| Wan 3.0 | $1.25 | $2.50 | $5.00 |
| Seedance 2.5 | $5.38 | $11.56 | $28.44 |
Why the gap is so wide
Wan 3.0 is billed per second by resolution, so the price is linear: 10 s at 720p is $1.25 and 20 s is $2.50. Seedance 2.5 is billed per 1,000 video tokens at a list price of $0.0214, which is $0.02675 billable before rounding (0.0214 x 1.25). The docs do not give tokens per second, so use the catalog price instead of computing it.
Check the output against the destination too. TikTok's non-Spark ad page allows up to 10 minutes and YouTube Shorts run up to 3 minutes, so a 20-second clip is inside both.
Other ways to reach 20 seconds
If neither row fits, two 10-second clips can be joined in Timeline 1.0 at $0.10 per started output minute, so a 20-second result costs one Timeline minute. On Wan 3.0 two 10 s clips at 720p are 2 x $1.25 = $2.50, plus $0.10 for the join, which is $2.60 and 10 cents more than one 20 s Wan job. On Seedance 2.0 two 10 s clips at 720p would be priced from the 2.0 row; check the catalog for the live number.
The join gives you a cut point and lets a failed half be redone alone, while a single 20 s job keeps the motion continuous across the whole span. Which matters more depends on the shot.
Checking the answer
Run the filter on the live GET /v1/videos/models response and not on a cached list, because the router docs say limits differ by model and the catalog changes. Then look at the price in the same response before you submit.
Why the filter reads the live list
A hard-coded list of models goes stale the day a model is added or its range changes. The Video Router docs describe seedance-2.5 as 4 to 30 seconds, wan-3.0 as 2 to 30 seconds, minimax-h3 as 5 to 15 seconds and every other catalog model as limited to 15 seconds. Two further rows reach 30 seconds but need a source video: Genjutsu Motion Transfer and H3 Max Recast, so neither is a prompt-driven row.
That is why the sample in this post filters on supported_durations and supported_aspect_ratios together. A model that fits the length but not the ratio is not an answer for a vertical ad, and the filter treats it that way.
Sources
Related posts
More in Developers
- AbortSignal.any: stop a Sume request on SIGTERM or after 5 seconds
Combine a shutdown signal and AbortSignal.timeout with AbortSignal.any, then tell a timeout from a SIGTERM stop on a Sume GET /v1/me call in Node.
- Retry a timed-out Sume Agent Completion without a second run
Send an Idempotency-Key on POST /v1/agent/completions. A retry returns the original receipt with idempotency_hit true; a changed payload returns a 409.
- Agent Completions 403 insufficient_scope: old key or service account?
A 403 insufficient_scope on POST /v1/agent/completions has two causes: a key made before the feature, or a service-account key. details.reason tells which.
- Agent Completions model field is sume-agent only: no Haiku or GLM
You cannot choose Claude Haiku 5.5 or GLM 5.3 in the Agent Completions model field. Sume accepts sume-agent and returns 400 for anything else.
Written by Sume