30-second AI video ad: Seedance 2.5 or Wan 3.0, limits side by side

Seedance 2.5 and Wan 3.0 are the two Sume rows that reach 30 seconds. Wan 30 s is $1.88 at 480p, $3.75 at 720p and $7.50 at 1080p; Seedance is billed in tokens.

5 min readSume
All posts

For one 30-second clip on Sume, the choice is seedance-2.5 (4 to 30 seconds) or wan-3.0 (2 to 30 seconds). No other listed row goes past 15 seconds, and Omni stops at 10. Wan 3.0 for 30 seconds costs $1.88 at 480p, $3.75 at 720p and $7.50 at 1080p. Seedance rows are priced per 1,000 video tokens, so its charge shows up in usage.cost after the job rather than as a flat per-second rate.

Limits are from the Video Router guide, read 2026-10-05.

Limits side by side

Sume bills the provider list price times 1.25 and rounds the job up to the cent, so a one-second figure here is a rate, not a charge.

Seedance 2.5 against Wan 3.0 on Sume (read 2026-10-05)
Specseedance-2.5wan-3.0
Clip length4 to 30 s2 to 30 s
Resolutions480p, 720p, 1080p480p, 720p, 1080p
Aspect ratios21:9, 16:9, 4:3, 1:1, 3:4, 9:1616:9, 4:3, 1:1, 3:4, 9:16
Last frameYesYes
Referencesimages, videos, audioimages, videos, audio
AudioYesYes, generate_audio
BillingPer 1,000 video tokensPer second: $0.0625, $0.125, $0.25

A safer way to a 30-second ad

A single 30-second generation is one roll; if the last ten seconds go wrong, you pay for all thirty again. A common alternative is three 10-second clips joined on the timeline, so a bad segment costs one third to redo. The Timeline page covers assembling clips.

If you need 21:9, use Seedance 2.5. If you need a predictable price before you submit, use Wan.

  • Fixed price up front: Wan 3.0.
  • 21:9 ratio: Seedance 2.5.
  • Cheapest 30 s draft: Wan at 480p, $1.88.

Request

A 30-second Wan draft at 480p.

import os, time, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
payload = {
    "model": "wan-3.0",
    "prompt": "A day in the life of a bike courier, morning to night, city streets, upbeat",
    "duration": 30,
    "resolution": "480p",
    "aspect_ratio": "16:9",
}
job = requests.post("https://api.sume.com/v1/videos", headers=H, json=payload).json()
while True:
    time.sleep(30)
    s = requests.get(job["polling_url"], headers=H).json()
    if s["status"] in ("completed", "failed", "cancelled"):
        break
print(s["status"], s.get("unsigned_urls"), s.get("usage"))

Sources

Related posts

More in Comparisons

All Comparisons posts

Written by Sume