Spring til hovedindhold
D1 Arena

D1 Arena

Loading...

D1 Arena

Udvikler API

Fællesskab

Udvikler API

Byg bots, overlejringer, streamværktøjer og integrationer med D1Arena-data.

Autentificering

Alle API-anmodninger kræver en API-nøgle, der sendes i X-API-Key / Authorization: Bearer-headeren.

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

For at oprette en API-nøgle skal du gå til Udviklerindstillinger i dit betjeningspanel. Du kan have op til 5 nøgler.

API-anmodninger er hastighedsbegrænsede pr. API-nøgle. Når du overskrider grænsen, returnerer anmodninger 429 Too Many Requests med en Retry-After overskrift.

Basis URL

https://d1arena.com/api/v1

Alle endepunkter returnerer JSON. Sideinddelte endepunkter inkluderer et meta-objekt med current_page, last_page og total.

Strømme

GET /streams
Liste over aktuelle livestreams. Understøtter paginering og kategorifiltrering.
ParameterTypeBeskrivelse
category_idintegerFiltrer efter spil/kategori-id
limitintegerResultater pr. side (standard: 20)
pageintegerSidenummer
Svar
{ "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}
Få en enkelt streamers livestatus og stream detaljer efter brugernavn eller slug.
Svar
{ "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" } }

Kategorier

GET /categories
Liste over alle spilkategorier. Understøtter søgning og paginering.
ParameterTypeBeskrivelse
searchstringFiltrer kategorier efter navn
limitintegerResultater pr. side (standard: 50)
Svar
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Brugere

GET /users/{slug}
Få en spillers offentlige profil og konkurrencestatistik efter brugernavn eller slug.
Svar
{ "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 } } }

Klip

GET /clips
Liste over offentlige klip. Understøtter filtrering efter streamer og kategori.
ParameterTypeBeskrivelse
streamer_idintegerFiltrer klip efter streamerens bruger-id
category_idintegerFiltrer efter spil/kategori-id
limitintegerResultater pr. side (standard: 20)
Svar
{ "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}
Få et enkelt klips detaljer med slug.
Svar
{ "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" } } }

Turneringer

