Read your Sume plan from ratelimit-limit on a GET: 4,800 to 48,000
A GET /v1/balance returns ratelimit-limit. 4800, 12000, 24000 or 48000 reads a minute maps to Free, Pro, Startup or Scale, and a full Wan 720p queue reserve.

Call GET /v1/balance with curl -i and read ratelimit-limit: 4800 reads a minute is Free, 12000 is Pro, 24000 is Startup and 48000 is Scale. The read budget is 40 times the write budget, so the same number tells you the writes (120 to 1200 a minute) and the generation queue behind them.
One header, the whole plan
A read is free to repeat and does not start a paid job, so use it for the check instead of a POST. The headers on every response are ratelimit-limit, ratelimit-remaining, ratelimit-reset and, on a 429, retry-after. Enterprise uses the Scale row until limits are provisioned.
The last column is what a full queue of 30 s Wan 3.0 clips at 720p ($3.75 each) reserves: accepted jobs times $3.75.
| Plan | Reads per min | Writes per min | Accepted jobs | Full-queue reserve |
|---|---|---|---|---|
| Free | 4800 | 120 | 6 | $22.50 |
| Pro | 12000 | 300 | 24 | $90.00 |
| Startup | 24000 | 600 | 48 | $180.00 |
| Scale | 48000 | 1200 | 120 | $450.00 |
Read it
Do not hardcode the table in production; use it to pick sensible defaults and trust the live header.
import os
import requests
PLAN = {4800: "Free", 12000: "Pro", 24000: "Startup", 48000: "Scale"}
r = requests.get(
"https://api.sume.com/v1/balance",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
timeout=30,
)
limit = int(r.headers["ratelimit-limit"])
print(limit, PLAN.get(limit, "custom"), "writes/min:", limit // 40)Gotchas
An admin override changes concurrency (limit_source says plan or admin_override in generation_limits), so a custom number is possible. Unauthenticated per-IP traffic gets a 4x read budget, so a request without a key shows a different number.
Generation admission is separate from the rate limit: Free runs 1 job at a time with 5 queued, and the 7th paid submit gets 429 queue_full even though 120 writes a minute remain.
Sources
Related posts
More in Developers
- Remote MCP with an API key: x-api-key or Bearer on Sume?
Sume's hosted MCP accepts a key as Authorization: Bearer or as x-api-key. Both see the full tool set; writes and paid calls still need an idempotency_key.
- Replay a sume/auto video submit with one key, assert one job
Submit model sume/auto twice with the same Idempotency-Key and assert the same job id and the same route. Why a replay is safe and why Sume hides the family.
- Resume a Sume job wait after SumeJobTimeoutError in TypeScript
A 30-second Seedance 2.5 clip can outlast one waitForJob call. Call it again with the same job id on timeout or a transient read error. Never resubmit.
- Resume polling Sume video jobs after a restart with a sqlite ledger
Write the job id and Idempotency-Key to sqlite before anything else can crash, then resume polling open jobs on start. Python standard library only.
Written by Sume