Guides
Rate limits
Per-key quotas, the headers that report them and how to back off.
Requests are limited per API key, over a window of 60 seconds.
| Key | Requests per minute |
|---|---|
| Sandbox | 100 |
| Live, Launch plan | 100 |
| Live, Growth plan | 600 |
| Live, Enterprise plan | 3,000 |
Headers#
Every authenticated response tells you where you stand:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Quota of the current window. |
X-RateLimit-Remaining | Requests left in the window. |
X-RateLimit-Reset | Seconds before the quota renews. |
Retry-After | On 429 only: seconds to wait before retrying. |
When you go over#
The API answers 429 with error.code = "rate_limit_exceeded" and a Retry-After header. Wait that many seconds, then retry. Spread your calls rather than bursting, and prefer a single call that returns a page of 100 items over many calls that return one.
async function callWithRetry(url, init, attempts = 4) {
for (let i = 0; i < attempts; i++) {
const res = await fetch(url, init)
if (res.status !== 429 && res.status < 500) return res
const wait = Number(res.headers.get('Retry-After')) || 2 ** i
await new Promise((r) => setTimeout(r, wait * 1000))
}
throw new Error('Too many retries')
}When retrying a POST, reuse the same Idempotency-Key so the operation cannot run twice. Need a higher quota? It follows your plan: see Pricing and limits.