Rate Limits & Errors

Understanding rate limits, response headers, and error formats.

Rate Limit Tiers

Three windows per plan: per-minute (abuse cap, all plans), per-day (rolling 24h, free only), and per-period (your billing window). See Pricing for prices.

PlanPer MinutePer Day (rolling 24h)Per PeriodPeriod
Free1020600rolling 30 days
Dev10020,000Stripe billing cycle
Pro300100,000Stripe billing cycle
Enterprise1,000Unlimited

Paid plans reset on the first day of each Stripe billing cycle. The free tier uses a rolling 30-day window over your audit log — old requests age out one at a time, no hard reset. MCP protocol handshake (initialize, tools/list) does not count against your quota; only actual tool calls do.

Rate Limit Headers

Every response includes headers so you can track your usage in real time. Headers use lowercase names per HTTP/2.

HeaderDescription
x-ratelimit-limit-minuteRequests allowed per minute (abuse cap, all plans)
x-ratelimit-remaining-minuteRequests remaining this minute
x-ratelimit-limit-dayRolling 24h cap (free plan only)
x-ratelimit-remaining-dayRequests remaining in the last 24h window
x-ratelimit-limit-periodPeriod quota (Stripe billing window for paid; rolling 30d for free)
x-ratelimit-remaining-periodRequests remaining in the current period
x-ratelimit-period-typestripe (paid) or rolling_30d (free)
x-ratelimit-reset-periodISO-8601 reset timestamp (paid only; omitted for rolling windows)
Retry-AfterSeconds to wait (only on 429 responses)

429 Too Many Requests

When you exceed a quota the API returns a 429 status with a structured error body.

{
  "type": "error",
  "error": {
    "type": "rate_limit_error",
    "message": "Plan quota exceeded for current billing period (free plan). Resets as old requests age out. Upgrade: https://legaldatahunter.com/pricing",
    "limit_type": "period",
    "plan": "free",
    "upgrade_url": "/pricing",
    "period_resets_at": null
  }
}

The limit_type field indicates which quota was exceeded: minute, day, or period. MCP requests receive the same payload wrapped in a JSON-RPC 2.0 error with code -32029.

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"
    }
  ]
}