Zrzur Entwickler

Ratenlimits

Wie viele Anfragen ein Bot senden darf, wie du die Header liest und was nach einem 429 zu tun ist.

Die drei Limits

  1. Buckets. Jede Route zählt gegen einen Bucket, in einem Fenster von 10 Sekunden. Die Tabelle unten listet sie.
  2. Global. Ein Bot stellt höchstens 50 Anfragen pro Sekunde über alle Routen.
  3. Abgelehnte Anfragen. Eine Adresse, die in 10 Minuten 10 000 Antworten 401 oder 403 sammelt, wird für 10 Minuten gesperrt. Das stoppt das Erraten von Tokens; ein gesunder Bot kommt nie in die Nähe.

Bots werden nach ihrer ID gezählt, die Limits sind also von jeder Adresse gleich und ändern sich nicht mit mehr Prozessen.

Die Header

Jede Antwort sagt, wo du stehst. Diese Werte stammen aus einer echten Antwort auf GET /users/@me:

x-ratelimit-limit: 20
x-ratelimit-remaining: 13
x-ratelimit-reset-after: 3766
x-ratelimit-bucket: 7575212770586562519
HeaderBedeutung
X-RateLimit-LimitErlaubte Anfragen im Fenster
X-RateLimit-RemainingVerbleibende Anfragen
X-RateLimit-Reset-AfterMillisekunden, bis das Fenster zurückgesetzt wird
X-RateLimit-BucketEine ID dieses Buckets. Eine Zahl, nicht sein Name
X-RateLimit-Globaltrue, wenn das globale Limit erreicht wurde
Retry-AfterNur bei 429: Sekunden zum Warten, aufgerundet

Nach einem 429

Ein Ratenlimit ist ein 429 ohne type:

{ "retry_after": 3531, "global": false }

retry_after ist in Millisekunden.

let pausedUntil = 0;

async function call(path, init) {
  const wait = pausedUntil - Date.now();
  if (wait > 0) await new Promise((r) => setTimeout(r, wait));

  const response = await fetch(`https://api.zrzur.com${path}`, init);
  if (response.status !== 429) return response;

  const body = await response.json();
  if (body.type) throw new Error(body.type); // a refusal, see below
  if (body.global) pausedUntil = Date.now() + body.retry_after;
  await new Promise((r) => setTimeout(r, body.retry_after));
  return call(path, init);
}

Ein 429 mit type ist eine Ablehnung, die du der Person zeigst, nichts zum Abwarten. InSlowmode meint den langsamen Modus des Kanals, RateLimited das Limit eines Webhooks.

Buckets

Bucket/ 10 s
any_dlta20/webhooks, /, /applications, /oauth2, /custom, /invites, /soundboard
bots10/bots
channels15/channels (per channel)
default_avatar255/users
interaction_callbacks10/interactions (per interaction)
interactions15/interactions
interactions_autocomplete30/interactions
messaging10/channels (per channel)
servers5/servers (per server)
user_edit2/users (per user)
users20/users

/servers und /channels zählen pro Server und pro Kanal. Der Bucket servers erlaubt nur 5 Anfragen pro 10 Sekunden pro Server, geteilt von Lesen und Schreiben. Mitgliederlisten (GET /servers/{target}/members) haben ihren eigenen Bucket von 15, member_list. Ein fleißiger Moderations-Bot erreicht das schnell: Halte Mitglieder in einem Cache, den Ready und Mitgliederereignisse füllen, und nutze die Mitgliederdaten aus Interaktionen.

/interactions/{interaction_id}/{token}/... hat einen Bucket von 10 pro Interaktion, das ist reichlich.

Andere Limits

WasLimit
Ein Webhook5 Nachrichten in 2 Sekunden
Alle Webhooks eines Kanals30 Nachrichten pro Minute
Tippen über HTTP5 pro 10 Sekunden pro Kanal
Interaktionen3 Sekunden zum Antworten, 15 Minuten bis zum Ende

Weiter