Same prompt on Seedance 2.5, Wan 3.0 and MiniMax H3: compare via API

Submit one 480p prompt to seedance-2.5, wan-3.0 and minimax-h3 with distinct idempotency keys and metadata, then poll all three. A short Python script.

4 min readSume
All posts

To compare video models on your own prompt, submit the same request to seedance-2.5, wan-3.0 and minimax-h3 through POST /v1/video-router/generate, each with its own Idempotency-Key and a metadata tag, at 480p and 5 seconds, then poll the three status URLs. Five seconds is legal on all three, since their minimums are 4, 2 and 5 seconds. The script below does it with requests.

Request fields come from Sume's Video Router docs and API reference; polling follows Jobs and results, read 2026-10-02.

What does the comparison script look like?

It submits in async mode, so each call returns at once with a status_url and result_url. metadata is stored with the Sume job request and is not sent to the provider, so use it to label the run in your own records. It needs SUME_API_KEY in the environment and spends a small amount at 480p.

aspect_ratio is 16:9 for all three; minimax-h3 accepts 480p natively.

import os, time, requests

BASE = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
PROMPT = "A ceramic mug on a wooden desk, steam rising, soft window light."
jobs = {}
for model in ("seedance-2.5", "wan-3.0", "minimax-h3"):
    body = {"model": model, "prompt": PROMPT, "resolution": "480p",
            "duration": 5, "aspect_ratio": "16:9", "mode": "async",
            "metadata": {"test": "mug-ab-1", "model": model}}
    r = requests.post(f"{BASE}/v1/video-router/generate", json=body, timeout=60,
                      headers={**H, "Idempotency-Key": f"mug-ab-1-{model}"})
    r.raise_for_status()
    jobs[model] = r.json()["data"]
for model, d in jobs.items():
    while True:
        s = requests.get(d["status_url"], headers=H, timeout=30).json()
        s = s.get("data", s)
        if s.get("terminal"):
            break
        time.sleep(s.get("next_poll_after_seconds") or 10)
    print(model, s.get("sume_status"), d["result_url"])

What should the three requests share and what must differ?

Share the prompt, resolution, duration and aspect ratio, so the only variable is the model. Differ the Idempotency-Key, since a key reused with a different payload returns 409 idempotency_conflict. Build keys from the test name and model, as the script does, so a rerun of the same test returns the same jobs.

Rerunning with a new prompt needs a new test name.

Per-model limits relevant to a shared request, from the Video Router docs, read 2026-10-02.
Sume idClip length480pAudio field
seedance-2.54-30 sYesgenerate_audio boolean
wan-3.02-30 sYesgenerate_audio boolean
minimax-h35-15 sYes, nativeNative stereo audio, no toggle

How do I judge the three clips?

Write the rubric first: product shape, motion, lighting, audio. Score each clip blind by labeling files A, B and C. Then re-run only the winner at 1080p where it is offered; H3 stops at native 768p.

Keep the result URLs from each job; public results use Sume media URLs rather than provider URLs. For picking by constraints before testing see choosing a video model API.

Keep the experiment small and cheap: one prompt, three models, 480p, 5 seconds. If the three clips are close, choose on clip length and price; if one clearly fails your rubric, drop it and spend your 1080p budget on the other two.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume