Entwickler
Dokumentation der Bot-API
Eine kleine, rein lesende API, mit der Serverbesitzer Daten ihres eigenen Discord-Servers auf ihrer Website, in ihren Tools und in Widgets anzeigen können.
Authentifizierung
Erstelle einen Token auf der Seite Bot-API deines Dashboards und sende ihn im Header Authorization: Authorization: Bearer <token>. Ein Token gehört zu einem Server und kann nur diesen lesen. Er wird einmal angezeigt; DayZ Hub speichert nur seinen Fingerabdruck.
curl -H "Authorization: Bearer dhba_..." \ https://dayzhub.net/api/v1/bot/guilds/<guildId>
Basis-URL: https://dayzhub.net/api/v1/bot
Endpunkte
| Method | Path | Scope |
|---|---|---|
GET | /me | — |
GET | /guilds/{guildId} | guild:read |
GET | /guilds/{guildId}/features | guild:read |
GET | /guilds/{guildId}/giveaways | giveaways:read |
GET | /guilds/{guildId}/giveaways/{id} | giveaways:read |
GET | /guilds/{guildId}/tickets/summary | tickets:read |
GET | /guilds/{guildId}/leaderboard/levels | leveling:read |
GET | /guilds/{guildId}/shop/products | shop:read |
GET | /guilds/{guildId}/suggestions/summary | suggestions:read |
GET | /guilds/{guildId}/server-status | server-status:read |
Jede Antwort ist JSON im selben Umschlag. Listen sind seitenweise abrufbar mit limit (1 bis 100) und dem Cursor aus page.nextCursor.
{ "ok": true, "data": [ ... ], "page": { "limit": 25, "hasMore": true, "nextCursor": "eyJpZCI6Ij..." } }
Scopes
Jeder Token hat nur die Scopes, die du ihm gegeben hast. Alle sind nur lesend; über diese API lässt sich nichts ändern.
guild:read | Planstatus und Liste der Funktionen |
giveaways:read | Gewinnspiele (aktiv und beendet) mit Teilnehmerzahlen |
tickets:read | Ticketzahlen nach Status und Kategorie (ohne Ticketinhalt) |
leveling:read | Level-Rangliste (Mitglieder mit Widerspruch erscheinen anonym) |
shop:read | Öffentliche Produkte des Spendenshops |
suggestions:read | Anzahl der Vorschläge nach Status |
server-status:read | Öffentlicher Status des Spielservers (nur bei öffentlicher Listung) |
Datenschutz der Mitglieder
Mitglieder erscheinen nur dort, wo die Funktion sie bereits öffentlich zeigt, als Discord-ID. Ein Mitglied, das der Datenverarbeitung widersprochen hat, wird immer anonym gezeigt, wie unten. Namen, Nachrichten, Tickets und Formularantworten sind nie Teil der API.
{ "id": null, "anonymous": true }
Limits
Die Limits folgen dem Plan des Servers. Premium 1: 2 aktive Token, 60 Anfragen pro Minute und Token. Premium 2: 5 Token, 120 pro Minute. Premium 3: 10 Token, 300 pro Minute. Eine kostenlose Testphase oder ein gesponserter Server zählt als Premium 1. Jede IP-Adresse darf 300 Anfragen pro Minute stellen. Darüber gibt es 429 mit dem Header Retry-After. Ein niedrigerer Plan widerruft keinen Token: Die vorhandenen Token funktionieren weiter, nur neue sind gesperrt, bis du unter dem Limit bist. Der Server braucht einen bezahlten Plan oder eine aktive Testphase.
Caching
Antworten enthalten einen ETag und einen kurzen privaten Cache. Sende If-None-Match, um 304 zu erhalten, wenn sich nichts geändert hat. Abfragen alle 30 bis 60 Sekunden reichen völlig.
Browser und CORS
Rufe die API von deinem Server aus auf. CORS ist standardmäßig aus. Muss eine Webseite sie im Browser eines Besuchers aufrufen, setze eine erlaubte Website am Token; Anfragen von jeder anderen Origin werden abgelehnt. Alles in einer Webseite ist für Besucher sichtbar.
Dein Token, Plan und Limits
GET /me braucht keine Plan-Prüfung. Neben dem Token selbst liefert es plan (premium1, premium2, premium3 oder none), limits (tokens und perMinute dieses Plans) und tokensUsed (aktive Token des Servers). rateLimitPerMin ist die Rate, die dieser Token gerade hat.
{ "ok": true, "data": { "guildId": "123456789012345678", "name": "Website", "prefix": "dhba_aB3dE", "scopes": ["guild:read"],
"allowedOrigin": null, "rateLimitPerMin": 120, "createdAt": "2026-10-01T12:00:00.000Z",
"plan": "premium2", "limits": { "tokens": 5, "perMinute": 120 }, "tokensUsed": 2 } }
Request-IDs
Jede Antwort trägt den Header X-Request-Id. Sendest du eine eigene X-Request-Id (bis zu 64 Buchstaben, Ziffern und . _ : -), bleibt sie erhalten, sonst wird eine erzeugt. Fehler wiederholen sie als requestId. Nenne sie, wenn du den Support kontaktierst.
X-Request-Id: 3f2b8c1e-5a7d-4e0b-9c64-1d2e3f4a5b6c
{ "ok": false, "error": "rate_limited", "code": "rate_limited", "message": "Too many requests", "requestId": "3f2b8c1e-5a7d-4e0b-9c64-1d2e3f4a5b6c" }
Fehler
Fehler sind JSON mit ok: false, einem stabilen Code in code (error enthält denselben Wert), einer kurzen Meldung und der requestId. Entscheide nach dem Code, nie nach dem Meldungstext.
400 bad_request / bad_cursor | Ein Parameter ist ungültig (limit, cursor, status oder id). |
401 unauthorized / invalid_token | Token fehlt, ist fehlerhaft, unbekannt oder widerrufen. |
403 guild_mismatch | Die Guild im Pfad ist nicht die Guild des Tokens. |
403 missing_scope | Der Token hat nicht den Scope, den dieser Endpunkt braucht. |
403 origin_not_allowed | Der Origin-Header passt nicht zur erlaubten Website des Tokens. |
403 plan_required | Der Server hat keinen bezahlten Plan und keine aktive Testphase. |
403 feature_not_in_plan | Die Funktion gehört nicht zum Plan des Servers. |
404 not_found / shop_not_enabled | Hier ist nichts (oder der Shop ist nicht aktiviert). |
405 method_not_allowed | Nur GET ist verfügbar; die API ist nur lesend. |
429 rate_limited | Zu viele Anfragen. Warte die Sekunden aus Retry-After ab. |
503 unavailable | Vorübergehend nicht verfügbar. Versuche es später erneut. |