Getting Started

Rate Limits

The API is rate limited to keep it fast and fair for everyone. Limits are applied per API key.

The limit

Each key may make up to 1,000 requests per 60 seconds. The window is rolling. When you exceed it, the API responds with 429 Too Many Requests and a Retry-After header.

Design for limits, not against them

Cache responses you read often, batch where the API allows it, and prefer webhooks over polling so you only call the API when something actually changes.

Response headers

Every response carries your current rate-limit state:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetUnix timestamp (seconds) when the window resets and the count returns to the full limit.
Retry-AfterSeconds to wait before retrying. Sent on 429 responses.
Example response headers
HTTP/1.1 200 OK
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 994
X-RateLimit-Reset: 1781000460

Handling 429

When you receive a 429, wait for the period in Retry-After and retry with exponential backoff plus jitter.

429 Too Many Requests
{
  "statusCode": 429,
  "message": "ThrottlerException: Too Many Requests",
  "error": "Too Many Requests"
}
async function request(url, options = {}, attempt = 0) {
  const res = await fetch(url, options);
  if (res.status !== 429) return res;

  const retryAfter = Number(res.headers.get("Retry-After")) || 1;
  // Exponential backoff with jitter, capped at 30s.
  const backoff = Math.min(retryAfter * 1000 * 2 ** attempt, 30_000);
  const jitter = Math.random() * 250;
  await new Promise((r) => setTimeout(r, backoff + jitter));

  if (attempt >= 5) throw new Error("Rate limit: retries exhausted");
  return request(url, options, attempt + 1);
}

See also the full Errors reference.