REST API v1 · Developers
Rate limits
Limits apply per API key in a fixed one-minute window, sized by the server’s plan. Every authenticated response tells you where you stand, so a well-behaved client never has to guess.
Developer docs
On this page
Limits by plan
| Plan | Requests per minute | Active keys |
|---|---|---|
| Free | 60 | 2 |
| Pro and Network | 600 | 10 |
| White Label | 600 | 40 |
Each key has its own window, so two keys on the same server don’t share a budget. See pricing for the plans.
Rate limit headers
Every authenticated response carries the current state of the window:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1791374460X-RateLimit-Limit— requests allowed per minute for this key.X-RateLimit-Remaining— requests left in the current window.X-RateLimit-Reset— Unix time (seconds) when the window resets.
Over the limit
Over the limit you get 429 RATE_LIMITED with a Retry-After header and a numeric retryAfter field in the body (both in seconds). Wait that long, then retry.
HTTP/1.1 429 Too Many Requests
Retry-After: 18
{ "error": "RATE_LIMITED", "message": "Rate limit of 60 requests per minute exceeded", "retryAfter": 18 }// Wait and retry on 429 / 503, using the server's Retry-After
async function call(url, init, tries = 3) {
for (let attempt = 1; ; attempt++) {
const res = await fetch(url, init);
if ((res.status !== 429 && res.status !== 503) || attempt >= tries) return res;
const seconds = Number(res.headers.get('Retry-After')) || attempt * 2;
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
}
}Repeated requests with invalid keys from one IP address are throttled too: beyond a small number of failures per minute they answer 429 instead of 401.