Treci la conținutul principal
D1 Arena

D1 Arena

Loading...

D1 Arena

API pentru dezvoltatori

comunitate

API pentru dezvoltatori

Creați roboți, suprapuneri, instrumente de transmitere în flux și integrări cu datele D1Arena.

Autentificare

Toate solicitările API necesită o cheie API transmisă în antetul X-API-Key / Authorization: Bearer.

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

Pentru a crea o cheie API, accesați Setări pentru dezvoltatori din tabloul de bord. Puteți avea până la 5 chei.

Solicitările API sunt limitate la rate pentru fiecare cheie API. Când depășiți limita, solicitările returnează 429 Too Many Requests cu un antet Retry-After.

Adresa URL de bază

https://d1arena.com/api/v1

Toate punctele finale returnează JSON. Punctele finale paginate includ un obiect meta cu current_page, last_page și total.

Fluxuri

GET /streams
Listează fluxurile live în prezent. Acceptă paginarea și filtrarea categoriei.
ParametruTipDescriere
category_idintegerFiltrați după ID joc/categorie
limitintegerRezultate pe pagină (implicit: 20)
pageintegerNumărul paginii
Răspuns
{ "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}
Obțineți starea live a unui singur streamer și detaliile streamului după numele de utilizator sau slug.
Răspuns
{ "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" } }

Categorii

GET /categories
Listați toate categoriile de jocuri. Acceptă căutarea și paginarea.
ParametruTipDescriere
searchstringFiltrați categoriile după nume
limitintegerRezultate pe pagină (implicit: 50)
Răspuns
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Utilizatori

GET /users/{slug}
Obțineți profilul public al unui jucător și statistici competitive după numele de utilizator sau slug.
Răspuns
{ "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 } } }

Clipuri

GET /clips
Listează clipuri publice. Acceptă filtrarea după streamer și categorie.
ParametruTipDescriere
streamer_idintegerFiltrați clipurile după ID-ul de utilizator al streamerului
category_idintegerFiltrați după ID joc/categorie
limitintegerRezultate pe pagină (implicit: 20)
Răspuns
{ "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}
Obțineți detaliile unui singur clip după slug.
Răspuns
{ "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" } } }

Turnee

