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.

5 min readSume
All posts

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.

20-second clip, 9:16, billable, as of 2026-10-08
Model480p720p1080p
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

All Developers posts

Written by Sume