Skip to main content

Limits

ScopeLimitWindow
Global (all endpoints)120 requestsPer minute, per API key
AI explain endpoint5 requestsPer minute, per API key

Rate limit headers

Every authenticated response includes these headers:
HeaderDescription
X-RateLimit-LimitMax requests allowed per window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
Example:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1707451200

Handling 429 responses

When you exceed the rate limit, the API returns 429 with a retry_after_seconds field:
{
  "data": null,
  "meta": { "request_id": "req_abc123", "api_version": "v2" },
  "errors": [
    {
      "code": "RATE_LIMIT_EXCEEDED",
      "message": "Rate limit exceeded. Retry after 42 seconds.",
      "retryable": true,
      "retry_after_seconds": 42
    }
  ]
}
import time

resp = requests.get(url, headers=headers)
if resp.status_code == 429:
    retry_after = resp.json()["errors"][0]["retry_after_seconds"]
    time.sleep(retry_after)
    resp = requests.get(url, headers=headers)  # retry

Best practices

  • Check headers proactively — Slow down when X-RateLimit-Remaining drops below 10
  • Use pagination wisely — Larger page_size (up to 200) means fewer requests
  • Cache responses — Portfolio summary and residual reports don’t change frequently
  • Use updated_since — Incremental sync avoids re-fetching unchanged records
  • Spread requests — Avoid bursting 120 requests in the first second of a window