Rate Limits
Rate limits protect the platform from overload and keep things fair for everyone. Anonymous limits are based on your IP address. Authenticated requests are keyed to your API key. Most limits reset every hour.
Anonymous Limits
Without an API key, you can browse and explore freely. Heavier operations like SQL queries and data exports require a free account.
| Endpoint Type | Rate Limit | Example Paths |
|---|---|---|
| Browsing & metadata | 150/hour | /v1/datasets, /v1/providers |
| Search | 60/hour | /v1/search |
| Data queries | 30/hour | /v1/datasets/{provider}/{dataset} |
| SQL queries | Requires account | POST /v1/datasets/{provider}/{dataset}/query |
| Downloads & exports | Requires account | /v1/datasets/{provider}/{dataset}/export |
Authenticated Limits
A free account unlocks SQL queries, data exports, and 10x higher limits across the board. See the Authentication guide to get started.
| Endpoint Type | Rate Limit | Example Paths |
|---|---|---|
| Search | 1,000/hour | /v1/search |
| Browsing & metadata | 500/hour | /v1/datasets, /v1/providers |
| Data queries | 600/hour | /v1/datasets/{provider}/{dataset} |
| SQL queries | 60/minute | POST /v1/datasets/{provider}/{dataset}/query |
| Downloads & exports | 20/hour | /v1/datasets/{provider}/{dataset}/export |
Rate Limit Headers
Every API response includes rate limit information in headers:
X-RateLimit-Limit: 150X-RateLimit-Remaining: 112X-RateLimit-Reset: 1704067200
- X-RateLimit-Limit
- Maximum requests allowed in the current window
- X-RateLimit-Remaining
- Requests remaining in the current window
- X-RateLimit-Reset
- Unix timestamp when the rate limit resets
Handling Errors
Rate Limit Exceeded (429)
When you exceed the rate limit, the API returns a 429 status code:
{"error": "rate_limit_exceeded","message": "Rate limit reached. Try again in 42 minutes.","retry_after": 2520,"limit": "150/hour","upgrade_message": "Sign up free for 10x higher limits and full data exports.","signup_url": "https://tryopendata.ai/signup","documentation_url": "https://tryopendata.ai/docs/rate-limits"}
The retry_after field tells you how many seconds to wait before trying again. The Retry-After header contains the same value.
Authentication Required (403)
SQL queries and data exports return a 403 if you haven't signed in:
{"error": "auth_required","message": "SQL queries require a free account. Sign up to start running queries.","signup_url": "https://tryopendata.ai/signup","documentation_url": "https://tryopendata.ai/docs/authentication"}
Creating an account is free and takes a few seconds. See the Authentication guide.
Best Practices
- Check headers - Monitor remaining requests before hitting limits
- Implement backoff - Use exponential backoff when receiving 429
- Cache responses - Cache frequently-accessed data locally
- Batch requests - Combine multiple queries when possible
Python Example with Retry
import timeimport requestsdef fetch_with_retry(url, max_retries=3):for attempt in range(max_retries):response = requests.get(url)if response.status_code == 429:retry_after = int(response.headers.get("Retry-After", 60))time.sleep(retry_after)continuereturn responseraise Exception("Max retries exceeded")
Increasing Your Limits
The anonymous limits above are designed for casual browsing. Creating a free account unlocks SQL queries, data exports, and 10x higher rate limits (see the authenticated table above). No credit card needed.
To get started, see the Authentication guide.