Rate Limits
Two layers
Section titled “Two layers”- Per-IP — applied at the edge before auth. Default: 2000 req / 60s per IP.
- Per-key — applied after auth. Configurable per key (RPS / daily / monthly).
If either limit fires, the response is 429 with body:
{ "success": false, "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Too many requests. Please retry after 42 seconds." }}Reading the headers
Section titled “Reading the headers”Every response (success or rate-limited) carries:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The active limit for this scope |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait (only on 429) |
Handling 429 in code
Section titled “Handling 429 in code”async function call() { const r = await fetch(url, { headers: { "x-api-key": key } }); if (r.status === 429) { const wait = Number(r.headers.get("Retry-After") ?? 1); await new Promise((res) => setTimeout(res, wait * 1000)); return call(); } return r.json();}Raising your limit
Section titled “Raising your limit”Per-key limits are configured per plan. Contact support if your production load needs more.