Přejít na hlavní obsah
D1 Arena

D1 Arena

Loading...

D1 Arena

Vývojářské rozhraní API

Společenství

Vývojářské rozhraní API

Vytvářejte roboty, překryvy, nástroje pro streamování a integrace s daty D1Arena.

Autentizace

Všechny požadavky API vyžadují klíč API předaný v záhlaví X-API-Key / Authorization: Bearer.

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

Chcete-li vytvořit klíč API, přejděte na Nastavení vývojáře na hlavním panelu. Můžete mít až 5 klíčů.

Požadavky API jsou omezeny rychlostí na klíč API. Když limit překročíte, požadavky vrátí 429 Too Many Requests se záhlavím Retry-After.

Základní URL

https://d1arena.com/api/v1

Všechny koncové body vracejí JSON. Stránkované koncové body zahrnují objekt meta s current_page, last_page a total.

Proudy

GET /streams
Seznam aktuálně živých přenosů. Podporuje stránkování a filtrování kategorií.
ParametrTypPopis
category_idintegerFiltrujte podle ID hry/kategorie
limitintegerPočet výsledků na stránku (výchozí: 20)
pageintegerČíslo stránky
Odezva
{ "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}
Získejte živý stav jednoho streamera a podrobnosti o streamu podle uživatelského jména nebo slimáka.
Odezva
{ "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" } }

kategorie

GET /categories
Seznam všech kategorií her. Podporuje vyhledávání a stránkování.
ParametrTypPopis
searchstringFiltrujte kategorie podle názvu
limitintegerPočet výsledků na stránku (výchozí: 50)
Odezva
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Uživatelé

GET /users/{slug}
Získejte veřejný profil hráče a soutěžní statistiky podle uživatelského jména nebo slimáka.
Odezva
{ "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 } } }

Klipy

GET /clips
Seznam veřejných klipů. Podporuje filtrování podle streamu a kategorie.
ParametrTypPopis
streamer_idintegerFiltrujte klipy podle ID uživatele streamera
category_idintegerFiltrujte podle ID hry/kategorie
limitintegerPočet výsledků na stránku (výchozí: 20)
Odezva
{ "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}
Získejte podrobnosti o jediném klipu pomocí slimáka.
Odezva
{ "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" } } }

Turnaje

