Rate limits
How many requests you may make, how to see where you stand and how to back off gracefully.
Limits
| Limit | Amount | Description | Window (seconds) |
|---|---|---|---|
key_minute | 120 | requests per minute for this key | 60 |
company_minute | 300 | requests per minute for this company | 60 |
company_writes | 60 | write actions per minute for this company | 60 |
company_heavy | 10 | heavy actions per minute for this company | 60 |
company_day | 50.000 | requests per day for this company | 86400 |
auth_failures | 20 | failed sign-ins per minute from this IP address | 60 |
The per-company limit applies to all keys of your company together. Write actions (POST, PATCH, DELETE) also count towards the write limit. Need more on a structural basis? Contact support.
Headers
Every response tells you where you stand:
| Header | Meaning |
|---|---|
RateLimit-Policy |
All limits that apply to this request |
RateLimit |
Remaining requests and seconds until the reset, for the tightest limit |
X-RateLimit-Limit |
Size of the tightest limit |
X-RateLimit-Remaining |
Still available in the current window |
X-RateLimit-Reset |
Unix time at which the window starts again |
On a 429
A 429 rate_limited has a Retry-After header with the number of seconds you have to wait. The limit field in the response names the limit you hit.
async function request(url, options, attempt = 0) {
const response = await fetch(url, options);
if (response.status === 429 && attempt < 5) {
const seconds = Number(response.headers.get('Retry-After') ?? 1);
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
return request(url, options, attempt + 1);
}
return response;
}Tip
Spread large synchronisations over time and use limit=100, so you fetch more with fewer requests.
Last updated on September 14, 2026