GET /tournaments
Lista turnee. Acceptă filtrarea după statut și ligă.
ParametruTipDescriere
statusstringFiltrați după stare (de exemplu, open, in_progress, completed)
league_idintegerFiltrați după ID-ul ligii
limitintegerRezultate pe pagină (implicit: 20)
Răspuns
{ "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}
Obțineți detalii despre turneu și numărul de participanți.
Răspuns
{ "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 } }

Clasamentul ELO

GET /elo/leaderboard
Obțineți clasamentul clasat ELO. Opțional, filtrați după categoria de joc.
ParametruTipDescriere
category_idintegerFiltrați după ID joc/categorie
limitintegerNumăr de rezultate (implicit: 50)
Răspuns
{ "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 } }

Ligi

GET /leagues
Listează ligi cu filtre opționale de stare și categorie.
ParametruTipDescriere
statusstringFiltrați după statutul ligii
category_idintegerFiltrați după ID joc/categorie
limitintegerRezultate pe pagină (implicit: 20)
Răspuns
{ "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
Obțineți clasamente în ligă (clasamentul jucătorilor în funcție de puncte).
Răspuns
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Răspunsuri de eroare

Toate erorile returnează un plic JSON consistent. Obiectul error conține întotdeauna un code care poate fi citit de mașină și un message care poate fi citit de către om.

Format de răspuns la eroare
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Format eroare de validare (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."] } } }

Coduri de stare

200
OK — Solicitarea a reușit. Răspunsul conține datele solicitate.
400
Cerere proastă — Solicitarea este incorectă sau lipsesc parametrii necesari. Verificați error.message pentru detalii.
401
Neautorizat — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Interzis — Cheia dvs. API a fost dezactivată sau nu are permisiunea pentru această resursă. Verificați-vă Setări pentru dezvoltatori.
404
Nu a fost găsit — Resursa solicitată nu există. Verificați slug-ul, ID-ul sau calea punctului final.
422
Eroare de validare — Solicitarea parametrilor nu a reușit validarea. Obiectul error.errors mapează numele câmpurilor la problemele lor specifice.
429
Tarif limitat — Prea multe cereri. Antetul Retry-After indică câte secunde trebuie să aștepte înainte de a reîncerca.
500
Eroare de server — A apărut o eroare neașteptată din partea noastră. Dacă aceasta persistă, contactați asistența.

Referință coduri de eroare

CodStare HTTPDescriere
invalid_api_key401Cheia API lipsește, este malformată sau nu există
api_key_disabled403Cheia API a fost revocată sau dezactivată
not_found404Resursa solicitată nu a putut fi găsită
validation_error422Unul sau mai mulți parametri de solicitare sunt nevalidi
rate_limited429Limita ratei de solicitare a fost depășită pentru această cheie API
server_error500Eroare internă de server — vă rugăm să reîncercați sau să contactați asistența

Limite de rate

Solicitările API sunt limitate la rate pentru fiecare cheie API. Când depășiți limita, solicitările returnează 429 Too Many Requests cu un antet Retry-After.

Limite în funcție de nivel

NivelulCereri / Minut (Implicit)Chei maxime
Starter (gratuit)605
PRO605
Ultima605
Partener605

Antete pentru limita de rată

Solicitările API sunt limitate la rate pentru fiecare cheie API. Când depășiți limita, solicitările returnează 429 Too Many Requests cu un antet Retry-After.

AntetDescriere
Retry-AfterSecunde de așteptat înainte de a reîncerca (prezent doar pentru 429 de răspunsuri)

Cele mai bune practici

Sfaturi pentru a rămâne în limite:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Abonați-vă la webhooks pentru evenimente în timp real în loc de punctele finale de sondare.
  • Solicitări în loturi acolo unde este posibil — utilizați parametrii de filtrare pentru a obține exact ceea ce aveți nevoie în mai puține apeluri.

Webhooks (EventSub)

Abonați-vă la notificări push în timp real în loc să faceți sondaje. Când are loc un eveniment, D1Arena trimite un HTTP POST la adresa URL de apel invers cu o sarcină utilă JSON semnată cu HMAC-SHA256.

Configurare

Creați abonamente webhook în Setări pentru dezvoltatori. Fiecare abonament necesită:

  • Adresa URL de apel invers — Un punct final HTTPS accesibil public pe serverul dvs.
  • Evenimente — Unul sau mai multe tipuri de evenimente la care să vă abonați.

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

Format de încărcare utilă

Fiecare livrare webhook trimite un corp JSON cu această structură:

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

Anteturi

Fiecare livrare include următoarele antete pentru rutare și verificare:

AntetDescriere
Content-Typeapplication/json
X-D1Arena-EventTip de eveniment (de exemplu, stream.online)
X-D1Arena-SignatureHMAC-SHA256 digerare hexagonală a corpului cererii brute
X-D1Arena-Signature-VersionFormat cheie de semnare: v2 pentru abonamentele curente sau v1-hashed-secret pentru abonamentele vechi
X-D1Arena-Delivery-IdUUID unic de livrare — utilizat pentru deduplicare
X-D1Arena-TimestampMarca temporală Unix a când a fost trimis evenimentul

Verificarea semnăturilor

Verificați întotdeauna antetul X-D1Arena-Signature înainte de a procesa un webhook. Semnătura este calculată ca HMAC-SHA256(raw_body, webhook_secret).

Pentru livrările v2, utilizați secretul whsec_ afișat când a fost creat abonamentul. Pentru o livrare v1-hashed-secret înainte de actualizare, mai întâi calculați SHA256(whsec_secret) din acel secret original și utilizați rezumatul hexadecimal rezultat cu litere mici ca cheie HMAC. Recreează abonamentul atunci când este practic pentru a trece la 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'); });
Python
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)

Evenimente disponibile

EvenimentDescriere
stream.onlineUn streamer a intrat în direct
stream.offlineUn streamer a fost offline
channel.followUn utilizator a urmărit un canal
channel.subscribeAbonament nou pentru suporteri pe un canal
channel.tipUn pont a fost trimis unui streamer
tournament.startedA început un meci de turneu
tournament.endedS-a încheiat un turneu
tournament.match.completedA fost înregistrat un rezultat al meciului
clip.createdUn nou clip a fost creat dintr-un stream live
overdrive.startedD1 Frenzy a început pe un canal
overdrive.level_upD1 Frenzy a avansat la nivelul următor
overdrive.endedD1 Frenez s-a încheiat sau a expirat

Exemple de sarcină utilă pentru evenimente

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 de livrare și reîncercare

încercareÎntârziereNote
primul (inițial)ImediatTrimis în câteva secunde de la eveniment
al doilea (reîncercați)30 de secundeDacă prima încercare eșuează sau expiră
a treia (reîncercați)2 minuteRetragere exponențială
al 4-lea (finala)10 minuteUltima încercare înainte de marcarea ca eșuată
Important: Your endpoint must respond with a 2xx status within 10 secunde. Non-2xx responses or timeouts trigger a retry. After 10 eșecuri consecutive, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Setări pentru dezvoltatori.

Cele mai bune practici

  • Verificați întotdeauna semnăturile înainte de procesarea sarcinilor utile pentru a preveni evenimentele falsificate.
  • Utilizați ID-ul de livrare pentru deduplicare — reîncercările trimit același ID, așa că stocați ID-urile procesate pentru a evita dubla procesare.
  • Răspunde rapid, procesează asincron — returnați 200 OK imediat și gestionați logica de afaceri într-o lucrare de fundal.
  • Utilizați numai punctele finale HTTPS — URL-urile webhook trebuie să utilizeze TLS. Apelurile HTTP sunt respinse.
  • Gestionați cu grație evenimentele necunoscute — pot fi adăugate noi tipuri de evenimente. Returnați 200 pentru evenimente nerecunoscute și nu pentru erori.

D1 frenezie

D1 Frenzy este declanșată de sfaturi și abonamente rapide în timp ce un streamer este live. Progresează prin 5 niveluri cu ținte crescânde.

GET /api/overdrive/{streamerId}

Obțineți D1 Frenzy activ pentru un streamer. Returnează {"active": false} dacă nu există.

{ "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" }

Ținte de nivel

NivelPuncte
1100
2250
3500
41,000
52,000

D1 frenezie — Puncte: Sfat $1 → 100; Abonament 500 × Nivelul. Durata: 5 Minute; Cooldown: 30 Minute.

Extensie SDK

Creați panouri personalizate și extensii de suprapunere pe care streamerii le pot instala pe paginile lor de canal. Extensiile rulează în iframe sandbox și comunică cu pagina gazdă prin postMessage.

Noțiuni introductive

  1. Creați o cheie API în Setări pentru dezvoltatori.
  2. Creați-vă extensia ca o pagină HTML autonomă găzduită pe domeniul dvs. (este necesar HTTPS).
  3. Trimiteți-l spre examinare în secțiunea Extensiile mele.
  4. Odată aprobat, streamerii îl pot instala de pe Extension Marketplace.

Tipuri de extensii

TipLocațieComportament
panelSub playerul de fluxVizibil atunci când fluxul este live. Card cu lățime completă, înălțime implicită de 300 px.
overlayPeste playerul videoVizibil în direct. Poziția/dimensiunea controlată de streamer prin instrumentul de poziționare suprapusă.

API postMessage

Extensia dvs. primește automat date de context atunci când se încarcă. Implementați aceste evenimente:

Utilizați originea părinte exactă D1Arena pentru fiecare mesaj. SDK oficial derivă și validează această origine din pagina de încorporare automat.

Deoarece iframe-urile de extensie folosesc în mod intenționat o origine sandbox opac, gazda D1Arena autentifică fereastra iframe înregistrată exactă. Codul de extensie trebuie să autentifice în continuare fereastra părinte și exact originea D1Arena înainte de a accepta contextul.

1. Pregătirea semnalului

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

2. Primește context

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. Trimiteți acțiuni (opțional)

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

Domenii de aplicare

Declarați de ce date are nevoie extensia dvs. Examinatorii verifică că codul dvs. se potrivește cu permisiunile declarate.

Domeniul de aplicareOferă acces la
read:streamStarea fluxului, titlu, categorie
read:viewersNumărul de spectatori și lista
read:chatMesaje de chat (prin canalul Pusher)
read:clipsClipuri de canal prin /api/clips/{slug}
read:tournamentsInformații despre meciul activ prin /api/active-match/{id}
read:channelProfil canal, urmăritori, program

Cerințe de securitate

Extensiile rulează într-un iframe cu nisip cu sandbox="allow-scripts". Extensia dvs. nu poate accesează cookie-uri, localStorage sau face solicitări autentificate către d1arena.com.
  • Public HTTPS obligatoriu — Adresa URL iframe trebuie să utilizeze TLS și să se rezolve numai la adresele de rețea publice.
  • Sursă care poate fi citită de om — Fără JavaScript obscurcat sau minimizat. Recenziatorii trebuie să poată citi codul dvs.
  • Nu se încarcă script extern cu excepția cazului în care este declarat în depunerea dvs. Bibliotecile CDN (jQuery, Chart.js etc.) sunt bune.
  • Fără exfiltrare de date — Extensiile nu trebuie să trimită datele privitorului către servicii de analiză sau de urmărire terță parte.
  • Politica de conținut — Fără reclame, conținut NSFW, minare de criptomonede sau comportament rău intenționat.

Procesul de revizuire

StareÎnțeles
pendingTrimis, în așteptarea examinării de către administrator (de obicei, 1-3 zile lucrătoare).
approvedAprobat și vizibil în Piața de extensii.
rejectedRespins cu un motiv. Remediați problemele și trimiteți din nou.
suspendedEliminată temporar pentru încălcarea politicii. Contactați asistența.

Actualizări de versiune

Pentru a actualiza o extensie aprobată, ștergeți versiunea curentă și trimiteți una nouă cu un număr de versiune incrementat. Noua versiune trece din nou prin revizuire.

Jurnalul modificărilor

Urmăriți modificările API și noile funcții. Urmărim versiunea semantică și anunțăm modificări ulterioare cu cel puțin 30 de zile înainte.

v1.0martie 2026
  • Lansarea API publică inițială cu autentificare cu cheie API.
  • Streamuri: enumerați streamurile live, obțineți detalii despre streamer în funcție de slug.
  • Categorii: căutați și enumerați toate categoriile de jocuri.
  • Utilizatori: profiluri publice cu statistici competitive, evaluare ELO și număr de medalii.
  • Clipuri: răsfoiți și preluați detaliile clipurilor cu informații despre streamer/creator.
  • Turnee: listează, filtrează după statut/ligă, obține numărul de participanți.
  • Clasament ELO: Clasamente clasate global și pe categorii.
  • Ligi: enumerați ligile cu clasamente și defalcări de puncte.
  • D1 Frenzy: starea Frenzy în timp real pentru orice streamer.
  • Webhooks (EventSub): 12 tipuri de evenimente, inclusiv evenimente în flux, canal, turneu, clip și Frenzy.
  • Limite de rate

Ai nevoie de ajutor?

Întrebări despre API? Contactați-ne.