Rate limits
Requests per minute by plan, what a 429 looks like, and how to back off.
Limits are per account, in requests per minute:
| Plan | Limit |
|---|---|
| Free | 20 |
| Monthly | 200 |
| Annual | 300 |
Free keys also 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 (meta.limit_capped through the MCP server). Paid plans get the full limit.
Over the limit you get 429 rate_limited; the message names the plan and its limit. There is no Retry-After header, so back off on your own schedule. Doubling from two seconds over five attempts spans about a minute:
async function withBackoff(fn) {
for (let attempt = 0; attempt < 5; attempt++) {
const resp = await fn();
if (resp.status !== 429) return resp;
await new Promise((r) => setTimeout(r, 2 ** attempt * 2000 + Math.random() * 500));
}
throw new Error("rate limit retries exhausted");
}
Limits count requests, not credits: one list call returning 50 comments is one request. A small pool of concurrent workers beats firing everything at once. Need more? Email support@instadata.dev.