Guides / Rate limits
Rate limits
Each key is capped at 100 requests/second and 10,000 requests/day. Above this we return 429.
Caps
| Scope | Limit | Window |
|---|---|---|
| Per key | 100 | 1 second (sliding) |
| Per key | 10,000 | 24 hours (calendar) |
| Per account | 1,000 | 1 second (sliding, aggregate) |
Response headers
Every authenticated response includes:
http
HTTP/1.1 200 OK X-RateLimit-Limit-Second: 100 X-RateLimit-Remaining-Second: 87 X-RateLimit-Limit-Day: 10000 X-RateLimit-Remaining-Day: 9412 X-RateLimit-Reset-Day: 1716988860 # unix seconds (next UTC midnight) # On 429: # Retry-After: 1 # seconds until the relevant bucket replenishes
Backoff strategy
On 429, read the Retry-After header (seconds). If absent, use exponential backoff with jitter: min(2^n * 100ms, 30s) + rand(0, 250ms). Cap at 5 retries.
Node — fetch wrapper
async function callWithBackoff(req, { max = 5 } = {}) { for (let n = 0; n <= max; n++) { const r = await fetch(req); if (r.status !== 429 && r.status < 500) return r; const retryAfter = Number(r.headers.get('retry-after')); const delay = retryAfter ? retryAfter * 1000 : Math.min(2 ** n * 100, 30_000) + Math.random() * 250; await new Promise(res => setTimeout(res, delay)); } throw new Error('exhausted retries'); }