Limits by plan
| Plan | Requests / min | Calls / month | Burst |
|---|---|---|---|
| Free | 60 | 5,000 | 10 |
| Pro | 600 | 250,000 | 100 |
| Scale | 3,000 | 2,000,000 | 500 |
| Enterprise | Custom | Unlimited | Custom |
Response headers
Every response includes headers describing your current limit state:
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 418
X-RateLimit-Reset: 1723651200Handling 429s
When you exceed a limit you'll receive a 429 with a Retry-After header. Back off and retry:
backoff.ts
async function withRetry(fn: () => Promise<Response>, max = 5) {
for (let i = 0; i < max; i++) {
const res = await fn()
if (res.status !== 429) return res
const wait = Number(res.headers.get("Retry-After") ?? 2 ** i)
await new Promise((r) => setTimeout(r, wait * 1000))
}
throw new Error("rate limited")
}