Rate limits
The Agent API is limited per API key, based on your plan, not a single flat cap. The per-minute limit is enforced in a 60-second window, and the current cap for your key is in the X-RateLimit-* headers of every response.
Plan limits
| Plan | Requests / min | Calls / month |
|---|---|---|
| Pro | 40 | 1,000 |
| Ultra | 80 | 4,000 |
| Max | 200 | 12,000 |
| API / white-label partner | 100 | no monthly quota (fair use) |
The per-minute limit is hard (exceeding it returns 429). For the portal plans (Pro/Ultra/Max) the monthly quota is soft: once exceeded, calls keep working and the excess is billed as overage (0.50 € per 1,000 calls). We send a warning at roughly 80% and 100% of your monthly quota. Need higher limits? Upgrade to a higher plan (or ask support for a per-key increase).
Partner keys (API / white-label, volume price list) have no monthly billed call quota, they are governed by the 100 req/min rate limit and fair use. The highest portal-plan cap is 200 req/min (Max); the actual cap depends on the plan of the key's organization, per the table above. A key with no assigned plan (e.g. no org context) has a restrictive default of 20 req/min.
Headers
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum number of requests in the window. |
X-RateLimit-Remaining | Remaining requests in the current window. |
X-RateLimit-Reset | Unix time (s) when the window resets. |
Retry-After | On 429: how many seconds to wait. |
Handling 429
When the limit is exceeded, the API returns 429 RATE_LIMITED. Respect Retry-After and use exponential backoff with jitter. Do not retry in a tight loop.
async function callWithRetry(fn, max = 5) {
for (let attempt = 0; attempt < max; attempt++) {
const res = await fn();
if (res.status !== 429) return res;
const retryAfter = Number(res.headers.get("Retry-After") ?? 1);
const backoff = retryAfter * 1000 + Math.random() * 250;
await new Promise((r) => setTimeout(r, backoff));
}
throw new Error("Rate limit: retries exhausted");
}For bulk operations, spread requests out over time and use pagination (
page / per_page) instead of frequent polling.