Per-plan limits
Authenticated requests are limited per minute per user, based on your plan:
| Plan | Requests / minute |
|---|---|
| Free | 120 |
| Pro / Premium | 600 |
| Team | 900 |
| Elite / Plus | 1,200 |
| Scale | 1,800 |
| Business Small | 2,400 |
| Business / Enterprise | 6,000 |
Limits apply per user, not per token — creating multiple tokens does not multiply your budget.
Response headers
Every authenticated response carries:
| Header | Meaning |
|---|---|
X-RateLimit-Limit |
Your per-minute budget |
X-RateLimit-Remaining |
Requests left in the current window |
X-RateLimit-Reset |
Unix timestamp when the window resets |
When you exceed the limit the API returns 429 with Retry-After (seconds until the window resets) and a JSON body:
{
"error": "Rate limit exceeded for your plan",
"limit": 120,
"retry_after": 42,
"tier": "free"
}
Handling limits in code
- Honor
Retry-After— wait at least that many seconds before retrying - Watch
X-RateLimit-Remainingand back off before you hit zero - Batch work into fewer requests where possible (list endpoints paginate)
Unauthenticated limits
Public endpoints are rate-limited per IP and path instead — these limits protect the platform and are independent of your plan budget:
| Endpoint class | Limit |
|---|---|
| All API routes (global middleware) | 100 req/min per IP + path |
| Push endpoints — heartbeat, game-server push, API metrics, agent ingestion | 60 req/min per agent token or IP + path |
| Status page subscribe | 10 req/min per IP + path |
Push endpoints keyed by X-Agent-Token count per token rather than per IP, so many agents behind one NAT do not share a budget.