Rate Limits
Understand how rate limiting works, plan-based data access, and how to handle 429 responses.
GET /api/v1/limits endpoint to check your current tier and limits programmatically.| Tier | Requests / min | Burst / sec |
|---|---|---|
| Free | 30 | 2 |
| Builder | 250 | 12 |
| Pro | 750 | 40 |
| Enterprise | Custom | Custom |
Per-minute uses a sliding window. Burst uses a token bucket.
Free and Builder tier users have restricted access to the most recent markets. Pro and Enterprise tiers have unlimited access to all markets and snapshots.
| Market Type | Free | Builder | Pro / Enterprise |
|---|---|---|---|
| 5m | 20 | 4,100 | Unlimited |
| 15m | 10 | 1,400 | Unlimited |
| 1hr | 0 | 350 | Unlimited |
| 4hr | 0 | 85 | Unlimited |
| 24hr | 0 | 14 | Unlimited |
When a list query exceeds your tier's cap, the response limit is clamped and a warning field is included.
The number of active API keys you can hold depends on your plan. Revoked or expired keys do not count toward the limit.
Every response includes rate limit headers so you can track your usage in real-time.
X-RateLimit-Limit: 250
X-RateLimit-Remaining: 237
X-RateLimit-Reset: 1740800060Handling 429 Responses
When you exceed your rate limit, the API returns a 429 status code with a Retry-After header indicating how many seconds to wait. The response body includes error, message, and retry_after fields.
import time
import requests
def fetch_with_retry(url, headers, max_retries=3):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 429:
wait = int(response.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
return response
raise Exception("Rate limit exceeded after retries")If you attempt to access a market or its snapshots that falls outside your tier's data window, the API returns 403 Forbidden. Upgrade your plan or access a more recent market.
{
"error": "Forbidden",
"message": "Your free plan only includes the most recent markets for this type. Upgrade for full access.",
"tier": "free"
}