Get started
Rate limits
Per-tier limits — both requests-per-minute (RPM) and requests-per-day (RPD).
| Tier | RPM | RPD | Credits/month |
|---|---|---|---|
| Free | 30 | 1,000 | 1,000 |
| Starter | 120 | 20,000 | 10,000 |
| Pro | 600 | 100,000 | 50,000 |
| Enterprise | Custom | Custom | Custom |
Response headers
Every response includes these headers — use them to track remaining quota.
HTTP/2 200
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 117
x-ratelimit-reset: 1746788400
x-request-id: req_a1b2c3d4- x-ratelimit-limit — RPM ceiling for the current tier
- x-ratelimit-remaining — calls left in this minute window
- x-ratelimit-reset — UNIX timestamp when the window refills
- x-request-id — opaque ID — pass it to support to debug a specific call
Handling 429 Too Many Requests
Responses include Retry-After in seconds — recommended pattern is exponential backoff (1s, 2s, 4s, 8s) before giving up.
// Exponential backoff on 429
async function callWithRetry(url: string, init: RequestInit, max = 4) {
let attempt = 0
while (true) {
const res = await fetch(url, init)
if (res.status !== 429) return res
if (attempt >= max) return res
const retryAfter = Number(res.headers.get('Retry-After') ?? 1)
const waitMs = (retryAfter || 2 ** attempt) * 1000
await new Promise((r) => setTimeout(r, waitMs))
attempt++
}
}