Rate Limiting
Understand ConstellationAPI's rate limiting policies and how to handle them.
Rate Limits
Authentication Endpoints
- Limit: 10 requests per 15 minutes per IP
- Endpoints:
/auth/*
Other Endpoints
- Limit: 100 requests per 15 minutes per IP
- Endpoints: All other protected endpoints
Rate Limit Headers
All responses include rate limit information:
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 9
X-RateLimit-Reset: 1640995200
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests allowed in the window |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Unix timestamp when limit resets |
Rate Limit Exceeded
When rate limit is exceeded, you'll receive:
429 Too Many Requests
{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please try again later."
}
}
Handling Rate Limits
Check Headers
const response = await fetch('http://localhost:3007/jira/projects', {
headers: {
'X-API-KEY': 'your-internal-key',
'X-Tenant-Id': 'my-tenant',
},
});
const remaining = response.headers.get('X-RateLimit-Remaining');
const reset = response.headers.get('X-RateLimit-Reset');
if (parseInt(remaining) < 5) {
console.warn('Rate limit low, consider backing off');
}
Exponential Backoff
async function fetchWithBackoff(url, options, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await fetch(url, options);
if (response.status === 429) {
const reset = parseInt(response.headers.get('X-RateLimit-Reset'));
const waitTime = (reset * 1000) - Date.now();
if (waitTime > 0) {
await new Promise(resolve => setTimeout(resolve, waitTime));
continue;
}
}
return response;
}
throw new Error('Max retries exceeded');
}
Best Practices
- Monitor Headers: Check rate limit headers in responses
- Implement Backoff: Use exponential backoff for retries
- Cache Responses: Cache frequently accessed data
- Batch Requests: Combine multiple operations when possible
- Use Webhooks: Prefer webhooks over polling (when available)