Get started
Rate limits
Each API key can make 600 requests per minute. Every response tells you where you stand.
Limits
Requests are counted per API key in one-minute windows: up to 600 requests per minute per key. Keys don’t share a budget, so a busy sync can’t slow down your other integrations — another reason to give each integration its own key.
Rate-limit headers
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed per window (600). |
X-RateLimit-Remaining | Requests left in the current window. |
X-RateLimit-Reset | When the window resets, in Unix seconds. |
Retry-After |
On 429 responses: seconds to wait before retrying.
|
When you hit the limit
Requests over the limit answer 429 Too Many Requests and do nothing:
HTTP/1.1 429 Too Many RequestsContent-Type: application/jsonRetry-After: 12X-RateLimit-Limit: 600X-RateLimit-Remaining: 0X-RateLimit-Reset: 1791836532X-Rabbitblaze-Version: 2026-10-01 { "error": { "retryAfter": 12, "code": "rate_limited", "message": "Too many requests. Try again shortly." }}
Wait Retry-After seconds, then retry. For bulk jobs, slow down before you hit the limit by
watching
X-RateLimit-Remaining, and prefer webhooks to polling.
async function request(url, options, attempt = 0) { const res = await fetch(url, options) if (res.status === 429 && attempt < 5) { const seconds = Number(res.headers.get("Retry-After") ?? 1) await new Promise((resolve) => setTimeout(resolve, seconds * 1000)) return request(url, options, attempt + 1) } return res} import time def request(session, method, url, attempt=0, **kwargs): res = session.request(method, url, **kwargs) if res.status_code == 429 and attempt < 5: time.sleep(int(res.headers.get("Retry-After", "1"))) return request(session, method, url, attempt + 1, **kwargs) return res