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.

PlanDailyMonthlyPer Minute
Anonymous5203
Free2060010
Dev1,0005,000100
ProUnlimited30,000300
EnterpriseUnlimitedUnlimited1,000

Rate Limit Headers

Every response includes headers so you can track your usage in real time.

HeaderDescription
X-RateLimit-Limit-MinuteRequests allowed per minute
X-RateLimit-Remaining-MinuteRequests remaining this minute
X-RateLimit-Limit-DayRequests allowed per day
X-RateLimit-Remaining-DayRequests remaining today
X-RateLimit-Limit-MonthRequests allowed per month
X-RateLimit-Remaining-MonthRequests remaining this month
Retry-AfterSeconds 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:

HTTP Status Codes

CodeMeaning
200Success
400Bad request — invalid parameters
401Unauthorized — missing or invalid authentication
404Not found — document or resource doesn't exist
429Rate limit exceeded
500Internal 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"
    }
  ]
}