Limits and plans
Three limits. All three are visible on every response, so none of them has to be discovered by hitting it.
How they interact
They are checked in order, and each answers a different question:
| Limit | Question | Hit it and… |
|---|---|---|
| Rate | How fast? | 429. Transient — wait a second. |
| Quota | How much this month? | Either overage is billed, or 429 until the month resets. |
| Archive depth | How far back? | Nothing fails. Your window is narrowed and the response says so. |
The third is the one to internalise, because it is the only one that changes your results rather than refusing your request. Fewer articles than you expected is a plan boundary you can read off the response, not coverage you have to guess at.
The headers
Every authenticated response carries all of them.
| Header | Meaning |
|---|---|
| x-plan-history-days | How far back this plan may query. Absent means the full archive. |
| x-quota-limit | Included requests this calendar month. Absent when unlimited. |
| x-quota-remaining | Requests left in the monthly allowance. |
| x-quota-reset | Seconds until the quota period resets. |
| x-quota-used | Requests used this month, from the durable counters. |
| x-ratelimit-limit | Requests per minute allowed by this plan. |
| x-ratelimit-remaining | Requests left in the current minute. |
| x-ratelimit-reset | Seconds the bucket refills over. |
GET /account returns the same figures as a body, and
account_status does the same over MCP.
Everything counts once
A request is a request whichever surface it came in on. A tools/call over MCP costs exactly what the
equivalent REST call costs, and both draw on one allowance — there is no separate MCP budget, and no discount for
either.
initialize and tools/list are not tool calls and are not billed as searches. Errors
are billed: a request that returns 404 or a bad filter value still consumed a rate-limit token
and origin work.