Sviluppatori
Documentazione dell'API del Bot
Una piccola API in sola lettura per permettere ai proprietari di server di mostrare i dati del proprio server Discord sul loro sito, nei loro strumenti e nei widget.
Autenticazione
Crea un token nella pagina API del Bot della tua dashboard e invialo nell'header Authorization: Authorization: Bearer <token>. Un token appartiene a un server e legge solo quel server. Viene mostrato una volta; DayZ Hub conserva solo la sua impronta.
curl -H "Authorization: Bearer dhba_..." \ https://dayzhub.net/api/v1/bot/guilds/<guildId>
URL di base: https://dayzhub.net/api/v1/bot
Endpoint
| 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 |
Ogni risposta è JSON nella stessa busta. Le liste sono paginate con limit (da 1 a 100) e il cursore di page.nextCursor.
{ "ok": true, "data": [ ... ], "page": { "limit": 25, "hasMore": true, "nextCursor": "eyJpZCI6Ij..." } }
Scope
Ogni token ha solo gli scope che gli hai dato. Tutti sono in sola lettura; con questa API non si può cambiare nulla.
guild:read | Stato del piano ed elenco delle funzioni |
giveaways:read | Giveaway (attivi e conclusi) con il numero di partecipazioni |
tickets:read | Numero di ticket per stato e categoria (senza contenuto dei ticket) |
leveling:read | Classifica dei livelli (i membri che si sono opposti sono anonimi) |
shop:read | Prodotti pubblici del negozio di donazioni |
suggestions:read | Numero di suggerimenti per stato |
server-status:read | Stato pubblico del server di gioco (solo se elencato pubblicamente) |
Privacy dei membri
I membri compaiono solo dove la funzione li mostra già pubblicamente, come ID Discord. Un membro che si è opposto al trattamento dei dati è sempre mostrato come anonimo, come sotto. Nomi, messaggi, ticket e risposte dei moduli non fanno mai parte dell'API.
{ "id": null, "anonymous": true }
Limiti
I limiti seguono il piano del server. Premium 1: 2 token attivi, 60 richieste al minuto per token. Premium 2: 5 token, 120 al minuto. Premium 3: 10 token, 300 al minuto. Una prova gratuita o un server sponsorizzato conta come Premium 1. Ogni indirizzo IP può fare 300 richieste al minuto. Oltre il limite ricevi 429 con l'header Retry-After. Un piano che scende non revoca nessun token: quelli che hai continuano a funzionare, solo i nuovi sono bloccati finché non torni sotto il limite. Il server ha bisogno di un piano a pagamento o di una prova attiva.
Cache
Le risposte hanno un ETag e una breve cache privata. Invia If-None-Match per ricevere 304 quando nulla è cambiato. Interrogare ogni 30-60 secondi è più che sufficiente.
Browser e CORS
Chiama l'API dal tuo server. CORS è disattivato per impostazione predefinita. Se una pagina web deve chiamarla dal browser di un visitatore, imposta un sito consentito sul token; le richieste da qualsiasi altra origine vengono rifiutate. Tutto ciò che sta in una pagina web è visibile ai visitatori.
Il tuo token, il piano e i limiti
GET /me non controlla il piano. Oltre al token stesso restituisce plan (premium1, premium2, premium3 o none), limits (tokens e perMinute di quel piano) e tokensUsed (token attivi del server). rateLimitPerMin è la frequenza che questo token ha in questo momento.
{ "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 } }
ID di richiesta
Ogni risposta porta l'header X-Request-Id. Se invii un tuo X-Request-Id (fino a 64 lettere, cifre e . _ : -), viene mantenuto, altrimenti ne viene generato uno. Gli errori lo ripetono come requestId. Indicalo quando contatti il supporto.
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" }
Errori
Gli errori sono JSON con ok: false, un codice stabile in code (error contiene lo stesso valore), un breve messaggio e il requestId. Decidi in base al codice, mai in base al testo del messaggio.
400 bad_request / bad_cursor | Un parametro non è valido (limit, cursor, status o id). |
401 unauthorized / invalid_token | Token mancante, malformato, sconosciuto o revocato. |
403 guild_mismatch | La guild nel percorso non è la guild del token. |
403 missing_scope | Il token non ha lo scope richiesto da questo endpoint. |
403 origin_not_allowed | L'header Origin non corrisponde al sito consentito del token. |
403 plan_required | Il server non ha un piano a pagamento né una prova attiva. |
403 feature_not_in_plan | La funzione non fa parte del piano del server. |
404 not_found / shop_not_enabled | Qui non c'è nulla (o il negozio non è attivo). |
405 method_not_allowed | È disponibile solo GET; l'API è in sola lettura. |
429 rate_limited | Troppe richieste. Aspetta i secondi indicati in Retry-After. |
503 unavailable | Temporaneamente non disponibile. Riprova più tardi. |