Programiści
Dokumentacja API bota
Małe API tylko do odczytu, dzięki któremu właściciele serwerów pokażą dane własnego serwera Discord na swojej stronie, w narzędziach i widżetach.
Uwierzytelnianie
Utwórz token na stronie API bota w panelu i wyślij go w nagłówku Authorization: Authorization: Bearer <token>. Token należy do jednego serwera i czyta tylko ten serwer. Jest pokazywany raz; DayZ Hub przechowuje tylko jego odcisk.
curl -H "Authorization: Bearer dhba_..." \ https://dayzhub.net/api/v1/bot/guilds/<guildId>
Bazowy URL: https://dayzhub.net/api/v1/bot
Punkty końcowe
| Method | Path | Zakres |
|---|---|---|
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 |
Każda odpowiedź to JSON w tej samej kopercie. Listy są stronicowane przez limit (od 1 do 100) i kursor z page.nextCursor.
{ "ok": true, "data": [ ... ], "page": { "limit": 25, "hasMore": true, "nextCursor": "eyJpZCI6Ij..." } }
Zakresy
Każdy token ma tylko te zakresy, które mu nadasz. Wszystkie są tylko do odczytu; przez to API nic nie da się zmienić.
guild:read | Stan planu i lista funkcji |
giveaways:read | Konkursy (aktywne i zakończone) z liczbą zgłoszeń |
tickets:read | Liczba ticketów wg statusu i kategorii (bez treści ticketów) |
leveling:read | Ranking poziomów (członkowie, którzy się sprzeciwili, są anonimowi) |
shop:read | Publiczne produkty sklepu z darowiznami |
suggestions:read | Liczba sugestii wg statusu |
server-status:read | Publiczny status serwera gry (tylko gdy jest publicznie wylistowany) |
Prywatność członków
Członkowie pojawiają się tylko tam, gdzie funkcja już pokazuje ich publicznie, jako identyfikator Discord. Członek, który sprzeciwił się przetwarzaniu danych, jest zawsze pokazywany jako anonimowy, jak poniżej. Nazwy, wiadomości, tickety i odpowiedzi z formularzy nigdy nie są częścią API.
{ "id": null, "anonymous": true }
Limity
Limity zależą od planu serwera. Premium 1: aktywnych tokenów 2, żądań na minutę na token 60. Premium 2: tokenów 5, 120 na minutę. Premium 3: tokenów 10, 300 na minutę. Darmowy okres próbny lub serwer sponsorowany liczy się jako Premium 1. Każdy adres IP może wykonać 300 żądań na minutę. Po przekroczeniu dostaniesz 429 z nagłówkiem Retry-After. Obniżenie planu nie unieważnia żadnego tokenu: te, które masz, nadal działają, tylko nowe są zablokowane, dopóki nie będziesz poniżej limitu. Serwer potrzebuje płatnego planu lub aktywnego okresu próbnego.
Pamięć podręczna
Odpowiedzi mają ETag i krótką prywatną pamięć podręczną. Wyślij If-None-Match, aby dostać 304, gdy nic się nie zmieniło. Odpytywanie co 30–60 sekund w zupełności wystarcza.
Przeglądarki i CORS
Wywołuj API z własnego serwera. CORS jest domyślnie wyłączony. Jeśli strona musi wywołać API z przeglądarki odwiedzającego, ustaw jedną dozwoloną stronę w tokenie; żądania z każdego innego źródła są odrzucane. Wszystko na stronie internetowej jest widoczne dla odwiedzających.
Twój token, plan i limity
GET /me nie sprawdza planu. Oprócz samego tokenu zwraca plan (premium1, premium2, premium3 lub none), limits (tokens i perMinute tego planu) oraz tokensUsed (aktywne tokeny serwera). rateLimitPerMin to tempo, jakie ten token ma w tej chwili.
{ "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 } }
Identyfikatory żądań
Każda odpowiedź niesie nagłówek X-Request-Id. Jeśli wyślesz własny X-Request-Id (do 64 liter, cyfr i znaków . _ : -), zostanie zachowany, w przeciwnym razie zostanie wygenerowany. Błędy powtarzają go jako requestId. Podaj go, kontaktując się z pomocą.
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" }
Błędy
Błędy to JSON z ok: false, stabilnym kodem w code (error zawiera tę samą wartość), krótkim komunikatem i requestId. Decyduj według kodu, nigdy według tekstu komunikatu.
400 bad_request / bad_cursor | Któryś parametr jest nieprawidłowy (limit, cursor, status lub id). |
401 unauthorized / invalid_token | Brak tokenu, jest uszkodzony, nieznany lub unieważniony. |
403 guild_mismatch | Serwer (guild) w ścieżce nie jest serwerem tokenu. |
403 missing_scope | Token nie ma zakresu wymaganego przez ten punkt końcowy. |
403 origin_not_allowed | Nagłówek Origin nie pasuje do dozwolonej strony tokenu. |
403 plan_required | Serwer nie ma płatnego planu ani aktywnego okresu próbnego. |
403 feature_not_in_plan | Ta funkcja nie jest częścią planu serwera. |
404 not_found / shop_not_enabled | Nic tu nie ma (albo sklep nie jest włączony). |
405 method_not_allowed | Dostępne jest tylko GET; API jest tylko do odczytu. |
429 rate_limited | Za dużo żądań. Poczekaj tyle sekund, ile podaje Retry-After. |
503 unavailable | Chwilowo niedostępne. Spróbuj później. |