Rate limits
Each API token is limited to a number of calls per minute depending on its plan. The quota is shared between MCP tool calls and REST API requests.
Limits per plan
| Plan | Requests / min | Note |
|---|---|---|
| Free | 60 | Default |
| Indie | 60 | |
| Agent | 60 | |
| Scale | 60 | |
| Enterprise | 120 |
The limit is per API token, not per IP address or per account. On the MCP side, only tool calls (tools/call) count: initialize, tools/list and notifications don't use this quota.
Sliding window
The counter uses a 60-second sliding window (not a fixed window). If you send 60 requests in 5 seconds on the free plan, you'll be limited for ~55 seconds — the time it takes for the first requests to leave the window.
HTTP 429 response
When the limit is exceeded, the API returns:
HTTP/1.1 429 Too Many Requests
Retry-After: 12
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry in 12 s."
}
}On the MCP server, a tool call over the limit doesn't return an HTTP error: it returns a tool result with isError: true and the wait time, which the assistant can read to slow down. No credits are charged.
Recommended backoff strategy
Implement exponential backoff starting at 1 second. Four attempts cover most cases.
import time
import requests
def call_with_backoff(url, headers, params, max_retries=4):
delay = 1
for attempt in range(max_retries):
r = requests.get(url, headers=headers, params=params)
if r.status_code == 429:
time.sleep(delay)
delay *= 2
continue
return r
raise Exception("Rate limit exceeded after retries")Server capacity limit (503)
On top of the per-plan limits, the server accepts at most 15 concurrent database queries (across all keys). When that limit is reached, you get HTTP 503 with the code at_capacity. Unlike 429, there is no queue: retry after 2–5 seconds.