Docs · Reference · Rate limits
Rate limits.
Limits are per API key, counted in a fixed 60-second window. The default budget is 60 requests per minute per key.
How the window works#
The first request on a key opens a 60-second window; every request in that window counts against the key's budget. When the window expires, the count resets in full — there is no gradual token refill. Exceeding the budget returns 429 until the reset.
The limit is stored per key (rate_limit_rpm), so different keys — say, a high-volume backfill key and a low-volume production key — can have different budgets. Need more than 60? Ask at support@whizztech.ai.
Response headers#
Every authenticated response reports where you stand:
HTTP/1.1 200 OK
Content-Type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 57
x-ratelimit-reset: 1751795160| Field | Type | Description |
|---|---|---|
| x-ratelimit-limit | integer | The key's budget per 60-second window. |
| x-ratelimit-remaining | integer | Requests left in the current window. |
| x-ratelimit-reset | unix seconds | When the current window resets and the budget refills. |
| retry-after | seconds | Only on 429: how long to wait before retrying (minimum 1). |
The 429 body uses the standard error envelope with code rate_limit_exceeded.
Best practices#
- Honor retry-after. It is computed from the actual window reset, so waiting exactly that long always succeeds. Minimal client:
async function withRetry(fn, maxRetries = 2) {
for (let attempt = 0; ; attempt++) {
const res = await fn();
if (res.status !== 429 || attempt >= maxRetries) return res;
const retryAfter = Number(res.headers.get("retry-after") ?? 1);
await new Promise((r) => setTimeout(r, retryAfter * 1000));
}
}- Poll with backoff, not a tight loop. A 1-second poll on 10 concurrent jobs is 600 requests/min — 10x the default budget. The backoff pattern in Jobs (1.5s growing to 10s) keeps 10 jobs under 10% of it.
- Prefer webhooks for completion. One
job.succeededdelivery replaces an entire polling session — see Webhooks. - Use Idempotency-Keys on creation. A retry after a timeout then can never double-charge you, which makes aggressive retry policies safe.
- Split keys by workload. Give batch backfills their own key so a burst there can never starve your production traffic.