Rate Limits
API requests are rate limited to ensure fair usage and platform stability.
Default Limits
| Plan | Requests per minute | Requests per day |
|---|---|---|
| Starter | 60 | 10,000 |
| Professional | 300 | 100,000 |
| Enterprise | Custom | Custom |
Rate Limit Headers
Every response includes rate limit information:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 299
X-RateLimit-Reset: 1640995200
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window |
X-RateLimit-Remaining | Remaining requests in window |
X-RateLimit-Reset | Unix timestamp when limit resets |
Handling Rate Limits
When you exceed the rate limit, you'll receive a 429 response:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests",
"retryAfter": 30
}
}
Best Practices
- Implement exponential backoff when receiving 429 responses
- Cache responses where appropriate
- Use webhooks instead of polling for status updates
- Batch requests when possible
async function requestWithRetry(url: string, options: RequestInit, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || '30';
await sleep(parseInt(retryAfter) * 1000);
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}