Sume video pricing fields: list_basis and billable_margin
How to read the pricing object on a Sume video model: per second, by resolution, or per 1,000 video tokens, and why to read billable_margin, not hard-code 1.25.

Every row in Sume's video catalog carries a pricing object, and the same fields drive the reserve on submit. If you compute a quote in your own code, read these fields rather than copying numbers from a blog post, including this one. The docs say billable amounts are the provider list times 1.25 on every row, but the per-row truth is the billable_margin field.
What are the list bases?
Three bases exist today, and the one a row uses decides which other fields appear.
| list_basis | Rows | What you multiply |
|---|---|---|
per_second | Kling Video v3 Pro, Grok Imagine Video 1.5 | Seconds times the per-second list, with audio on and off rates for Kling |
per_second_by_resolution | Wan 3.0, MiniMax H3, H3 Max, Gemini Omni Flash 1.1, H3 Max Recast, Genjutsu | Seconds times the rate for the chosen resolution |
| Per 1,000 video tokens | Seedance 2.5 and 2.0 family | Tokens, not seconds; read the finished job |
How do I turn the fields into a quote?
For a per-second row, multiply the list rate by billable_margin and by the seconds, and round up to the cent. For Wan 3.0 at 720p, the list is $0.10 per second, so a 10-second clip is 0.10 x 1.25 x 10 = $1.25. That is the amount reserved on submit; the final figure is usage.cost on the finished job.
The /v1/videos catalog exposes the same numbers as pricing_skus, rendered as decimal-USD strings the way OpenRouter renders them. The two catalogs are projections of one record, so they cannot disagree.
Why not hard-code 1.25?
Because the margin has changed before. A code comment in the catalog notes that H3 Max was once sold at a different multiple than the other rows, until it was brought in line. A client that reads billable_margin per row picks up any future change without a release.
Sources
Related posts
More in Developers
- Sume video submit 415: send JSON and pass images as URLs
POST /v1/videos answers 415 unsupported_media_type when the body is not application/json. How to read details.received_content_type and send frames as URLs.
- Sume video sync submit: timed_out and capacity_exhausted flags
A sync submit returns 2xx with a job id even when the wait runs out. What the sync object says and what to do next.
- Sume webhooks plus a sweeper: recover jobs whose callback never came
Webhook delivery can fail after 10 attempts while the Sume job still finishes. Run a sweeper that polls jobs stuck non-terminal in your own table.
- SvelteKit +server.js endpoint to verify a Sume webhook signature
A SvelteKit +server.js POST handler gets a Fetch Request, so request.text() gives the raw body Sume signs. Verify the HMAC, then handle job.completed.
Written by Sume