Rate limits
Two independent mechanisms protect the API: a per-account requests-per-minute limit, and your plan's feature quotas (which are shared with the dashboard).
Requests per minute
Your account may make a fixed number of requests per minute — all of your API keys share this budget, so creating more keys does not raise the limit. The default is 60 requests/minute; plans can define a higher limit via the api_rpm plan setting. Every response carries the current state:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed per minute for this key. |
X-RateLimit-Remaining | Requests left in the current window. |
X-RateLimit-Reset | Seconds until the window resets. |
Handling 429 responses
When the limit is exceeded the API responds with 429, error code RATE_LIMITED, and a Retry-After header (in seconds):
{
"error": "Rate limit exceeded",
"code": "RATE_LIMITED",
"request_id": "req_01j8..."
}Back off for Retry-After seconds before retrying. A simple, well-behaved pattern:
- Watch
X-RateLimit-Remainingand slow down before hitting zero. - On
429, sleep forRetry-Afterseconds (plus a little jitter), then retry. - Cap concurrent requests across your integrations rather than fanning out unbounded.
Plan quotas are shared with the dashboard
One quota pool
API usage draws from the same plan quotas as the dashboard. A SERP refresh or a site audit costs the same whether you trigger it from the UI or from the API — there is no separate API allowance.
When a quota runs out the API returns 402 with code QUOTA_EXCEEDED (or PLAN_UPGRADE_REQUIRED if your plan does not include the feature at all), including your current usage and limit in details.
Inspecting usage
GET /v1/usage returns every quota dimension with { used, limit }, so you can budget work before starting it:
curl https://api.zutrix.com/v1/usage \
-H "Authorization: Bearer $ZUTRIX_API_KEY"