A 12-minute video job costs 24 status reads at 30 s and 360 at 2 s
Poll cadence arithmetic for Sume video jobs: 30-second polls, the 2-second SDK floor, and the 20-minute client deadline, with a runnable calculation.

A 12-minute video job takes 24 status reads if you poll every 30 seconds, and 360 reads if you poll every 2 seconds. Sume's video guide recommends a moderate interval such as 30 seconds, and the TypeScript SDK uses 2 seconds as a floor that a longer next_poll_after_seconds overrides. The difference is a factor of fifteen in read traffic for the same job.
That factor matters on the days a new model launches and everyone resubmits at once. Read endpoints can be rate limited separately from submits, and Sume describes those limits as poll backpressure, so a tight loop across many jobs spends your read budget on nothing.
The numbers
The arithmetic is 720 / 30 = 24 and 720 / 2 = 360, then 1,200 / 30 = 40 and 1,200 / 2 = 600.
| Interval | Source | Reads in 12 minutes (720 s) | Reads in a 20-minute deadline (1,200 s) |
|---|---|---|---|
| 30 seconds | Video guide best practice | 24 | 40 |
| 2 seconds | SDK pollInterval floor | 360 | 600 |
Run it
The check below prints the same figures, so you can change the minutes and the intervals for your own jobs.
minutes = 12
for label, seconds in (("30 s docs interval", 30), ("2 s SDK floor", 2)):
print(label, minutes * 60 // seconds, "status reads")
print("20 min deadline at 30 s:", 20 * 60 // 30)What the docs say to do instead of a fixed sleep
Video, avatar-video, and face-swap jobs usually outlast the 30-second sync wait, so use async for them and keep the loop in your client.
- Obey
next_poll_after_secondsfrom the submit envelope when it is present, and use exponential backoff when it is not. - Stop on
terminal: true, then fetch the result whenresult_readyis true. - Set the overall deadline in your client. The 20 minutes used by
waitForJobandsubscribeFormatRunis a client default, andwait_timeout_secondsnever exceeds 30. - A client timeout does not cancel the job. The job still runs and still bills, so store the job id.
When to skip polling
Use a webhook if your server can receive one. Send mode: "webhook" with a public HTTPS webhook_url, verify the signature, and keep one slow poll as a backstop for deliveries that never arrive. Webhooks are an optimization, not the only recovery path, so keep the status URL stored with the job id.
Why the wait is not the job
The wait_timeout_seconds field clamps to 0 through 30 and limits how long the submit request blocks, not how long the job takes. Image jobs often finish inside that wait. Video jobs usually do not, so a response with sync.timed_out: true is normal, and the right move is to poll the same job id, never to submit again.
Queued time counts too. On a plan with one processing slot, a job can sit in queued while an earlier job renders, and queued is a normal accepted state. If you size your deadline from render time alone, jobs that waited in line will hit the deadline while still healthy. Add the expected wait to the deadline, or read generation_limits on the submit response to see how much is ahead of you.
Finally, remember that these figures are reads for one job. Multiply by the number of jobs in flight to get your request rate. Twenty jobs at a 2-second interval is ten reads per second, and the same twenty jobs at 30 seconds is less than one read per second.
Sources
Related posts
More in Developers
- A 16-second single take breaks the Recast shot rule: $6.00 to split
H3 Max Recast allows no shot over 15 seconds. Split a 16-second take in two: at 768p that is two 8-second jobs at $3.00 each, $6.00 on Sume.
- A 20 s 9:16 clip: only Wan 3.0 and Seedance 2.5, $2.50 vs $11.56
Only Wan 3.0 and Seedance 2.5 take a 20 s prompt-driven clip on Sume. At 720p, 9:16 that is $2.50 on Wan and $11.56 on 2.5. A Python filter finds them.
- AbortSignal.any: stop a Sume request on SIGTERM or after 5 seconds
Combine a shutdown signal and AbortSignal.timeout with AbortSignal.any, then tell a timeout from a SIGTERM stop on a Sume GET /v1/me call in Node.
- Retry a timed-out Sume Agent Completion without a second run
Send an Idempotency-Key on POST /v1/agent/completions. A retry returns the original receipt with idempotency_hit true; a changed payload returns a 409.
Written by Sume