GET /tournaments
Liste over turneringer. Understøtter filtrering efter status og liga.
ParameterTypeBeskrivelse
statusstringFiltrer efter status (f.eks. open, in_progress, completed)
league_idintegerFiltrer efter liga-id
limitintegerResultater pr. side (standard: 20)
Svar
{ "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}
Få turneringsdetaljer og deltagerantal.
Svar
{ "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 Rankings

GET /elo/leaderboard
Få den ELO-rangerede leaderboard. Filtrer eventuelt efter spilkategori.
ParameterTypeBeskrivelse
category_idintegerFiltrer efter spil/kategori-id
limitintegerAntal resultater (standard: 50)
Svar
{ "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 } }

Ligaer

GET /leagues
Liste ligaer med valgfri status og kategorifiltre.
ParameterTypeBeskrivelse
statusstringFiltrer efter ligastatus
category_idintegerFiltrer efter spil/kategori-id
limitintegerResultater pr. side (standard: 20)
Svar
{ "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
Få ligastilling (spillerrangering efter point).
Svar
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Fejlsvar

Alle fejl returnerer en konsistent JSON-konvolut. Objektet error indeholder altid et maskinlæsbart code og et menneskelæsbart message.

Fejlsvarsformat
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Valideringsfejlformat (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."] } } }

Statuskoder

200
OK — Anmodningen lykkedes. Svaret indeholder de ønskede data.
400
Dårlig anmodning — Anmodningen er forkert udformet eller mangler nødvendige parametre. Tjek error.message for detaljer.
401
Uautoriseret — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Forbudt — Din API-nøgle er blevet deaktiveret eller mangler tilladelse til denne ressource. Tjek din Udviklerindstillinger.
404
Ikke fundet — Den anmodede ressource findes ikke. Bekræft slug, ID eller slutpunktsti.
422
Valideringsfejl — Anmodningsparametre mislykkedes ved validering. Objektet error.errors knytter feltnavne til deres specifikke problemer.
429
Sats begrænset — For mange anmodninger. Retry-After-overskriften angiver, hvor mange sekunder der skal ventes, før du prøver igen.
500
Serverfejl — Der opstod en uventet fejl hos os. Hvis dette fortsætter, kontakt support.

Fejlkoder reference

KodeHTTP-statusBeskrivelse
invalid_api_key401API-nøglen mangler, er forkert udformet eller findes ikke
api_key_disabled403API-nøglen er blevet tilbagekaldt eller deaktiveret
not_found404Den anmodede ressource blev ikke fundet
validation_error422En eller flere anmodningsparametre er ugyldige
rate_limited429Anmodningshastighedsgrænsen er overskredet for denne API-nøgle
server_error500Intern serverfejl — prøv venligst igen, eller kontakt support

Satsgrænser

API-anmodninger er hastighedsbegrænsede pr. API-nøgle. Når du overskrider grænsen, returnerer anmodninger 429 Too Many Requests med en Retry-After overskrift.

Grænser efter niveau

TierForespørgsler / minut (Standard)Max nøgler
Starter (Gratis)605
PRO605
Ultimativt605
Partner605

Rate Limit Headers

API-anmodninger er hastighedsbegrænsede pr. API-nøgle. Når du overskrider grænsen, returnerer anmodninger 429 Too Many Requests med en Retry-After overskrift.

OverskriftBeskrivelse
Retry-AfterSekunder at vente, før du prøver igen (kun til stede ved 429 svar)

Bedste praksis

Tips til at holde sig inden for grænserne:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Abonner på webhooks for begivenheder i realtid i stedet for afstemningsendepunkter.
  • Batch-anmodninger, hvor det er muligt – brug filterparametre for at få præcis det, du har brug for, med færre opkald.

Webhooks (EventSub)

Abonner på push-beskeder i realtid i stedet for afstemning. Når en hændelse opstår, sender D1Arena en HTTP POST til din tilbagekalds-URL med en JSON-nyttelast, der er signeret med HMAC-SHA256.

Opsætning

Opret webhook-abonnementer i Udviklerindstillinger. Hvert abonnement kræver:

  • Callback URL — Et offentligt tilgængeligt HTTPS-slutpunkt på din server.
  • Begivenheder — En eller flere begivenhedstyper at abonnere på.

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

Nyttelast format

Hver webhook-levering sender en JSON-body med denne struktur:

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

Overskrifter

Hver levering inkluderer følgende overskrifter til routing og verifikation:

OverskriftBeskrivelse
Content-Typeapplication/json
X-D1Arena-EventHændelsestype (f.eks. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hex-digest af den rå anmodningstekst
X-D1Arena-Signature-VersionSigneringsnøgleformat: v2 for nuværende abonnementer eller v1-hashed-secret for ældre abonnementer
X-D1Arena-Delivery-IdUnik leverings-UUID — brug til deduplikering
X-D1Arena-TimestampUnix-tidsstempel for, hvornår begivenheden blev sendt

Verifikation af signaturer

Bekræft altid X-D1Arena-Signature-headeren, før du behandler en webhook. Signaturen beregnes som HMAC-SHA256(raw_body, webhook_secret).

Til v2-leveringer skal du bruge hemmeligheden whsec_, der blev vist, da abonnementet blev oprettet. For en præ-opgradering v1-hashed-secret levering skal du først beregne SHA256(whsec_secret) fra den oprindelige hemmelighed og bruge den resulterende små hex-digest som HMAC nøglen. Genopret abonnementet, når det er praktisk muligt at flytte til 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)

Tilgængelige arrangementer

BegivenhedBeskrivelse
stream.onlineEn streamer gik live
stream.offlineEn streamer gik offline
channel.followEn bruger fulgte en kanal
channel.subscribeNyt supporterabonnement på en kanal
channel.tipEt tip blev sendt til en streamer
tournament.startedEn turneringskamp er begyndt
tournament.endedEn turnering er afsluttet
tournament.match.completedEt kampresultat blev registreret
clip.createdEt nyt klip blev oprettet fra en livestream
overdrive.startedD1 Frenzy startede på en kanal
overdrive.level_upD1 Frenzy avancerede til næste niveau
overdrive.endedD1 Frenzy afsluttet eller udløbet

Eksempler på begivenhedsnyttelast

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

Politik for levering og genforsøg

ForsøgForsinkelseNoter
1. (initial)ØjeblikkeligSendt inden for få sekunder efter begivenheden
2. (forsøg igen)30 sekunderHvis første forsøg mislykkes eller timeout
3. (forsøg igen)2 minutterEksponentiel tilbageslag
4. (finale)10 minutterSidste forsøg før markering som mislykket
Important: Your endpoint must respond with a 2xx status within 10 sekunder. Non-2xx responses or timeouts trigger a retry. After 10 fejl i træk, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Udviklerindstillinger.

Bedste praksis

  • Bekræft altid underskrifter før behandling af nyttelast for at forhindre falske hændelser.
  • Brug Delivery-Id til deduplikering — genforsøg sender det samme ID, så gem behandlede ID'er for at undgå dobbeltbehandling.
  • Reager hurtigt, bearbejd asynkront — returner 200 OK med det samme og håndtere forretningslogik i et baggrundsjob.
  • Brug kun HTTPS-endepunkter — webhook-URL'er skal bruge TLS. HTTP-tilbagekald afvises.
  • Håndter ukendte begivenheder med ynde — nye begivenhedstyper kan tilføjes. Returner 200 for ikke-genkendte hændelser i stedet for fejl.

D1 vanvid

D1 Frenzy udløses af hurtige tips og abonnementer, mens en streamer er live. Det skrider frem gennem 5 niveauer med stigende mål.

GET /api/overdrive/{streamerId}

Få den aktive D1 Frenzy til en streamer. Returnerer {"active": false} hvis ingen.

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

Niveaumål

NiveauPoints
1100
2250
3500
41,000
52,000

D1 vanvid — Points: Tip $1 → 100; Abonnement 500 × Tier. Varighed: 5 Referater; Nedkøling: 30 Referater.

Udvidelse SDK

Byg tilpassede panel- og overlejringsudvidelser, som streamere kan installere på deres kanalsider. Udvidelser kører i sandboxed iframes og kommunikerer med værtssiden via postMessage.

Kom godt i gang

  1. Opret en API-nøgle i Udviklerindstillinger.
  2. Byg din udvidelse som en selvstændig HTML-side, der hostes på dit domæne (HTTPS påkrævet).
  3. Send den til gennemgang i afsnittet Mine udvidelser.
  4. Når det er godkendt, kan streamere installere det fra Extension Marketplace.

Udvidelsestyper

TypeBeliggenhedAdfærd
panelUnder stream-afspillerenSynlig, når streamen er live. Kort i fuld bredde, 300 px standardhøjde.
overlayOver videoafspillerenSynlig når live. Position/størrelse styret af streameren via overlejringspositioneringsværktøjet.

postMessage API

Din udvidelse modtager automatisk kontekstdata, når den indlæses. Implementer disse begivenheder:

Brug den nøjagtige D1Arena overordnede oprindelse for hver meddelelse. Den officielle SDK udleder og validerer denne oprindelse fra indlejringssiden automatisk.

Fordi udvidelses-iframes med vilje bruger en uigennemsigtig sandbox-oprindelse, godkender D1Arena-værten det nøjagtige registrerede iframe-vindue. Udvidelseskoden skal stadig godkende det overordnede vindue og den nøjagtige D1Arena oprindelse, før konteksten accepteres.

1. Signalberedskab

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

2. Modtag 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. Send handlinger (valgfrit)

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

Tilladelsesomfang

Erklær, hvilke data din udvidelse har brug for. Korrekturlæsere bekræfter, at din kode matcher dine erklærede tilladelser.

OmfangGiver adgang til
read:streamStream status, titel, kategori
read:viewersSeertal og liste
read:chatChatbeskeder (via Pusher-kanal)
read:clipsKanalklip via /api/clips/{slug}
read:tournamentsAktive kampoplysninger via /api/active-match/{id}
read:channelKanalprofil, følgere, tidsplan

Sikkerhedskrav

Udvidelser kører i en iframe med sandkasse med sandbox="allow-scripts". Din udvidelse ikke kan får adgang til cookies, localStorage eller foretager godkendte anmodninger til d1arena.com.
  • Offentlig HTTPS påkrævet — Din iframe-URL skal bruge TLS og kun løses til offentlige netværksadresser.
  • Menneskelæselig kilde — Intet tilsløret eller minificeret JavaScript. Anmeldere skal kunne læse din kode.
  • Ingen ekstern script indlæsning medmindre det er angivet i din indsendelse. CDN-biblioteker (jQuery, Chart.js osv.) er fine.
  • Ingen dataeksfiltrering — Udvidelser må ikke sende seerdata til tredjepartsanalyse- eller sporingstjenester.
  • Indholdspolitik — Ingen annoncer, NSFW-indhold, cryptocurrency-mining eller ondsindet adfærd.

Gennemgangsprocessen

StatusBetydning
pendingIndsendt, afventer admingennemgang (typisk 1-3 hverdage).
approvedGodkendt og synlig på Extension Marketplace.
rejectedAfvist med en grund. Løs problemer, og send dem igen.
suspendedMidlertidigt fjernet på grund af politikovertrædelse. Kontakt support.

Versionsopdateringer

For at opdatere en godkendt udvidelse skal du slette den nuværende version og indsende en ny med et forhøjet versionsnummer. Den nye version gennemgår igen.

Ændringslog

Spor API-ændringer og nye funktioner. Vi følger semantisk versionering og annoncerer brudændringer mindst 30 dage i forvejen.

v1.0marts 2026
  • Indledende offentlig API-udgivelse med API-nøglegodkendelse.
  • Streams: Liste over livestreams, få streamerdetaljer efter slug.
  • Kategorier: Søg og liste alle spilkategorier.
  • Brugere: Offentlige profiler med konkurrencestatistikker, ELO-rating og medaljeantal.
  • Klip: Gennemse og hent klipdetaljer med info om streamer/skaber.
  • Turneringer: Liste, filtrer efter status/liga, få deltagerantal.
  • ELO Leaderboard: Globale ranglister og rangerede ranglister pr. kategori.
  • Ligaer: Liste ligaer med stillinger og pointopdelinger.
  • D1 Frenzy: Real-time Frenzy-status for enhver streamer.
  • Webhooks (EventSub): 12 begivenhedstyper inklusive stream-, kanal-, turnerings-, klip- og Frenzy-begivenheder.
  • Satsgrænser

Har du brug for hjælp?

Spørgsmål om API? Kontakt os.