Skip to main content

Default limits

Each API key is rate-limited to 60 requests per minute using a sliding window.
LimitValue
Requests per minute60
Window1 minute (sliding)
ScopePer API key
Rate limits are tracked per key, not per team. If you have multiple keys, each gets its own 60 req/min allowance.

Rate limit headers

When you hit the rate limit, the API returns:
{
  "error": "Rate limit exceeded"
}
With the following header:
HeaderDescription
Retry-AfterSeconds until the rate limit resets

Handling rate limits

async function callWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.status === 429) {
      const retryAfter = parseInt(response.headers.get("Retry-After") || "5");
      await new Promise((r) => setTimeout(r, retryAfter * 1000));
      continue;
    }

    return response;
  }

  throw new Error("Max retries exceeded");
}

Best practices

  • Spread requests evenly — avoid bursting 60 requests at once and then waiting
  • Use exponential backoff — when retrying after a 429, increase the wait time with each retry
  • Use separate keys for separate services — if you have multiple integrations, create a key for each to get independent rate limits