Rate Limits & Errors
Understanding rate limits, response headers, and error formats.
Rate Limit Tiers
Limits depend on your plan. See Pricing for plan details and prices.
| Plan | Daily | Monthly | Per Minute |
|---|---|---|---|
| Anonymous | 5 | 20 | 3 |
| Free | 20 | 600 | 10 |
| Dev | 1,000 | 5,000 | 100 |
| Pro | Unlimited | 30,000 | 300 |
| Enterprise | Unlimited | Unlimited | 1,000 |
Rate Limit Headers
Every response includes headers so you can track your usage in real time.
| Header | Description |
|---|---|
X-RateLimit-Limit-Minute | Requests allowed per minute |
X-RateLimit-Remaining-Minute | Requests remaining this minute |
X-RateLimit-Limit-Day | Requests allowed per day |
X-RateLimit-Remaining-Day | Requests remaining today |
X-RateLimit-Limit-Month | Requests allowed per month |
X-RateLimit-Remaining-Month | Requests remaining this month |
Retry-After | Seconds to wait (only included on 429 responses) |
429 Too Many Requests
When you exceed a rate limit, the API returns a 429 status with details about which limit was hit.
{
"detail": "Daily rate limit exceeded (20/20). Upgrade at /pricing for higher limits.",
"upgrade_url": "/pricing",
"limit_type": "daily"
}
The limit_type field indicates which limit was exceeded: minute, daily, or monthly.
Exempt Endpoints
The following endpoints are not rate-limited and do not count against your quotas:
GET /v1/discover/*— Discovery endpointsGET /v1/stats— StatisticsGET /v1/manifest— ManifestGET /v1/billing/*— Billing endpointsGET /v1/usage/*— Usage endpointsGET /v1/keys— Key managementGET /auth/*— Authentication
HTTP Status Codes
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request — invalid parameters |
401 | Unauthorized — missing or invalid authentication |
404 | Not found — document or resource doesn't exist |
429 | Rate limit exceeded |
500 | Internal server error |
Error Response Format
All errors follow a standard format with a detail field containing a human-readable message.
General errors
{
"detail": "Human-readable error message"
}
Validation errors (400)
{
"detail": [
{
"loc": ["body", "q"],
"msg": "field required",
"type": "value_error.missing"
}
]
}