Skip to main content

Rate Limiting

Understanding and working with API rate limits.

Overview

Rate limits prevent abuse and ensure fair resource allocation. Limits vary by user role and are enforced per minute.

Limits by Role

  • Standard users: 100 requests per minute
  • Premium users: 500 requests per minute
  • Admin users: 1000 requests per minute

Rate Limit Headers

All responses include rate limit information:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1704110400
  • X-RateLimit-Limit: Maximum requests allowed
  • X-RateLimit-Remaining: Remaining requests in current window
  • X-RateLimit-Reset: Unix timestamp when limit resets

Handling Rate Limits

Check Headers

const response = await fetch(url, options);
const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'));
const resetTime = parseInt(response.headers.get('X-RateLimit-Reset'));

if (remaining < 10) {
// Approaching limit, slow down
const waitTime = (resetTime * 1000) - Date.now();
await new Promise(resolve => setTimeout(resolve, waitTime));
}

Handle 429 Responses

When rate limit is exceeded:

{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please try again later.",
"details": {
"limit": 100,
"reset_at": "2024-01-15T10:30:00Z"
}
}
}

Exponential Backoff

async function fetchWithRetry(url, options, 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') || Math.pow(2, i);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}

return response;
}
throw new Error('Max retries exceeded');
}

Best Practices

  1. Monitor headers: Always check X-RateLimit-Remaining
  2. Implement backoff: Use exponential backoff on 429 responses
  3. Cache responses: Cache static data to reduce API calls
  4. Batch requests: Combine operations when possible
  5. Use WebSockets: For real-time updates, prefer WebSocket over polling

See Also