Skip to main content

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
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the window
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix 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

  1. Monitor Headers: Check rate limit headers in responses
  2. Implement Backoff: Use exponential backoff for retries
  3. Cache Responses: Cache frequently accessed data
  4. Batch Requests: Combine multiple operations when possible
  5. Use Webhooks: Prefer webhooks over polling (when available)