Rate limits are enforced per API key at per-minute and per-hour granularity. Exceeding either returns 429 Too Many Requests.

Per-tier limits

PlanRequests/minuteRequests/hour
Free15600
Pro503,000
Business1509,000
EnterpriseCustomCustom

Response headers

Every authenticated response includes:

HeaderDescription
X-PlanYour plan tier
X-Credits-UsedCredits charged for this request
X-Credits-RemainingCredits remaining this billing period
X-Rows-ReturnedNumber of data rows
X-Rows-Cappedtrue if rows were capped to your tier max
X-RateLimit-LimitYour rate limit ceiling
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetWhen the rate limit window resets (Unix timestamp)
X-Process-Time-MsServer processing time in ms
X-Request-IDUnique request identifier for debugging

Handling 429 responses

When you exceed your rate limit:

{
  "error": "rate_limit_exceeded",
  "message": "Rate limit exceeded. Retry after 12 seconds.",
  "retry_after": 12
}

The response also includes a Retry-After header. Use it (or retry_after in the body) to wait before retrying. Implement exponential backoff if you repeatedly hit the limit.

Max rows per response

Each plan caps the maximum rows a single request can return. If the result set is larger, the response is truncated and X-Rows-Capped is set to true.

PlanMax rows
Free100
Pro1,000
Business2,500
Enterprise10,000

Use cursor-based pagination with meta.next_cursor to fetch the rest when X-Rows-Capped is true.

Best practices

  • Check X-RateLimit-Remaining and throttle when it’s low.
  • On 429, respect Retry-After or X-RateLimit-Reset before retrying.
  • Prefer fewer, larger requests (up to your row cap) instead of many small ones.
  • Call /v1/limits (0 credits) to check rate limit and credit status.
  • Log X-Request-ID for support and debugging.