Prijeđi na glavni sadržaj
D1 Arena

D1 Arena

Loading...

D1 Arena

API za razvojne programere

zajednica

API za razvojne programere

Izradite robote, slojeve, alate za strujanje i integracije s podacima D1Arena.

Autentifikacija

Svi API zahtjevi zahtijevaju API ključ proslijeđen u zaglavlju X-API-Key / Authorization: Bearer.

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

Da biste izradili API ključ, idite na Postavke razvojnog programera na svojoj nadzornoj ploči. Možete imati do 5 ključeva.

API zahtjevi ograničeni su brzinom po API ključu. Kada prekoračite ograničenje, zahtjevi vraćaju 429 Too Many Requests sa zaglavljem Retry-After.

Osnovni URL

https://d1arena.com/api/v1

Sve krajnje točke vraćaju JSON. Paginirane krajnje točke uključuju objekt meta s current_page, last_page i total.

Potoci

GET /streams
Popis trenutačnih prijenosa uživo. Podržava paginaciju i filtriranje kategorija.
ParametarVrstaOpis
category_idintegerFiltrirajte po ID-u igre/kategorije
limitintegerRezultati po stranici (zadano: 20)
pageintegerBroj stranice
Odgovor
{ "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}
Dobijte status uživo jednog streamera i pojedinosti o streamu prema korisničkom imenu ili slugu.
Odgovor
{ "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" } }

kategorije

GET /categories
Navedite sve kategorije igara. Podržava pretraživanje i označavanje stranica.
ParametarVrstaOpis
searchstringFiltrirajte kategorije prema nazivu
limitintegerRezultati po stranici (zadano: 50)
Odgovor
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Korisnici

GET /users/{slug}
Dobijte javni profil igrača i konkurentsku statistiku prema korisničkom imenu ili pužu.
Odgovor
{ "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 } } }

Isječci

GET /clips
Popis javnih isječaka. Podržava filtriranje prema streameru i kategoriji.
ParametarVrstaOpis
streamer_idintegerFiltrirajte isječke prema korisničkom ID-u streamera
category_idintegerFiltrirajte po ID-u igre/kategorije
limitintegerRezultati po stranici (zadano: 20)
Odgovor
{ "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}
Dohvatite pojedinosti o jednom isječku putem sluga.
Odgovor
{ "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" } } }

Turniri

