Passa al contenuto principale
D1 Arena

D1 Arena

Loading...

D1 Arena

API per sviluppatori

Comunità

API per sviluppatori

Crea bot, overlay, strumenti di streaming e integrazioni con i dati D1Arena.

Autenticazione

Tutte le richieste API richiedono una chiave API passata nell'intestazione X-API-Key / Authorization: Bearer.

# Example request curl -H "X-API-Key: d1_your_api_key_here" \ https://d1arena.com/api/v1/streams

Per creare una chiave API, vai su Impostazioni sviluppatore nella tua dashboard. Puoi avere fino a 5 chiavi.

Le richieste API hanno una velocità limitata per chiave API. Quando superi il limite, le richieste restituiscono 429 Too Many Requests con un'intestazione Retry-After.

URL di base

https://d1arena.com/api/v1

Tutti gli endpoint restituiscono JSON. Gli endpoint impaginati includono un oggetto meta con current_page, last_page e total.

Flussi

GET /streams
Elenca gli streaming attualmente in diretta. Supporta l'impaginazione e il filtraggio delle categorie.
ParametroTipoDescrizione
category_idintegerFiltra per ID gioco/categoria
limitintegerRisultati per pagina (predefinito: 20)
pageintegerNumero di pagina
Risposta
{ "data": [ { "id": 42, "name": "ProGamer99", "user_slug": "progamer99", "profile_img": "profile/abc123.jpg", "stream_title": "Ranked Grind - Road to Champion", "stream_category_id": 5, "is_vertical_stream": false, "platform_tier": "pro" } ], "meta": { "current_page": 1, "last_page": 1, "total": 3 } }
GET /streams/{slug}
Ottieni lo stato live di un singolo streamer e i dettagli dello streaming tramite nome utente o slug.
Risposta
{ "data": { "user_id": 42, "name": "ProGamer99", "slug": "progamer99", "is_live": true, "stream_title": "Ranked Grind", "category_id": 5, "is_vertical": false, "platform_tier": "pro", "profile_img": "profile/abc123.jpg" } }

Categorie

GET /categories
Elenca tutte le categorie di giochi. Supporta la ricerca e l'impaginazione.
ParametroTipoDescrizione
searchstringFiltra le categorie per nome
limitintegerRisultati per pagina (impostazione predefinita: 50)
Risposta
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Utenti

GET /users/{slug}
Ottieni il profilo pubblico e le statistiche competitive di un giocatore tramite nome utente o slug.
Risposta
{ "data": { "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99", "profile_img": "profile/abc.jpg", "bio": "Competitive FPS player", "platform_tier": "pro", "is_live": "1", "stream_title": "Ranked", "gold": 3, "silver": 1, "bronze": 0 }, "stats": { "elo_rating": 1842, "total_tournaments": 27, "win_rate": 64.5, "total_earnings": 1250.00 } } }

Clip

