REST API v1 · Developers

Rate limits

Limits apply per API key in a fixed one-minute window, sized by the server’s plan. Every authenticated response tells you where you stand, so a well-behaved client never has to guess.

Developer docs
On this page

Limits by plan

Requests per minute per API key
PlanRequests per minuteActive keys
Free602
Pro and Network60010
White Label60040

Each key has its own window, so two keys on the same server don’t share a budget. See pricing for the plans.

Rate limit headers

Every authenticated response carries the current state of the window:

Response headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1791374460
  • X-RateLimit-Limit — requests allowed per minute for this key.
  • X-RateLimit-Remaining — requests left in the current window.
  • X-RateLimit-Reset — Unix time (seconds) when the window resets.

Over the limit

Over the limit you get 429 RATE_LIMITED with a Retry-After header and a numeric retryAfter field in the body (both in seconds). Wait that long, then retry.

Response · 429
HTTP/1.1 429 Too Many Requests
Retry-After: 18

{ "error": "RATE_LIMITED", "message": "Rate limit of 60 requests per minute exceeded", "retryAfter": 18 }
Node.js
// Wait and retry on 429 / 503, using the server's Retry-After
async function call(url, init, tries = 3) {
  for (let attempt = 1; ; attempt++) {
    const res = await fetch(url, init);
    if ((res.status !== 429 && res.status !== 503) || attempt >= tries) return res;
    const seconds = Number(res.headers.get('Retry-After')) || attempt * 2;
    await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
  }
}

Repeated requests with invalid keys from one IP address are throttled too: beyond a small number of failures per minute they answer 429 instead of 401.

Ready to level up your server?

Add BotGG for free, then switch features on in the web console.