Skip to main content

How rate limiting works

Each API key has a configurable rate_limit_per_minute value. The API uses a sliding window algorithm — it tracks requests over a rolling 60-second window rather than fixed clock-minute boundaries.

Default limits

PlanRequests per minute
Default60
Rate limits are set per API key and can be adjusted on request.

Rate limit response

When you exceed your limit, the API returns 429 Too Many Requests:
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Try again later."
  }
}
No credits are deducted for rate-limited requests.

Best practices

  • Cache responses client-side — profile data doesn’t change every second
  • Add delays between requests — spread requests over time rather than bursting
  • Monitor your usage — if you’re frequently hitting 429s, consider requesting a higher limit
  • Use exponential backoff — when you receive a 429, wait increasingly longer before retrying

Example: retry with backoff

async function fetchWithRetry(url, headers, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const res = await fetch(url, { headers });

    if (res.status === 429) {
      const delay = Math.pow(2, i) * 1000;
      await new Promise((r) => setTimeout(r, delay));
      continue;
    }

    return res.json();
  }
  throw new Error("Max retries exceeded");
}