GET /tournaments
Seznam turnajů. Podporuje filtrování podle stavu a ligy.
ParametrTypPopis
statusstringFiltrovat podle stavu (např. open, in_progress, completed)
league_idintegerFiltrujte podle ID ligy
limitintegerPočet výsledků na stránku (výchozí: 20)
Odezva
{ "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}
Získejte podrobnosti o turnaji a počet účastníků.
Odezva
{ "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 } }

Žebříček ELO

GET /elo/leaderboard
Získejte žebříček hodnocený ELO. Volitelně filtrujte podle kategorie hry.
ParametrTypPopis
category_idintegerFiltrujte podle ID hry/kategorie
limitintegerPočet výsledků (výchozí: 50)
Odezva
{ "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 } }

ligy

GET /leagues
Seznam lig s volitelnými filtry stavu a kategorií.
ParametrTypPopis
statusstringFiltrujte podle stavu ligy
category_idintegerFiltrujte podle ID hry/kategorie
limitintegerPočet výsledků na stránku (výchozí: 20)
Odezva
{ "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
Získejte pořadí ligy (pořadí hráčů podle bodů).
Odezva
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Odezvy na chyby

Všechny chyby vracejí konzistentní obálku JSON. Objekt error vždy obsahuje strojově čitelný code a člověkem čitelný message.

Formát odezvy na chybu
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Formát chyby ověření (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."] } } }

Stavové kódy

200
OK — Žádost byla úspěšná. Odpověď obsahuje požadovaná data.
400
Špatný požadavek — Požadavek má nesprávný formát nebo chybí požadované parametry. Podrobnosti naleznete v error.message.
401
Neoprávněný — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Zakázáno — Váš klíč API byl deaktivován nebo nemá oprávnění pro tento zdroj. Zkontrolujte svůj Nastavení vývojáře.
404
Nenalezeno — Požadovaný zdroj neexistuje. Ověřte cestu slug, ID nebo koncový bod.
422
Chyba ověření — Ověření parametrů požadavku se nezdařilo. Objekt error.errors mapuje názvy polí na jejich konkrétní problémy.
429
Sazba omezená — Příliš mnoho požadavků. Záhlaví Retry-After udává, kolik sekund se má čekat, než to zkusíte znovu.
500
Chyba serveru — Na naší straně došlo k neočekávané chybě. Pokud to přetrvává, kontaktujte podporu.

Odkaz na chybové kódy

kódStav HTTPPopis
invalid_api_key401Klíč API chybí, má nesprávný formát nebo neexistuje
api_key_disabled403Klíč API byl odvolán nebo zakázán
not_found404Požadovaný zdroj nebyl nalezen
validation_error422Jeden nebo více parametrů požadavku je neplatných
rate_limited429U tohoto klíče API byl překročen limit počtu požadavků
server_error500Interní chyba serveru – zkuste to znovu nebo kontaktujte podporu

Omezení sazby

Požadavky API jsou omezeny rychlostí na klíč API. Když limit překročíte, požadavky vrátí 429 Too Many Requests se záhlavím Retry-After.

Limity podle úrovně

TierPožadavky / minuta (Výchozí)Max Keys
Startér (zdarma)605
PRO605
konečný605
Partner605

Záhlaví limitu sazby

Požadavky API jsou omezeny rychlostí na klíč API. Když limit překročíte, požadavky vrátí 429 Too Many Requests se záhlavím Retry-After.

ZáhlavíPopis
Retry-AfterSekundy čekání před dalším pokusem (přítomno pouze u 429 odpovědí)

Nejlepší postupy

Tipy, jak dodržet limity:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Přihlaste se k odběru webhooks pro události v reálném čase namísto koncových bodů hlasování.
  • Dávkové požadavky tam, kde je to možné – pomocí parametrů filtru získáte přesně to, co potřebujete, za méně hovorů.

Webhooky (EventSub)

Přihlaste se k odběru oznámení push v reálném čase namísto dotazování. Když dojde k události, D1Arena odešle HTTP POST na vaši URL zpětného volání s JSON datovou částí podepsanou pomocí HMAC-SHA256.

Nastavení

Vytvořte předplatné webhooku v Nastavení vývojáře. Každé předplatné vyžaduje:

  • Adresa URL zpětného volání — Veřejně přístupný koncový bod HTTPS na vašem serveru.
  • Události — Jeden nebo více typů událostí k odběru.

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

Formát užitečného zatížení

Každé doručení webhooku odesílá tělo JSON s touto strukturou:

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

Záhlaví

Každá dodávka obsahuje následující hlavičky pro směrování a ověření:

ZáhlavíPopis
Content-Typeapplication/json
X-D1Arena-EventTyp události (např. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hex digest nezpracovaného těla požadavku
X-D1Arena-Signature-VersionFormát podpisového klíče: v2 pro aktuální předplatná nebo v1-hashed-secret pro starší předplatná
X-D1Arena-Delivery-IdJedinečné UUID doručení — použijte pro deduplikaci
X-D1Arena-TimestampUnixové časové razítko, kdy byla událost odeslána

Ověřování podpisů

Před zpracováním webhooku vždy ověřte záhlaví X-D1Arena-Signature. Podpis je vypočítán jako HMAC-SHA256(raw_body, webhook_secret).

Pro dodávky v2 použijte tajný klíč whsec_ zobrazený při vytvoření předplatného. Pro doručení v1-hashed-secret před upgradem nejprve vypočítejte SHA256(whsec_secret) z tohoto původního tajného klíče a použijte výsledný hexadecimální výtah s malými písmeny jako klíč HMAC. Až to bude praktické, znovu vytvořte předplatné a přejděte 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)

Dostupné akce

UdálostPopis
stream.onlineVysílal streamer
stream.offlineStreamer přešel do režimu offline
channel.followUživatel sledoval kanál
channel.subscribeNové předplatné příznivců na kanálu
channel.tipSpropitné bylo zasláno streamerovi
tournament.startedTurnajové utkání začalo
tournament.endedTurnaj skončil
tournament.match.completedByl zaznamenán výsledek zápasu
clip.createdZ živého přenosu byl vytvořen nový klip
overdrive.startedD1 Frenzy začalo na kanálu
overdrive.level_upD1 Frenzy postoupil do další úrovně
overdrive.endedD1 Frenzy dokončeno nebo vypršela

Příklady užitečného zatížení událostí

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

Zásady doručení a opakování

PokusZpožděníPoznámky
1. (počáteční)OkamžitěOdesláno během několika sekund od události
2. (zkusit znovu)30 sekundPokud první pokus selže nebo vyprší časový limit
3. (zkusit znovu)2 minutyExponenciální ústup
4. (finále)10 minutPoslední pokus před označením jako neúspěšný
Important: Your endpoint must respond with a 2xx status within 10 sekund. Non-2xx responses or timeouts trigger a retry. After 10 po sobě jdoucích selhání, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Nastavení vývojáře.

Nejlepší postupy

  • Vždy ověřujte podpisy před zpracováním dat, aby se zabránilo falešným událostem.
  • Pro deduplikaci použijte Delivery-Id — opakované pokusy pošlou stejné ID, takže zpracovaná ID ukládejte, abyste se vyhnuli dvojímu zpracování.
  • Reagujte rychle, zpracujte asynchronně — okamžitě vraťte 200 OK a zpracujte obchodní logiku na pozadí.
  • Používejte pouze koncové body HTTPS — URL webhooku musí používat TLS. Zpětná volání HTTP jsou odmítnuta.
  • Zvládejte neznámé události s grácií — mohou být přidány nové typy událostí. Vraťte 200 pro nerozpoznané události, nikoli pro chybu.

D1 Frenzy

D1 Frenzy se spouští rychlými tipy a odběry, zatímco streamer vysílá. Postupuje přes 5 úrovní s rostoucími cíli.

GET /api/overdrive/{streamerId}

Získejte aktivní D1 Frenzy pro streamer. Pokud žádné, vrátí {"active": false}.

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

Cíle úrovně

úroveňBody
1100
2250
3500
41,000
52,000

D1 Frenzy — Body: Tip $1 → 100; Předplatné 500 × Tier. Doba trvání: 5 minut; Cooldown: 30 minut.

Rozšíření SDK

Vytvořte si vlastní panel a překryvná rozšíření, která mohou streameři nainstalovat na své stránky kanálu. Rozšíření běží v rámcích iframe v izolovaném prostoru a komunikují s hostitelskou stránkou prostřednictvím postMessage.

Začínáme

  1. Vytvořte klíč API v Nastavení vývojáře.
  2. Sestavte své rozšíření jako samostatnou stránku HTML hostovanou ve vaší doméně (vyžaduje HTTPS).
  3. Odešlete jej ke kontrole v sekci Moje rozšíření.
  4. Po schválení jej mohou streameři nainstalovat z Extension Marketplace.

Typy rozšíření

TypUmístěníChování
panelPod přehrávačem streamuViditelné při živém přenosu. Karta s plnou šířkou, výchozí výška 300 pixelů.
overlayPřes přehrávač videaViditelné naživo. Poloha/velikost ovládaná streamerem pomocí nástroje pro polohování překrytí.

postMessage API

Vaše rozšíření přijímá kontextová data automaticky při načítání. Implementujte tyto události:

Pro každou zprávu použijte přesný nadřazený původ D1Arena. Oficiální SDK automaticky odvozuje a ověřuje tento původ ze stránky pro vkládání.

Protože prvky iframe rozšíření záměrně používají neprůhledný původ karantény, hostitel D1Arena ověřuje přesné registrované okno prvku iframe. Kód rozšíření musí před přijetím kontextu stále ověřit nadřazené okno a přesný původ D1Arena.

1. Signálová připravenost

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

2. Přijměte kontext

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. Odeslání akcí (volitelné)

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

Rozsahy oprávnění

Uveďte, jaká data vaše rozšíření potřebuje. Recenzenti ověří, že váš kód odpovídá vašim deklarovaným oprávněním.

RozsahUděluje přístup k
read:streamStav streamu, název, kategorie
read:viewersPočet a seznam diváků
read:chatChatové zprávy (přes kanál Pusher)
read:clipsKlipy kanálu přes /api/clips/{slug}
read:tournamentsInformace o aktivním zápase přes /api/active-match/{id}
read:channelProfil kanálu, sledující, plán

Bezpečnostní požadavky

Rozšíření běží v sandboxed iframe s sandbox="allow-scripts". Vaše rozšíření nemůže přistupuje k souborům cookie, localStorage nebo odesílá ověřené požadavky na d1arena.com.
  • Je vyžadováno veřejné HTTPS — Vaše adresa URL iframe musí používat TLS a překládat pouze na adresy veřejné sítě.
  • Lidsky čitelný zdroj — Žádný obfuskovaný nebo pouze miniifikovaný JavaScript. Recenzenti musí být schopni číst váš kód.
  • Žádné externí načítání skriptu pokud není uvedeno ve vašem podání. Knihovny CDN (jQuery, Chart.js atd.) jsou v pořádku.
  • Žádná exfiltrace dat — Rozšíření nesmějí odesílat údaje o divácích do analytických nebo sledovacích služeb třetích stran.
  • Obsahová politika — Žádné reklamy, obsah NSFW, těžba kryptoměn nebo škodlivé chování.

Proces kontroly

StavVýznam
pendingOdesláno, čeká se na kontrolu správcem (obvykle 1–3 pracovní dny).
approvedSchváleno a viditelné na Extension Marketplace.
rejectedOdmítnuto s důvodem. Opravte problémy a odešlete znovu.
suspendedDočasně odstraněno z důvodu porušení zásad. Kontaktujte podporu.

Aktualizace verzí

Chcete-li aktualizovat schválené rozšíření, odstraňte aktuální verzi a odešlete novou se zvýšeným číslem verze. Nová verze prochází opět kontrolou.

Seznam změn

Sledujte změny API a nové funkce. Dodržujeme sémantické verzování a oznamujeme zásadní změny nejméně 30 dní předem.

v1.0březen 2026
  • Počáteční veřejné vydání API s ověřováním klíče API.
  • Streamy: Vypište živé přenosy a získejte podrobnosti o streamu podle slimáka.
  • Kategorie: Vyhledejte a vypište všechny kategorie her.
  • Uživatelé: Veřejné profily se soutěžními statistikami, hodnocením ELO a počtem medailí.
  • Klipy: Procházejte a získávejte podrobnosti o klipu s informacemi o streamerech/tvůrcích.
  • Turnaje: Seznam, filtrování podle stavu/ligy, získání počtu účastníků.
  • ELO žebříček: Globální žebříčky a žebříčky podle kategorií.
  • Ligy: Seznam lig s umístěním a rozdělením bodů.
  • D1 Frenzy: Stav Frenzy v reálném čase pro každého streamera.
  • Webhooky (EventSub): 12 typů událostí včetně streamů, kanálů, turnajů, klipů a událostí Frenzy.
  • Omezení sazby

Potřebujete pomoc?

Máte dotazy ohledně API? Kontaktujte nás.