How many Sume jobs can one key poll at once? Reads per minute by plan
Polling every 2 seconds costs 30 reads per job per minute. Divide your plan's read budget by 30 to size the poller: 160 jobs on Free, 1600 on Scale.

Divide your plan's read budget by the reads one job costs per minute. A poller that checks each job every 2 seconds spends 60 / 2 = 30 reads per job per minute. That gives about 160 jobs on Free, 400 on Pro, 800 on Startup and 1600 on Scale, before you leave any room for other reads. The numbers are a ceiling for the status poller alone, so plan for a fraction of them.
The budget by plan
Sume counts every GET and HEAD as a read. Reads have their own budget, which is 40 times the write budget, so polling does not eat into the writes that submit new jobs. Enterprise uses the Scale row until your limits are provisioned.
| Plan | Writes per minute | Reads per minute | Jobs polled every 2 s |
|---|---|---|---|
| Free | 120 | 4800 | 4800 / 30 = 160 |
| Pro | 300 | 12000 | 12000 / 30 = 400 |
| Startup | 600 | 24000 | 24000 / 30 = 800 |
| Scale | 1200 | 48000 | 48000 / 30 = 1600 |
Run the arithmetic
The script divides each plan's read budget by the reads per job. Change pollSeconds to see the effect: at 5 seconds a job costs 12 reads per minute and the Free ceiling rises to 400.
// Reads per minute per plan, from the Sume docs read 2026-10-08
const readsPerMinute = { Free: 4800, Pro: 12000, Startup: 24000, Scale: 48000 };
const pollSeconds = 2; // waitForJob floor
const perJob = 60 / pollSeconds; // reads per job per minute
for (const [plan, reads] of Object.entries(readsPerMinute)) {
console.log(`${plan}: ${reads} / ${perJob} = ${Math.floor(reads / perJob)} jobs`);
}Why the real number is lower
For big batches, the better fix is fewer reads: use webhooks as the main signal and keep a slow poll as a backstop. The webhooks docs list the job.completed, job.failed and job.canceled events. With a webhook per job, a batch of 1000 jobs needs no steady polling at all. Poll once at a slow interval, such as every 30 seconds, to catch a delivery that failed, and each job then costs 2 reads per minute instead of 30. At that rate the Free ceiling would be 4800 / 2 = 2400 jobs.
- The Node SDK waitForJob polls no faster than every 2 seconds, and when the job record carries a longer next_poll_after_seconds, that longer wait wins. Long video jobs usually sit well under the ceiling.
- Your dashboards, list calls and balance checks are reads too. They share the same per-minute budget.
- A 429 names the budget in error.details.scope, read or write. Check it before you decide which budget ran out.
- Sleep until ratelimit-reset or retry-after when you get a 429. Do not retry in a tight loop.
- Pace by the ratelimit-remaining header too. It tells you how much of the current window is left after each response.
Sources
Related posts
More in Developers
- How many minutes of speech fit in one 20,000-character TTS request?
Sume TTS caps a request at 20,000 characters. At 800 to 1,200 characters per minute that is roughly 17 to 25 minutes of audio and costs 95 cents.
- Hy Image 3.5 Preview returns base64 PNG; Sume returns a URL
Moving image code from a base64 PNG response (Hy Image 3.5 Preview on OpenRouter) to Sume means downloading data[].url. A 12-line Python version.
- One idempotency key per prompt row: re-run a 1,000-clip library safely
Derive the Idempotency-Key from every field you send, so a crashed batch can restart without paying twice and a changed row never collides. Python, 17 lines.
- Image 1.0 defaults to low quality; GPT Image 2.5 defaults to high
Same prompt, two Sume routes, two defaults: Image 1.0 omits quality as low, POST /v1/images with GPT Image 2.5 omits it as high. Set quality in both.
Written by Sume