Skip to main content
A plan sets three things for a key: which routes it can call, how many requests per minute it gets, and its quota over a longer window. The data on every route is identical across plans: paid plans buy throughput, not different numbers.
PlanPer minuteQuotaRoutes
Free30/min100/daysearch, coverage, snapshot, valuation
Starter60/min10,000/monthall routes
Builder300/min75,000/monthall routes
Prices are at /pricing. Pick Builder over Starter when you need the higher ceilings (300/min and 75,000/month against 60/min and 10,000) for fan-out, batch jobs, or bursty agent traffic. The responses are byte-for-byte the same.

Route access

Free covers the proof loop: discover a symbol with /v2/search, confirm what it supports with /v2/coverage, pull a /v2/snapshot, and run a /v2/valuation. Every other route requires Starter or Builder. A Free key that calls a paid route gets HTTP 403 with PLAN_UPGRADE_REQUIRED:
{
  "error": {
    "code": "PLAN_UPGRADE_REQUIRED",
    "message": "This endpoint requires Starter or Builder. Free includes search, coverage, snapshot, and valuation.",
    "retryable": false
  }
}
This is not retryable. Upgrade the key, or call one of the four Free routes.

Rate-limit headers

Every response that passes key verification carries three headers describing your current minute bucket, successes and post-auth errors alike (400, 403, 404 SYMBOL_UNKNOWN, 429). Only a pre-auth 401 or an unmatched-route 404 NOT_FOUND omits them, since both fail before the key is checked:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1798912312
HeaderMeaning
X-RateLimit-LimitRequests allowed in the current minute window.
X-RateLimit-RemainingRequests left in that window.
X-RateLimit-ResetUnix epoch seconds when the window resets.
Read X-RateLimit-Remaining to pace yourself before you ever hit a 429.

Hitting a ceiling

When you exceed the per-minute rate or exhaust your quota, requests return HTTP 429 with RATE_LIMITED until the window resets: the daily window for Free, the monthly window for Starter and Builder. A 429 adds a Retry-After header (seconds) and sets X-RateLimit-Remaining to 0. The headers on a 429 describe whichever window tripped. A minute-bucket 429 shows your per-minute limit and a Retry-After of seconds. A quota 429 flips X-RateLimit-Limit to the quota itself (100 on Free), sets X-RateLimit-Reset to the window’s end, and sends a Retry-After of hours: a Free daily 429 reports the seconds until midnight UTC. There is no header that counts the daily or monthly budget down during normal operation; if quota matters to your job, count requests yourself. This is a minute-bucket 429:
429 captured 2026-06-05
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1780669200
Retry-After: 21

{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Please slow request rate and retry.",
    "retryable": true
  }
}
RATE_LIMITED is retryable. Stop sending for that key, wait Retry-After (21 seconds in this capture) or until X-RateLimit-Reset, then resume at lower concurrency and cache repeat reads. The same gating applies to the hosted MCP tools, since they call the same routes. For retry mechanics across every error, see error codes.