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:

Response headers
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
429 Too Many Requests
{  "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