Clarify API
API Basics

Rate limits

API request limits, rate-limit headers, and retry guidance

The Clarify API enforces a per-workspace rate limit. It's high enough that normal integration traffic rarely reaches it. It exists to protect the platform from runaway loops and accidental request floods.

Limit

3,000 requests per minute, per workspace, per endpoint. Each endpoint has its own budget, so heavy traffic against one endpoint doesn't throttle your requests to others.

The window is a rolling 60 seconds; once it resets, your full allowance is available again. When you exceed the limit, the API responds with 429 Too Many Requests until the window resets.

Rate-limit headers

Responses include headers describing your remaining budget:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the window (3000)
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetSeconds until the window resets

A 429 response adds one more:

HeaderDescription
Retry-AfterSeconds to wait before retrying

Handling 429 responses

A throttled request returns the standard error format:

{
  "errors": [
    {
      "status": "429",
      "detail": "API rate limit exceeded"
    }
  ]
}

Wait for the number of seconds in Retry-After, then retry. If the header is missing, fall back to exponential backoff:

async function fetchWithRetry(url, options, retries = 3) {
  for (let attempt = 0; attempt <= retries; attempt++) {
    const res = await fetch(url, options);
    if (res.status !== 429) {
      return res;
    }
    if (attempt === retries) {
      break;
    }

    const retryAfter = Number(res.headers.get("Retry-After"));
    const delaySeconds =
      Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : 2 ** attempt;

    await new Promise((resolve) => setTimeout(resolve, delaySeconds * 1000));
  }

  throw new Error("Still rate limited after retries");
}

High-volume writes

For large imports, use the bulk endpoints: sending one request with many records instead of one request per record keeps you well under the per-endpoint limit and is faster overall. Add a short delay between batches and back off on 429. See the bulk operations guide for batch sizing and import ordering.

On this page