Rate limits
Requests per minute per key and per workspace, sized by plan, with RateLimit headers on every response.
Provisional numbers
The limits below are the launch values and may change before the API leaves preview. Read the live
values from the RateLimit-* headers or GET /v2/me rather than hard-coding them.
The limits
Each request spends one token from two buckets: one for the key and one for the whole workspace. A request goes through only when both have a token.
| Plan | Workspace | Each key |
|---|---|---|
| Growth | 600 requests per minute | 300 per minute |
| Scale | 3,000 requests per minute | 1,500 per minute |
| Free | The API is not included |
Each key gets half the workspace budget, so one runaway integration cannot starve the others. Buckets refill continuously, not at the top of the minute: a key on Growth gets a token back every 200 ms.
API traffic is not metered or billed separately. It counts against your plan's normal limits and usage, like work done in the console.
Headers
Every /v2 response that reached the limiter carries:
RateLimit-Limit: 300
RateLimit-Remaining: 287
RateLimit-Reset: 3| Header | |
|---|---|
RateLimit-Limit | Requests per minute in the tighter of your two buckets |
RateLimit-Remaining | Tokens left in that bucket |
RateLimit-Reset | Seconds until that bucket is full again |
GET /v2/me returns both buckets in rateLimit, including workspaceLimit and
workspaceRemaining.
When you hit it
HTTP/1.1 429 Too Many Requests
Retry-After: 2
RateLimit-Limit: 300
RateLimit-Remaining: 0
RateLimit-Reset: 60{
"error": {
"code": "rate_limited",
"message": "Rate limit reached. Retry after 2 s.",
"details": { "limit": 300, "workspaceLimit": 600 },
"requestId": "…"
}
}Wait Retry-After seconds, then retry. A refused request spends no token, but requests to a route
the key cannot call still count: the limit is checked before the scope.
Staying under
- Page with
limit=100instead of many small pages. - Use webhooks instead of polling for changes.
- Spread batch jobs over time, and give each integration its own key.
- Back off on
429with jitter, so many workers do not retry in the same instant.
Gauge also applies a per-IP safety limit in front of the API, to protect the platform from floods. Normal integrations never meet it.