- API
- Rate limits
Guide
Rate limits
and quotas.
Limits apply per token, and a monthly allowance per account. Exceeding one returns HTTP 429 with a Retry-After header; every response tells you where you stand before that happens.
Limits
| Scope | Limit | Applies to | On exceed |
|---|---|---|---|
| Per token | 60 a minute and 1,000 an hour | Every call under /api/mcp/data/* with that token. | 429 {"error": "…"} plus Retry-After in seconds. |
| Monthly allowance, per account | By plan | Every call by all your tokens combined. The unit is upstream market-data fetches, not API calls: a call that reads one source costs 1, a composite such as expected move or the mispricing assessment costs 2 to 3. Resets at the start of the month. | 429 {"budget_exceeded": true, "used": …, "limit": …, "unit": "data_requests"} |
| Auth failures, per address | 20 in 15 minutes | Failed authentications on the token surface. A valid token never hits it. | 429 |
- Upstream data quota is finite, so heavy polling of the same ticker may be served from a short cache rather than refreshed.
- Your current-month usage and a per-endpoint breakdown are on Account, then API Access, and at
GET /api/mcp/data/me/usagewith any of your tokens. - At 80 percent of the month's allowance the account gets one email, and one more at 100 percent. Nothing else changes at the limit: tokens, plan and terminal access stay as they are, and the counter resets on the first of the month.
Batch calls
Three endpoints take tickers= with up to 25 symbols and return the single endpoint's payload per symbol: /batch/iv-rank, /batch/gex and /batch/expected-move. A batch call spends one rate-limit unit however many symbols it names, so a 25-name watchlist that used to take 25 of the 60 per-minute calls now takes one. The monthly allowance is still spent per symbol, exactly as if each were called alone. A symbol the feed cannot answer lands in errors and never fails the others.
Your own meter
GET /api/mcp/data/me/usage returns the month's meter in the unit the allowance is enforced in, the reset time, the live rate-limit position for the token that called, the calls per endpoint this month with each endpoint's docs page, the active tokens on the account, and the unknown paths this token hit in the last seven days. It costs nothing against the allowance and works on any paid plan. Call it before a long run rather than discovering the limit halfway through.
{
"used": 1234, "limit": 10000, "remaining": 8766, "percent_used": 12.3,
"unit": "data_requests", "month": "2026-09", "resets_at": "2026-10-01T00:00:00+00:00",
"rate_limits": {"per_minute": 60, "per_hour": 1000, "remaining_minute": 59, "remaining_hour": 998},
"endpoints": [{"endpoint": "/api/mcp/data/iv-rank/<ticker>", "calls": 70, "docs": "https://apexvol.com/developers/implied-volatility-api/iv-rank"}],
"this_token": {"token_id": "AV-012", "unknown_paths_7d": {}}
}
Quota headers
Every response under /api/mcp/data/* carries these. Pace a client from them instead of discovering limits by hitting them.
| Header | Meaning |
|---|---|
X-RateLimit-Limit-Minute, X-RateLimit-Remaining-Minute | The per-minute allowance and what is left of it. |
X-RateLimit-Limit-Hour, X-RateLimit-Remaining-Hour | The per-hour allowance and what is left of it. |
X-Monthly-Budget-Remaining | Data requests left in the monthly allowance (see the unit note above; one call can spend more than one). |
Retry-After | On a 429: seconds to wait before retrying. It is the time left in the window that tripped (the minute or the hour), or the seconds to the first of next month when the monthly allowance is spent. |
The try-it console on every endpoint page shows these headers after each run, and counts down Retry-After on a 429.
Included with
every paid plan.
From $55 a month, tier-matched: your token queries the data your plan includes and Pro unlocks the full surface.
Real market data, not a sandbox. See it live on AAPL.