Ratenlimits
Wie viele Anfragen ein Bot senden darf, wie du die Header liest und was nach einem 429 zu tun ist.
Die drei Limits
- Buckets. Jede Route zählt gegen einen Bucket, in einem Fenster von 10 Sekunden. Die Tabelle unten listet sie.
- Global. Ein Bot stellt höchstens 50 Anfragen pro Sekunde über alle Routen.
- Abgelehnte Anfragen. Eine Adresse, die in 10 Minuten 10 000 Antworten
401oder403sammelt, 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| Header | Bedeutung |
|---|---|
X-RateLimit-Limit | Erlaubte Anfragen im Fenster |
X-RateLimit-Remaining | Verbleibende Anfragen |
X-RateLimit-Reset-After | Millisekunden, bis das Fenster zurückgesetzt wird |
X-RateLimit-Bucket | Eine ID dieses Buckets. Eine Zahl, nicht sein Name |
X-RateLimit-Global | true, wenn das globale Limit erreicht wurde |
Retry-After | Nur 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.
global: false: Warte so lange und wiederhole diese Anfrage. Andere dürfen weiterlaufen.global: true: Der Bot hat seine 50 pro Sekunde erreicht. Pausiere jede Anfrage, bis die Zeit um ist, nicht nur diese.
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_dlta | 20 | /webhooks, /, /applications, /oauth2, /custom, /invites, /soundboard |
bots | 10 | /bots |
channels | 15 | /channels (per channel) |
default_avatar | 255 | /users |
interaction_callbacks | 10 | /interactions (per interaction) |
interactions | 15 | /interactions |
interactions_autocomplete | 30 | /interactions |
messaging | 10 | /channels (per channel) |
servers | 5 | /servers (per server) |
user_edit | 2 | /users (per user) |
users | 20 | /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
| Was | Limit |
|---|---|
| Ein Webhook | 5 Nachrichten in 2 Sekunden |
| Alle Webhooks eines Kanals | 30 Nachrichten pro Minute |
| Tippen über HTTP | 5 pro 10 Sekunden pro Kanal |
| Interaktionen | 3 Sekunden zum Antworten, 15 Minuten bis zum Ende |