Rate limits
Limits are per account, in requests per minute:
| Plan | Limit |
|---|---|
| Free trial | 20 rpm |
| Monthly ($5) | 200 rpm |
| Annual ($54) | 300 rpm |
| Enterprise | up to 1,500 rpm |
Items per call on the free trial
Free-trial keys return at most 5 items per list call, whatever limit
asks for. When a request was lowered, the response carries an X-Limit-Capped
header with the ceiling (meta.limit_capped through the MCP server). Paid plans
get the full limit, up to 50 per synchronous call.
When you hit the limit
You get 429 rate_limited. The message names your plan and its per-minute limit:
{ "error": { "code": "rate_limited", "message": "Rate limit exceeded for plan 'monthly' (200/min)", "request_id": "req_01JZX4M8Q2TE9W" }}The response does not include a Retry-After header, so back off on your own
schedule. Doubling the wait from 2 seconds over five attempts spans about a minute,
which covers the window:
async function withBackoff(fn) { for (let attempt = 0; attempt < 5; attempt++) { const resp = await fn(); if (resp.status !== 429) return resp; const wait = 2 ** attempt * 2000 + Math.random() * 500; await new Promise((r) => setTimeout(r, wait)); } throw new Error("rate limit retries exhausted");}Tips
- Rate limits count requests, not credits — one list call returning 50 comments is one request.
- Run a small pool of concurrent workers (4 is plenty on the monthly plan) instead of firing every request at once.
- Keep
limitat 50 or lower per call. - Need more than 300 rpm? Contact us about volume plans.
Next: Pagination · Errors