REST API rate limits and 429 handling
Owner Priya Iyer · Last updated 2026-03-17 · v2.7
apirate-limit429throttlelimits
REST API rate limits
Per service-account or PAT.
the limits
| Tier | Read req/min | Write req/min |
|---|---|---|
| Free | 60 | 10 |
| Pro | 600 | 60 |
| Scale | 6,000 | 600 |
| Enterprise | custom | custom |
Per minute, sliding window.
headers
Every response includes:
text
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 432
X-RateLimit-Reset: 1713183871X-RateLimit-Reset is Unix seconds.
what 429 looks like
json
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded for this service account.",
"retry_after_ms": 4200,
"request_id": "req_01HK..."
}
}retry_after_ms tells you exactly how long to wait. The HTTP Retry-After header is set to the same value in seconds.
handling
Backoff:
ts
async function call() {
while (true) {
const r = await fetch(url, { headers });
if (r.status !== 429) return r;
const retry = Number(r.headers.get('Retry-After') ?? '1');
await new Promise(res => setTimeout(res, retry * 1000));
}
}The Node SDK (node-sdk) does this for you with jitter.
bulk operations
Importing many monitors at once? Use the bulk endpoints (POST /v1/monitors:bulk) — they count as a single write.
what doesn't count
Health checks (GET /v1/health) and the OAuth token endpoint don't count against the per-key limit. Webhook deliveries (FROM us TO you) are not subject to API limits — those are the webhook-integration.
hitting the ceiling regularly
If you're hitting Pro limits in steady-state, you probably want Scale, or you have a polling loop you should replace with a webhook subscription.