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
Lawyer Professional3005,000 per seatsubscription-anchored month
Lawyer Professional Plus60025,000 per seatsubscription-anchored month
Developer Pro600100,000subscription-anchored month
Developer Scale1,0001,000,000subscription-anchored month
Commercial & EnterpriseContractContractContract

Included paid allowances reset monthly on the subscription anchor, including annual subscriptions. Lawyer team allowances are pooled and multiply by purchased seats. The free tier uses a rolling 30-day window over your audit log. MCP protocol handshake (initialize, tools/list) does not count; 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"
    }
  ]
}

Optional audience analytics measure visits to this informational page using only its path. Query strings, fragments, referrers, account identifiers, and page content are not sent.