Skip to content

Rate Limits

Request limits and how to handle 429 responses.

View as Markdown

Rate limiting applies to all /v1 requests authenticated with an API key.

Limits

LimitWindowScope
60 requests60 secondsPer API key

The counter resets at the start of each 60-second window.

Response headers

Every /v1 response includes these headers so you can track your usage:

HeaderTypeDescription
X-RateLimit-LimitintegerMaximum requests allowed per window
X-RateLimit-RemainingintegerRequests remaining in the current window
X-RateLimit-Resetunix timestampWhen the current window expires

Handling 429

When you exceed the limit the API returns 429 Too Many Requests:

JSON
{
  "statusCode": 429,
  "message": "ThrottlerException: Too Many Requests",
  "error": "Too Many Requests"
}

Wait until X-RateLimit-Reset before retrying. A simple exponential backoff loop:

Python
import time
import httpx

def get_with_retry(client: httpx.Client, url: str, max_retries: int = 3):
    for attempt in range(max_retries):
        res = client.get(url)
        if res.status_code != 429:
            return res.raise_for_status()
        reset = int(res.headers.get("X-RateLimit-Reset", 0))
        wait = max(reset - int(time.time()), 1)
        print(f"Rate limited. Waiting {wait}s...")
        time.sleep(wait)
    raise RuntimeError("Exceeded max retries")

Tips for staying under the limit

  • For bulk operations (triggering many runs at once), add a small delay between requests
  • Cache GET responses locally — test and project data rarely changes between runs
  • If you need a higher limit for a specific use case, contact us

On this page