A 20-second 1080p Wan 3.0 job holds $5.00: what returns if it fails

A 20-second Wan 3.0 job at 1080p reserves $5.00 at submit. A successful job captures it; failed jobs release or refund the reservation where applicable.

4 min readSume
All posts

A 20-second Wan 3.0 job at 1080p reserves $5.00 at submit, and a successful completion captures it. The docs say failed jobs and failed queue admission release or refund the reservation where applicable, so a failure is not a bill (read 2026-10-09).

What the hold is

Sume reserves the estimated amount when it accepts the request: list price times 1.25. For Wan 3.0 that equals the per-second rate times the length, so you can compute the hold before you submit.

Wan 3.0 reservation at submit, customer USD (read 2026-10-09). Hold = per-second rate x seconds.
Length720p hold1080p hold
10 s$1.25$2.50
20 s$2.50$5.00
30 s$3.75$7.50

Check the outcome

Poll to a terminal state, then read usage.cost on success or error on failure. Retrying a failed submit with the same Idempotency-Key makes the retry safe.

import os, time, requests

API = "https://api.sume.com/v1/videos"
H = {"Authorization": "Bearer " + os.environ["SUME_API_KEY"]}
body = {"model": "wan-3.0", "prompt": "Time-lapse of a city crossing at night, rain on asphalt, neon reflections", "duration": 20, "resolution": "1080p", "aspect_ratio": "16:9"}
job = requests.post(API, headers={**H, "Idempotency-Key": "city-night-001"}, json=body, timeout=60).json()
deadline = time.time() + 1800
while time.time() < deadline:
    time.sleep(30)
    job = requests.get(job["polling_url"], headers=H, timeout=60).json()
    if job["status"] == "completed":
        print(job["unsigned_urls"][0], job["usage"]["cost"])
        break
    if job["status"] in ("failed", "cancelled"):
        print(job["status"], job.get("error"))
        break

Planning balance for a batch

If you send five 20-second 1080p jobs at once, the reservation is 5 x $5.00 = $25.00. At 720p it is $12.50.

A job that fails releases its hold where applicable, so the balance recovers. A job that completes converts the hold into the final charge shown in usage.cost.

The practical rule is simple. Keep the balance above the sum of all in-flight holds, poll to terminal states, and read usage.cost after each success. If a submit returns 402, the balance is too low for the new hold, not for the jobs already running.

Cancel and 402

  • Cancel with POST /v1/jobs/{id}/cancel works only before generation starts. After that it returns 409 job_generation_already_started.
  • A balance below the hold returns 402 insufficient_credits: you need $5.00 free for this job, not $0.
  • Several jobs in flight multiply the hold: ten 20-second 1080p jobs reserve $50.00 together.
  • Reservation behavior for each case is described in the generation admission docs; read them before building automatic retries.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume