Reference
Rate Limiting
Rate limits protect the API from abuse and ensure fair usage across all customers.
Limits by plan
| Plan | Requests per minute | Requests per month |
|---|---|---|
| Hobby | 100 | 10,000 |
| Pro | 1,000 | 100,000 |
| Enterprise | Custom | Unlimited |
Rate limit headers
Every response includes:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per minute |
X-RateLimit-Remaining | Remaining requests in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Handling rate limits
When you receive a 429 response, pause requests until the Retry-After header value (in seconds).
async function fetchWithRetry(url, options) {
const res = await fetch(url, options);
if (res.status === 429) {
const retryAfter = res.headers.get('Retry-After');
await new Promise(r => setTimeout(r, retryAfter * 1000));
return fetchWithRetry(url, options);
}
return res;
}
Best practices
- Implement exponential backoff with jitter
- Cache responses when appropriate (use
ETagheaders) - Use persistent connections (HTTP/2 or keep-alive)
- Avoid polling - use webhooks for real-time events