GET /tournaments
Popis turnira. Podržava filtriranje prema statusu i ligi.
ParametarVrstaOpis
statusstringFiltriraj po statusu (npr. open, in_progress, completed)
league_idintegerFiltriraj po ID-u lige
limitintegerRezultati po stranici (zadano: 20)
Odgovor
{ "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}
Dobijte detalje turnira i broj sudionika.
Odgovor
{ "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 } }

ELO rang lista

GET /elo/leaderboard
Dobijte ELO rangiranu ploču s rezultatima. Opcionalno filtrirajte prema kategoriji igre.
ParametarVrstaOpis
category_idintegerFiltrirajte po ID-u igre/kategorije
limitintegerBroj rezultata (zadano: 50)
Odgovor
{ "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 } }

lige

GET /leagues
Popis liga s izbornim statusom i filtrima kategorija.
ParametarVrstaOpis
statusstringFiltrirajte prema statusu lige
category_idintegerFiltrirajte po ID-u igre/kategorije
limitintegerRezultati po stranici (zadano: 20)
Odgovor
{ "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
Dobijte poredak lige (poredak igrača po bodovima).
Odgovor
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Odgovori na pogreške

Sve pogreške vraćaju dosljednu JSON omotnicu. Objekt error uvijek sadrži strojno čitljiv code i čovjeku čitljiv message.

Format odgovora na pogrešku
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Format pogreške provjere (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."] } } }

Statusne šifre

200
OK — Zahtjev je uspio. Odgovor sadrži tražene podatke.
400
Loš zahtjev — Zahtjev je pogrešno oblikovan ili mu nedostaju potrebni parametri. Provjerite error.message za detalje.
401
Neovlašteno — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Zabranjeno — Vaš API ključ je onemogućen ili nema dozvolu za ovaj resurs. Provjerite svoje Postavke razvojnog programera.
404
Nije pronađeno — Traženi resurs ne postoji. Provjerite slag, ID ili put krajnje točke.
422
Pogreška provjere valjanosti — Validacija parametara zahtjeva nije uspjela. Objekt error.errors preslikava nazive polja na njihove specifične probleme.
429
Stopa ograničena — Previše zahtjeva. Zaglavlje Retry-After pokazuje koliko sekundi treba čekati prije ponovnog pokušaja.
500
Greška poslužitelja — Dogodila se neočekivana greška s naše strane. Ako ovo potraje, obratite se podršci.

Referenca kodova grešaka

ŠifraHTTP statusOpis
invalid_api_key401API ključ nedostaje, neispravan je ili ne postoji
api_key_disabled403API ključ je opozvan ili onemogućen
not_found404Zatraženi izvor nije moguće pronaći
validation_error422Jedan ili više parametara zahtjeva su nevažeći
rate_limited429Ograničenje stope zahtjeva premašeno za ovaj API ključ
server_error500Interna pogreška poslužitelja — pokušajte ponovno ili kontaktirajte podršku

Ograničenja stope

API zahtjevi ograničeni su brzinom po API ključu. Kada prekoračite ograničenje, zahtjevi vraćaju 429 Too Many Requests sa zaglavljem Retry-After.

Ograničenja prema razini

RazinaZahtjevi / minuta (Zadano)Max Keys
starter (besplatno)605
PRO605
Ultimativno605
Partner605

Zaglavlja ograničenja brzine

API zahtjevi ograničeni su brzinom po API ključu. Kada prekoračite ograničenje, zahtjevi vraćaju 429 Too Many Requests sa zaglavljem Retry-After.

ZaglavljeOpis
Retry-AfterSekunde čekanja prije ponovnog pokušaja (prisutno samo na 429 odgovora)

Najbolji primjeri iz prakse

Savjeti za zadržavanje unutar ograničenja:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Pretplatite se na webhooks za događaje u stvarnom vremenu umjesto anketiranja krajnjih točaka.
  • Skupni zahtjevi gdje je to moguće — upotrijebite parametre filtra kako biste dobili točno ono što trebate u manje poziva.

Web-dojavnici (EventSub)

Pretplatite se na push obavijesti u stvarnom vremenu umjesto anketiranja. Kada se dogodi događaj, D1Arena šalje HTTP POST na vaš URL povratnog poziva s JSON korisnim sadržajem potpisanim s HMAC-SHA256.

Postavljanje

Stvorite pretplate na webhook u Postavke razvojnog programera. Svaka pretplata zahtijeva:

  • URL povratnog poziva — Javno dostupna HTTPS krajnja točka na vašem poslužitelju.
  • Događaji — Jedna ili više vrsta događaja na koje se možete pretplatiti.

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

Format nosivosti

Svaka isporuka web-dojavnika šalje JSON tijelo s ovom strukturom:

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

Zaglavlja

Svaka isporuka uključuje sljedeća zaglavlja za usmjeravanje i provjeru:

ZaglavljeOpis
Content-Typeapplication/json
X-D1Arena-EventVrsta događaja (npr. stream.online)
X-D1Arena-SignatureHMAC-SHA256 heksadecimalni sažetak neobrađenog tijela zahtjeva
X-D1Arena-Signature-VersionFormat ključa za potpisivanje: v2 za trenutne pretplate ili v1-hashed-secret za stare pretplate
X-D1Arena-Delivery-IdJedinstveni UUID isporuke — koristite za deduplikaciju
X-D1Arena-TimestampUnix vremenska oznaka kada je događaj poslan

Ovjera potpisa

Uvijek provjerite zaglavlje X-D1Arena-Signature prije obrade web-dojavnika. Potpis se računa kao HMAC-SHA256(raw_body, webhook_secret).

Za v2 isporuke koristite tajnu whsec_ prikazanu prilikom kreiranja pretplate. Za isporuku v1-hashed-secret prije nadogradnje, prvo izračunajte SHA256(whsec_secret) iz te originalne tajne i upotrijebite rezultirajući heksadecimalni sažetak malim slovima kao ključ HMAC. Ponovno kreirajte pretplatu kada je to praktično za prelazak na 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)

Dostupni događaji

događajOpis
stream.onlineStreamer je emitirao uživo
stream.offlineStreamer je isključen
channel.followKorisnik je pratio kanal
channel.subscribeNova pretplata navijača na kanalu
channel.tipDojava je poslana streameru
tournament.startedPočela je utakmica turnira
tournament.endedTurnir je završen
tournament.match.completedZapisan je rezultat utakmice
clip.createdNovi isječak stvoren je iz prijenosa uživo
overdrive.startedD1 Frenzy je započeo na kanalu
overdrive.level_upD1 Frenzy je prešao na sljedeću razinu
overdrive.endedD1 Bjesnilo završeno ili isteklo

Primjeri nosivosti događaja

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

Politika isporuke i ponovnog pokušaja

pokušajKašnjenjeBilješke
1. (početno)OdmahPoslano unutar nekoliko sekundi od događaja
2. (ponovni pokušaj)30 sekundiAko prvi pokušaj ne uspije ili istekne vrijeme
3. (ponovni pokušaj)2 minuteEksponencijalno odstupanje
4. (finale)10 minutaZadnji pokušaj prije označavanja kao neuspjelog
Important: Your endpoint must respond with a 2xx status within 10 sekundi. Non-2xx responses or timeouts trigger a retry. After 10 uzastopnih neuspjeha, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Postavke razvojnog programera.

Najbolji primjeri iz prakse

  • Uvijek provjerite potpise prije obrade korisnih podataka kako bi se spriječili lažirani događaji.
  • Koristite Delivery-Id za deduplikaciju — ponovni pokušaji šalju isti ID, stoga pohranite obrađene ID-ove kako biste izbjegli dvostruku obradu.
  • Brzo odgovaranje, proces asinkrono — odmah vrati 200 OK i obradi poslovnu logiku u pozadinskom poslu.
  • Koristite samo HTTPS krajnje točke — URL-ovi webdojavnika moraju koristiti TLS. HTTP povratni pozivi su odbijeni.
  • Postupajte elegantno s nepoznatim događajima — mogu se dodati nove vrste događaja. Vrati 200 za neprepoznate događaje umjesto pogreške.

D1 Frenzy

D1 Frenzy pokreću brzi savjeti i pretplate dok je streamer uživo. Napreduje kroz 5 razina s povećanjem ciljeva.

GET /api/overdrive/{streamerId}

Nabavite aktivni D1 Frenzy za streamer. Vraća {"active": false} ako ništa.

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

Ciljevi razine

RazinaBodovi
1100
2250
3500
41,000
52,000

D1 Frenzy — Bodovi: Savjet $1 → 100; Pretplata 500 × Razina. Trajanje: 5 minuta; Hlađenje: 30 minuta.

SDK proširenja

Izgradite prilagođenu ploču i preklapanje proširenja koja streameri mogu instalirati na svoje stranice kanala. Proširenja se pokreću u iframeovima u sandboxu i komuniciraju sa stranicom domaćina putem postMessage.

Početak rada

  1. Stvorite API ključ u Postavke razvojnog programera.
  2. Izgradite svoje proširenje kao samostalnu HTML stranicu hostiranu na vašoj domeni (potreban je HTTPS).
  3. Pošaljite ga na pregled u odjeljak Moje ekstenzije.
  4. Nakon odobrenja, streameri ga mogu instalirati s Extension Marketplacea.

Vrste ekstenzija

VrstaLokacijaPonašanje
panelIspod stream playeraVidljivo kada je stream uživo. Kartica pune širine, zadana visina od 300 piksela.
overlayPreko video playeraVidljivo kada je uživo. Položaj/veličinu kontrolira streamer putem alata za pozicioniranje preklapanja.

API za postMessage

Vaše proširenje automatski prima podatke o kontekstu kada se učitava. Provedite ove događaje:

Koristite točno D1Arena nadređeno podrijetlo za svaku poruku. Službeni SDK automatski izvodi i potvrđuje ovo podrijetlo sa stranice za ugrađivanje.

Budući da iframes proširenja namjerno koriste neprozirno porijeklo sandboxa, host D1Arena provjerava autentičnost točno registriranog iframe prozora. Kod proširenja i dalje mora autentificirati nadređeni prozor i točno D1Arena podrijetlo prije prihvaćanja konteksta.

1. Signalna spremnost

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

2. Primite kontekst

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. Pošalji akcije (nije obavezno)

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

Opseg dopuštenja

Navedite koje podatke vaše proširenje treba. Recenzenti potvrđuju da vaš kod odgovara vašim deklariranim dopuštenjima.

OpsegOmogućuje pristup
read:streamStatus streama, naslov, kategorija
read:viewersBroj gledatelja i popis
read:chatPoruke chata (putem Pusher kanala)
read:clipsIsječci kanala putem /api/clips/{slug}
read:tournamentsInformacije o aktivnom meču putem /api/active-match/{id}
read:channelProfil kanala, pratitelji, raspored

Sigurnosni zahtjevi

Proširenja se izvode u iframe u sandboxu s sandbox="allow-scripts". Vaše proširenje ne može pristupa kolačićima, lokalnoj pohrani ili postavlja autentificirane zahtjeve d1arena.com.
  • Potreban javni HTTPS — Vaš iframe URL mora koristiti TLS i razriješiti se samo na javne mrežne adrese.
  • Čovjeku čitljiv izvor — Nema maskiranog ili umanjenog JavaScripta. Recenzenti moraju moći pročitati vaš kod.
  • Nema učitavanja vanjske skripte osim ako nije navedeno u vašem podnesku. CDN biblioteke (jQuery, Chart.js, itd.) su u redu.
  • Nema eksfiltracije podataka — Proširenja ne smiju slati podatke gledatelja uslugama treće strane za analizu ili praćenje.
  • Politika sadržaja — Bez oglasa, NSFW sadržaja, rudarenja kriptovaluta ili zlonamjernog ponašanja.

Pregled procesa

StatusZnačenje
pendingPoslano, čeka se pregled administratora (obično 1-3 radna dana).
approvedOdobreno i vidljivo na Extension Marketplaceu.
rejectedOdbijen s razlogom. Riješite probleme i ponovno pošaljite.
suspendedPrivremeno uklonjeno zbog kršenja pravila. Kontaktirajte podršku.

Ažuriranja verzije

Da biste ažurirali odobreno proširenje, izbrišite trenutnu verziju i pošaljite novu s povećanim brojem verzije. Nova verzija ponovno prolazi recenziju.

Dnevnik promjena

Pratite promjene API-ja i nove značajke. Pratimo semantičku verziju i najavljujemo prijelomne promjene najmanje 30 dana unaprijed.

v1.0ožujka 2026
  • Početno javno izdanje API-ja s provjerom autentičnosti API ključa.
  • Streamovi: Popis streamova uživo, dobivanje pojedinosti o streamerima po slugu.
  • Kategorije: pretražite i navedite sve kategorije igara.
  • Korisnici: Javni profili sa statistikom natjecanja, ELO ocjenom i brojem medalja.
  • Isječci: pregledajte i dohvatite pojedinosti o isječku s informacijama o streameru/kreatoru.
  • Turniri: popis, filtriranje po statusu/ligi, dobivanje broja sudionika.
  • ELO Leaderboard: Globalne i po kategorijama rangirane ljestvice.
  • Lige: Navedite lige s poretkom i raspodjelom bodova.
  • D1 Frenzy: status Frenzy u stvarnom vremenu za bilo kojeg streamera.
  • Web-dojavnici (EventSub): 12 vrsta događaja uključujući stream, kanal, turnir, isječak i Frenzy događaje.
  • Ograničenja stope

Trebate pomoć?

Pitanja o API? Kontaktirajte nas.