GET /clips
Elenca clip pubbliche. Supporta il filtraggio per streamer e categoria.
ParametroTipoDescrizione
streamer_idintegerFiltra le clip in base all'ID utente dello streamer
category_idintegerFiltra per ID gioco/categoria
limitintegerRisultati per pagina (predefinito: 20)
Risposta
{ "data": [ { "id": 99, "streamer_id": 42, "stream_category_id": 5, "title": "Insane 1v4 clutch", "slug": "insane-1v4-clutch-abc", "duration": 28, "view_count": 412, "is_auto_clip": false, "created_at": "2026-03-15T18:30:00.000000Z", "streamer": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 156 } }
GET /clips/{slug}
Ottieni i dettagli di una singola clip tramite slug.
Risposta
{ "data": { "id": 99, "title": "Insane 1v4 clutch", "slug": "insane-1v4-clutch-abc", "description": "Final round comeback", "duration": 28, "view_count": 412, "streamer": { "id": 42, "name": "ProGamer99" }, "creator": { "id": 55, "name": "ClipMaster" }, "stream_category": { "id": 5, "name": "Call of Duty" } } }

Tornei

GET /tournaments
Elenco tornei. Supporta il filtraggio per stato e campionato.
ParametroTipoDescrizione
statusstringFiltra per stato (ad es. open, in_progress, completed)
league_idintegerFiltra per ID campionato
limitintegerRisultati per pagina (predefinito: 20)
Risposta
{ "data": [ { "id": 15, "title": "Friday Night Frenzy", "tournament_type": "single_elimination", "status": "open", "registration_fee": "5.00", "no_player": 32, "team": 0, "category": { "id": 5, "name": "Call of Duty" }, "start_date": "2026-03-28T20:00:00.000000Z" } ], "meta": { "current_page": 1, "last_page": 2, "total": 24 } }
GET /tournaments/{id}
Ottieni i dettagli del torneo e il conteggio dei partecipanti.
Risposta
{ "data": { "id": 15, "title": "Friday Night Frenzy", "tournament_type": "single_elimination", "status": "open", "registration_fee": "5.00", "no_player": 32, "team": 0 }, "meta": { "participant_count": 18 } }

Classifiche ELO

GET /elo/leaderboard
Ottieni la classifica classificata ELO. Facoltativamente filtra per categoria di gioco.
ParametroTipoDescrizione
category_idintegerFiltra per ID gioco/categoria
limitintegerNumero di risultati (predefinito: 50)
Risposta
{ "data": [ { "rank": 1, "user_id": 42, "name": "ProGamer99", "user_slug": "progamer99", "elo_rating": 2150, "wins": 45, "losses": 12, "win_rate": 78.9, "profile_img": "profile/abc123.jpg" } ], "meta": { "total": 312 } }

Leghe

GET /leagues
Elenca i campionati con filtri di stato e categoria opzionali.
ParametroTipoDescrizione
statusstringFiltra per stato del campionato
category_idintegerFiltra per ID gioco/categoria
limitintegerRisultati per pagina (predefinito: 20)
Risposta
{ "data": [ { "id": 3, "name": "Spring 2026 Pro League", "status": "active", "category": { "id": 5, "name": "Call of Duty" }, "total_participants": 48, "start_date": "2026-03-01", "end_date": "2026-05-31" } ], "meta": { "current_page": 1, "last_page": 1, "total": 6 } }
GET /leagues/{id}/standings
Ottieni la classifica del campionato (classifica dei giocatori in base ai punti).
Risposta
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Risposte agli errori

Tutti gli errori restituiscono una busta JSON coerente. L'oggetto error contiene sempre un code leggibile dalla macchina e un message leggibile dall'uomo.

Formato della risposta all'errore
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Formato errore di convalida (422)
{ "success": false, "error": { "code": "validation_error", "message": "The given data was invalid.", "errors": { "category_id": ["The category id must be an integer."], "limit": ["The limit must not be greater than 100."] } } }

Codici di stato

200
Va bene — Richiesta riuscita. La risposta contiene i dati richiesti.
400
Richiesta errata — La richiesta non è valida o mancano i parametri richiesti. Controlla error.message per i dettagli.
401
Non autorizzato — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Vietato — La tua chiave API è stata disabilitata o non dispone dell'autorizzazione per questa risorsa. Controlla il tuo Impostazioni sviluppatore.
404
Non trovato — La risorsa richiesta non esiste. Verifica lo slug, l'ID o il percorso dell'endpoint.
422
Errore di convalida — La convalida dei parametri della richiesta non è riuscita. L'oggetto error.errors associa i nomi dei campi ai loro problemi specifici.
429
Tariffa limitata — Troppe richieste. L'intestazione Retry-After indica quanti secondi attendere prima di riprovare.
500
Errore server — Da parte nostra si è verificato un errore imprevisto. Se questo persiste, contattare l'assistenza.

Riferimento ai codici di errore

CodiceStato HTTPDescrizione
invalid_api_key401La chiave API è mancante, non valida o non esiste
api_key_disabled403La chiave API è stata revocata o disabilitata
not_found404Impossibile trovare la risorsa richiesta
validation_error422Uno o più parametri della richiesta non sono validi
rate_limited429È stato superato il limite di frequenza delle richieste per questa chiave API
server_error500Errore interno del server: riprova o contatta l'assistenza

Limiti di velocità

Le richieste API hanno una velocità limitata per chiave API. Quando superi il limite, le richieste restituiscono 429 Too Many Requests con un'intestazione Retry-After.

Limiti per livello

LivelloRichieste/Minuto (Predefinito)Chiavi massime
Antipasto (Gratuito)605
PRO605
Definitivo605
Partner605

Intestazioni dei limiti di velocità

Le richieste API hanno una velocità limitata per chiave API. Quando superi il limite, le richieste restituiscono 429 Too Many Requests con un'intestazione Retry-After.

IntestazioneDescrizione
Retry-AfterSecondi di attesa prima di riprovare (presente solo su 429 risposte)

Migliori pratiche

Suggerimenti per rimanere entro i limiti:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Iscriviti a webhooks per eventi in tempo reale invece di eseguire il polling degli endpoint.
  • Richieste batch ove possibile: utilizza i parametri di filtro per ottenere esattamente ciò di cui hai bisogno con meno chiamate.

Webhook (EventSub)

Iscriviti alle notifiche push in tempo reale invece dei sondaggi. Quando si verifica un evento, D1Arena invia un POST HTTP al tuo URL di richiamata con un payload JSON firmato con HMAC-SHA256.

Impostare

Crea sottoscrizioni webhook in Impostazioni sviluppatore. Ogni abbonamento richiede:

  • URL di richiamata — Un endpoint HTTPS accessibile pubblicamente sul tuo server.
  • Eventi — Uno o più tipi di eventi a cui iscriversi.

You'll receive a whsec_ signing secret upon creation. Store it securely — it's shown only once.

Formato del carico utile

Ogni consegna del webhook invia un corpo JSON con questa struttura:

{ "id": "evt_a1b2c3d4e5f6", "event": "stream.online", "created_at": "2026-03-23T14:30:00Z", "data": { // Event-specific fields (see examples below) } }

Intestazioni

Ogni consegna include le seguenti intestazioni per l'instradamento e la verifica:

IntestazioneDescrizione
Content-Typeapplication/json
X-D1Arena-EventTipo di evento (ad esempio stream.online)
X-D1Arena-SignatureDigest esadecimale HMAC-SHA256 del corpo della richiesta non elaborata
X-D1Arena-Signature-VersionFormato della chiave di firma: v2 per gli abbonamenti attuali o v1-hashed-secret per gli abbonamenti legacy
X-D1Arena-Delivery-IdUUID di consegna univoco: da utilizzare per la deduplicazione
X-D1Arena-TimestampTimestamp Unix di quando è stato inviato l'evento

Verifica delle firme

Verifica sempre l'intestazione X-D1Arena-Signature prima di elaborare un webhook. La firma viene calcolata come HMAC-SHA256(raw_body, webhook_secret).

Per le consegne v2, utilizza il segreto whsec_ mostrato al momento della creazione dell'abbonamento. Per una consegna pre-aggiornamento v1-hashed-secret, calcola prima SHA256(whsec_secret) da quel segreto originale e utilizza il digest esadecimale minuscolo risultante come chiave HMAC. Ricrea l'abbonamento quando possibile per passare a v2.

PHP
// Get the raw body and signature header $payload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_D1ARENA_SIGNATURE'] ?? ''; // Compute expected signature $expected = hash_hmac('sha256', $payload, $webhookSecret); // Constant-time comparison to prevent timing attacks if (!hash_equals($expected, $signature)) { http_response_code(401); exit('Invalid signature'); } $event = json_decode($payload, true);
Node.js
const crypto = require('crypto'); app.post('/webhook', (req, res) => { const payload = req.rawBody; // Ensure raw body is available const signature = req.headers['x-d1arena-signature']; const expected = crypto .createHmac('sha256', WEBHOOK_SECRET) .update(payload) .digest('hex'); if (!crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) )) { return res.status(401).send('Invalid signature'); } const event = JSON.parse(payload); // Process event... res.status(200).send('OK'); });
Pitone
import hmac, hashlib, json def handle_webhook(request): payload = request.body signature = request.headers.get('X-D1Arena-Signature', '') expected = hmac.new( WEBHOOK_SECRET.encode(), payload, hashlib.sha256 ).hexdigest() if not hmac.compare_digest(expected, signature): return HttpResponse(status=401) event = json.loads(payload) # Process event... return HttpResponse(status=200)

Eventi disponibili

EventoDescrizione
stream.onlineUno streamer è andato in diretta
stream.offlineUno streamer è andato offline
channel.followUn utente ha seguito un canale
channel.subscribeNuova iscrizione come sostenitore su un canale
channel.tipÈ stato inviato un suggerimento a uno streamer
tournament.startedÈ iniziato un match play del torneo
tournament.endedUn torneo si è concluso
tournament.match.completedÈ stato registrato il risultato di una partita
clip.createdÈ stata creata una nuova clip da un live streaming
overdrive.startedD1 Frenzy è iniziato su un canale
overdrive.level_upD1 Frenzy è avanzato al livello successivo
overdrive.endedD1 Frenesia completata o scaduta

Esempi di payload di eventi

stream.online

{ "id": "evt_a1b2c3d4e5f6", "event": "stream.online", "created_at": "2026-03-23T14:30:00Z", "data": { "user_id": 42, "user_slug": "progamer99", "name": "ProGamer99", "stream_title": "Ranked Grind - Road to Champion", "category_id": 5, "category_name": "Call of Duty", "protocol": "RTMP", "started_at": "2026-03-23T14:30:00Z" } }

stream.offline

{ "id": "evt_f6e5d4c3b2a1", "event": "stream.offline", "created_at": "2026-03-23T17:45:00Z", "data": { "user_id": 42, "user_slug": "progamer99", "duration_seconds": 11700, "vod_id": 281 } }

channel.follow

{ "id": "evt_c1d2e3f4a5b6", "event": "channel.follow", "created_at": "2026-03-23T15:10:00Z", "data": { "follower_id": 88, "follower_slug": "newplayer", "followed_id": 42, "followed_slug": "progamer99" } }

channel.tip

{ "id": "evt_d1e2f3a4b5c6", "event": "channel.tip", "created_at": "2026-03-23T16:20:00Z", "data": { "streamer_id": 42, "streamer_slug": "progamer99", "tipper_id": 55, "tipper_slug": "clipmaster", "amount": "5.00", "currency": "USD", "message": "Great stream!" } }

tournament.match.completed

{ "id": "evt_e1f2a3b4c5d6", "event": "tournament.match.completed", "created_at": "2026-03-23T21:15:00Z", "data": { "tournament_id": 15, "tournament_title": "Friday Night Frenzy", "match_id": 204, "round": 2, "winner": { "id": 42, "slug": "progamer99", "name": "ProGamer99" }, "loser": { "id": 77, "slug": "rival_x", "name": "Rival_X" }, "score": "3-1" } }

clip.created

{ "id": "evt_b1c2d3e4f5a6", "event": "clip.created", "created_at": "2026-03-23T15:45:00Z", "data": { "clip_id": 99, "slug": "insane-1v4-clutch-abc", "title": "Insane 1v4 clutch", "duration": 28, "streamer_id": 42, "streamer_slug": "progamer99", "creator_id": 55, "creator_slug": "clipmaster", "category_id": 5 } }

Politica di consegna e nuovo tentativo

TentativoRitardoNote
1° (iniziale)ImmediatoInviato entro pochi secondi dall'evento
2° (riprova)30 secondiSe il primo tentativo fallisce o scade
3° (riprova)2 minutiBackoff esponenziale
4° (finale)10 minutiUltimo tentativo prima di essere contrassegnato come fallito
Important: Your endpoint must respond with a 2xx status within 10 secondi. Non-2xx responses or timeouts trigger a retry. After 10 fallimenti consecutivi, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Impostazioni sviluppatore.

Migliori pratiche

  • Verifica sempre le firme prima di elaborare i payload per prevenire eventi di spoofing.
  • Utilizzare il Delivery-Id per la deduplicazione — i tentativi inviano lo stesso ID, quindi archivia gli ID elaborati per evitare la doppia elaborazione.
  • Rispondi rapidamente, elabora in modo asincrono — restituisci immediatamente 200 OK e gestisci la logica aziendale in un lavoro in background.
  • Utilizza solo endpoint HTTPS — Gli URL webhook devono utilizzare TLS. Le richiamate HTTP vengono rifiutate.
  • Gestisci gli eventi sconosciuti con garbo — potrebbero essere aggiunti nuovi tipi di eventi. Restituisce 200 per eventi non riconosciuti invece che per errori.

D1 Frenesia

D1 Frenzy viene attivato da suggerimenti rapidi e abbonamenti mentre uno streamer è in diretta. Progredisce attraverso 5 livelli con obiettivi crescenti.

GET /api/overdrive/{streamerId}

Ottieni il D1 Frenzy attivo per uno streamer. Restituisce {"active": false} se nessuno.

{ "active": true, "level": 2, "progress": 150, "target": 250, "progress_pct": 60.0, "total_contributions": 8, "total_contributors": 5, "expires_at": "2026-03-22T15:30:00+00:00" }

Obiettivi di livello

LivelloPunti
1100
2250
3500
41,000
52,000

D1 Frenesia — Punti: Suggerimento $1 → 100; Abbonamento 500 × Livello. Durata: 5 Minuti; Raffreddamento: 30 Minuti.

SDK di estensione

Crea pannelli personalizzati ed estensioni sovrapposte che gli streamer possono installare sulle loro pagine canale. Le estensioni vengono eseguite in iframe sandbox e comunicano con la pagina host tramite postMessage.

Come iniziare

  1. Crea una chiave API in Impostazioni sviluppatore.
  2. Crea la tua estensione come pagina HTML autonoma ospitata sul tuo dominio (è richiesto HTTPS).
  3. Invialo per la revisione nella sezione Le mie estensioni.
  4. Una volta approvato, gli streamer possono installarlo dal Marketplace delle estensioni.

Tipi di estensione

TipoPosizioneComportamento
panelSotto lo stream playerVisibile quando lo streaming è live. Scheda a larghezza intera, altezza predefinita 300 px.
overlaySul lettore videoVisibile in diretta. Posizione/dimensione controllata dallo streamer tramite lo strumento di posizionamento sovrapposto.

API postMessage

La tua estensione riceve automaticamente i dati contestuali quando viene caricata. Implementa questi eventi:

Utilizza l'esatta origine principale D1Arena per ogni messaggio. Il SDK ufficiale deriva e convalida automaticamente questa origine dalla pagina di incorporamento.

Poiché gli iframe di estensione utilizzano intenzionalmente un'origine sandbox opaca, l'host D1Arena autentica l'esatta finestra iframe registrata. Il codice dell'estensione deve comunque autenticare la finestra principale e l'esatta origine D1Arena prima di accettare il contesto.

1. Prontezza del segnale

var d1ParentOrigin = 'https://d1arena.com'; // Tell the host page your extension is ready for context window.parent.postMessage({ type: 'D1_EXT_READY' }, d1ParentOrigin);

2. Ricevi il contesto

window.addEventListener('message', function(e) { if (e.source === window.parent && e.origin === d1ParentOrigin && e.data && e.data.type === 'D1_CONTEXT') { var ctx = e.data.payload; // ctx.channelId - Streamer's user ID // ctx.channelName - Streamer's display name // ctx.channelSlug - Streamer's URL slug // ctx.viewerId - Current viewer's ID (null if not logged in) // ctx.isLive - Whether the stream is currently live } });

3. Invia azioni (facoltativo)

// Redirect the host page (e.g. for a "Storm" button) window.parent.postMessage({ type: 'D1_EXT_ACTION', action: 'storm', target: 'username-slug' }, d1ParentOrigin);

Ambiti di autorizzazione

Dichiara di quali dati ha bisogno la tua estensione. I revisori verificano che il tuo codice corrisponda alle autorizzazioni dichiarate.

AmbitoConcede l'accesso a
read:streamStato dello streaming, titolo, categoria
read:viewersConteggio ed elenco degli spettatori
read:chatMessaggi di chat (tramite canale Pusher)
read:clipsClip del canale tramite /api/clips/{slug}
read:tournamentsInformazioni sulla partita attiva tramite /api/active-match/{id}
read:channelProfilo del canale, follower, pianificazione

Requisiti di sicurezza

Le estensioni vengono eseguite in un iframe sandbox con sandbox="allow-scripts". La tua estensione non può accede ai cookie, localStorage o effettua richieste autenticate a d1arena.com.
  • Pubblico HTTPS obbligatorio — L'URL iframe deve utilizzare TLS e risolvere solo indirizzi di rete pubblici.
  • Fonte leggibile dall'uomo — Nessun JavaScript offuscato o minimizzato. I revisori devono essere in grado di leggere il tuo codice.
  • Nessun caricamento di script esterno a meno che non sia dichiarato nella tua presentazione. Le librerie CDN (jQuery, Chart.js, ecc.) Vanno bene.
  • Nessuna esfiltrazione di dati — Le estensioni non devono inviare dati sui visualizzatori a servizi di analisi o di monitoraggio di terze parti.
  • Politica sui contenuti — Nessuna pubblicità, contenuto NSFW, mining di criptovaluta o comportamento dannoso.

Processo di revisione

StatoSignificato
pendingInviato, in attesa di revisione da parte dell'amministratore (in genere 1-3 giorni lavorativi).
approvedApprovato e visibile nel Marketplace delle estensioni.
rejectedRifiutato con motivazione. Risolvi i problemi e invia nuovamente.
suspendedRimosso temporaneamente per violazione delle norme. Contatta l'assistenza.

Aggiornamenti della versione

Per aggiornare un'estensione approvata, elimina la versione corrente e inviane una nuova con un numero di versione incrementato. La nuova versione viene nuovamente sottoposta a revisione.

Registro delle modifiche

Tieni traccia delle modifiche API e delle nuove funzionalità. Seguiamo il controllo delle versioni semantico e annunciamo le modifiche sostanziali con almeno 30 giorni di anticipo.

v1.0Marzo 2026
  • Rilascio iniziale dell'API pubblica con autenticazione della chiave API.
  • Streaming: elenca gli streaming live, ottieni i dettagli dello streamer tramite slug.
  • Categorie: cerca ed elenca tutte le categorie di giochi.
  • Utenti: profili pubblici con statistiche competitive, valutazione ELO e conteggio delle medaglie.
  • Clip: sfoglia e recupera i dettagli dei clip con le informazioni dello streamer/creatore.
  • Tornei: elenca, filtra per stato/campionato, ottieni il conteggio dei partecipanti.
  • Classifica ELO: classifiche globali e per categoria.
  • Legati: elenca i campionati con classifiche e suddivisione dei punti.
  • D1 Frenzy: stato Frenzy in tempo reale per qualsiasi streamer.
  • Webhook (EventSub): 12 tipi di eventi tra cui streaming, canali, tornei, clip e eventi Frenzy.
  • Limiti di velocità

Hai bisogno di aiuto?

Domande sul API? Contattaci.