Rate Limits
Request limits and how to handle 429 responses.
Rate limiting applies to all /v1 requests authenticated with an API key.
Limits
| Limit | Window | Scope |
|---|---|---|
| 60 requests | 60 seconds | Per 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:
| Header | Type | Description |
|---|---|---|
X-RateLimit-Limit | integer | Maximum requests allowed per window |
X-RateLimit-Remaining | integer | Requests remaining in the current window |
X-RateLimit-Reset | unix timestamp | When the current window expires |
Handling 429
When you exceed the limit the API returns 429 Too Many Requests:
{
"statusCode": 429,
"message": "ThrottlerException: Too Many Requests",
"error": "Too Many Requests"
}Wait until X-RateLimit-Reset before retrying. A simple exponential backoff loop:
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
GETresponses locally — test and project data rarely changes between runs - If you need a higher limit for a specific use case, contact us