Rate Limits
AlertifyPro enforces rate limits on all API endpoints to ensure fair usage and platform stability.
Limits by plan​
| Plan | Requests / minute | Requests / day | Burst |
|---|---|---|---|
| Free | 30 | 1,000 | 50 |
| Starter | 60 | 10,000 | 100 |
| Professional | 300 | 100,000 | 500 |
| Enterprise | Custom | Custom | Custom |
Limits are applied per API key, not per IP address.
Rate limit headers​
Every API response includes rate limit information:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 247
X-RateLimit-Reset: 1709337600
X-RateLimit-Window: 60
| Header | Description |
|---|---|
X-RateLimit-Limit | Total requests allowed in the window |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
X-RateLimit-Window | Window duration in seconds |
Handling rate limit errors​
When rate limited, AlertifyPro returns 429 Too Many Requests:
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Retry after 2026-03-02T14:24:00Z.",
"retry_after": "2026-03-02T14:24:00Z",
"status": 429
}
}
Best practices​
Implement retry with backoff​
async function apiRequest(url: string, retries = 3): Promise<Response> {
for (let attempt = 0; attempt <= retries; attempt++) {
const res = await fetch(url, { headers: { Authorization: `Bearer ${API_KEY}` } });
if (res.status === 429) {
const resetAt = res.headers.get('X-RateLimit-Reset');
const waitMs = resetAt ? (Number(resetAt) * 1000 - Date.now()) : (2 ** attempt * 1000);
await new Promise(r => setTimeout(r, Math.min(waitMs, 30_000)));
continue;
}
return res;
}
throw new Error('Rate limit retries exhausted');
}
Cache responses​
Avoid re-fetching the same data repeatedly. Cache monitor status and uptime data locally for at least 30 seconds.
Use webhooks instead of polling​
Instead of polling /v1/monitors repeatedly, configure webhooks to receive real-time events.
Enterprise rate limits​
Enterprise customers can request increased rate limits or dedicated API capacity. Contact [email protected].