Gå til hovedinnhold
D1 Arena

D1 Arena

Loading...

D1 Arena

Utvikler API

Fellesskap

Utvikler API

Bygg roboter, overlegg, strømmeverktøy og integrasjoner med D1Arena-data.

Autentisering

Alle API-forespørsler krever en API-nøkkel som sendes i X-API-Key / Authorization: Bearer-overskriften.

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

For å opprette en API-nøkkel, gå til Utviklerinnstillinger i dashbordet. Du kan ha opptil 5 nøkler.

API-forespørsler er hastighetsbegrenset per API-nøkkel. Når du overskrider grensen, returnerer forespørsler 429 Too Many Requests med en Retry-After-overskrift.

Base URL

https://d1arena.com/api/v1

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

Strømmer

GET /streams
Liste for øyeblikket direktesendinger. Støtter paginering og kategorifiltrering.
ParameterTypeBeskrivelse
category_idintegerFiltrer etter spill-/kategori-ID
limitintegerResultater per side (standard: 20)
pageintegerSidetall
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 strømdetaljer etter brukernavn 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 alle spillkategorier. Støtter søk og paginering.
ParameterTypeBeskrivelse
searchstringFiltrer kategorier etter navn
limitintegerResultater per side (standard: 50)
Svar
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Brukere

GET /users/{slug}
Få en spillers offentlige profil og konkurransestatistikk etter brukernavn 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 } } }

Klipp

GET /clips
List opp offentlige klipp. Støtter filtrering etter streamer og kategori.
ParameterTypeBeskrivelse
streamer_idintegerFiltrer klipp etter streamerens bruker-ID
category_idintegerFiltrer etter spill-/kategori-ID
limitintegerResultater per 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å detaljer om et enkelt klipp 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 turneringer. Støtter filtrering etter status og liga.
ParameterTypeBeskrivelse
statusstringFiltrer etter status (f.eks. open, in_progress, completed)
league_idintegerFiltrer etter liga-ID
limitintegerResultater per 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 deltakerantall.
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-rangeringer

GET /elo/leaderboard
Få den ELO-rangerte ledertavlen. Filtrer eventuelt etter spillkategori.
ParameterTypeBeskrivelse
category_idintegerFiltrer etter spill-/kategori-ID
limitintegerAntall 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 valgfrie status- og kategorifiltre.
ParameterTypeBeskrivelse
statusstringFiltrer etter ligastatus
category_idintegerFiltrer etter spill-/kategori-ID
limitintegerResultater per 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å ligaplasseringer (spillerrangeringer etter poeng).
Svar
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Feilsvar

Alle feil returnerer en konsistent JSON-konvolutt. error-objektet inneholder alltid en maskinlesbar code og en menneskelesbar message.

Feilresponsformat
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Valideringsfeilformat (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 — Forespørselen ble godkjent. Svaret inneholder de forespurte dataene.
400
Dårlig forespørsel — Forespørselen er feil utformet eller mangler nødvendige parametere. Sjekk error.message for detaljer.
401
Uautorisert — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Forbudt — API-nøkkelen din er deaktivert eller mangler tillatelse for denne ressursen. Sjekk din Utviklerinnstillinger.
404
Ikke funnet — Den forespurte ressursen finnes ikke. Bekreft slug, ID eller endepunktsbane.
422
Valideringsfeil — Forespørselsparametere mislyktes ved validering. error.errors-objektet tilordner feltnavn til deres spesifikke problemer.
429
Sats begrenset — For mange forespørsler. Retry-After-overskriften angir hvor mange sekunder du skal vente før du prøver på nytt.
500
Serverfeil — Det oppstod en uventet feil hos oss. Hvis dette vedvarer, kontakt support.

Feilkodereferanse

KodeHTTP-statusBeskrivelse
invalid_api_key401API-nøkkelen mangler, er feil utformet eller eksisterer ikke
api_key_disabled403API-nøkkelen er tilbakekalt eller deaktivert
not_found404Den forespurte ressursen ble ikke funnet
validation_error422Én eller flere forespørselsparametere er ugyldige
rate_limited429Forespørselshastighetsgrensen er overskredet for denne API-nøkkelen
server_error500Intern serverfeil – prøv på nytt eller kontakt support

Satsgrenser

API-forespørsler er hastighetsbegrenset per API-nøkkel. Når du overskrider grensen, returnerer forespørsler 429 Too Many Requests med en Retry-After-overskrift.

Grenser etter nivå

NivåForespørsler / minutt (Standard)Max Keys
Starter (Gratis)605
PRO605
Ultimate605
Partner605

Rate Limit Headers

API-forespørsler er hastighetsbegrenset per API-nøkkel. Når du overskrider grensen, returnerer forespørsler 429 Too Many Requests med en Retry-After-overskrift.

OverskriftBeskrivelse
Retry-AfterSekunder å vente før du prøver på nytt (bare til stede på 429 svar)

Beste praksis

Tips for å holde deg innenfor grensene:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Abonner på webhooks for sanntidshendelser i stedet for avstemningsendepunkter.
  • Batchforespørsler der det er mulig – bruk filterparametere for å få nøyaktig det du trenger i færre anrop.

Webhooks (EventSub)

Abonner på push-varsler i sanntid i stedet for polling. Når en hendelse inntreffer, sender D1Arena en HTTP POST til din tilbakeringings-URL med en JSON-nyttelast signert med HMAC-SHA256.

Oppsett

Opprett webhook-abonnementer i Utviklerinnstillinger. Hvert abonnement krever:

  • Tilbakeringings-URL — Et offentlig tilgjengelig HTTPS-endepunkt på serveren din.
  • Hendelser — En eller flere hendelsestyper å abonnere på.

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

Nyttelastformat

Hver webhook-levering sender en JSON-kropp med denne strukturen:

{ "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 for ruting og verifisering:

OverskriftBeskrivelse
Content-Typeapplication/json
X-D1Arena-EventHendelsestype (f.eks. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hex-sammendrag av den rå forespørselsteksten
X-D1Arena-Signature-VersionSigneringsnøkkelformat: v2 for nåværende abonnementer eller v1-hashed-secret for eldre abonnementer
X-D1Arena-Delivery-IdUnik leverings-UUID — bruk for deduplisering
X-D1Arena-TimestampUnix-tidsstempel for når hendelsen ble sendt

Verifisering av signaturer

Bekreft alltid X-D1Arena-Signature-overskriften før du behandler en webhook. Signaturen beregnes som HMAC-SHA256(raw_body, webhook_secret).

For v2-leveranser, bruk hemmeligheten whsec_ som ble vist da abonnementet ble opprettet. For en forhåndsoppgradering av v1-hashed-secret-levering, beregner du først SHA256(whsec_secret) fra den opprinnelige hemmeligheten og bruker den resulterende sekskantede bokstaven med små bokstaver som HMAC-nøkkelen. Gjenopprett abonnementet når det er praktisk mulig å 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)

Tilgjengelige arrangementer

HendelseBeskrivelse
stream.onlineEn streamer gikk direkte
stream.offlineEn streamer ble offline
channel.followEn bruker fulgte en kanal
channel.subscribeNytt supporterabonnement på en kanal
channel.tipEt tips ble sendt til en streamer
tournament.startedEt turneringsspill har begynt
tournament.endedEn turnering er avsluttet
tournament.match.completedEt kampresultat ble registrert
clip.createdEt nytt klipp ble opprettet fra en direktesending
overdrive.startedD1 Frenzy startet på en kanal
overdrive.level_upD1 Frenzy avanserte til neste nivå
overdrive.endedD1 Frenzy fullført eller utløpt

Eksempler på begivenhetsnyttelast

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

Retningslinjer for levering og forsøk på nytt

ForsøkForsinkelseNotater
1. (initial)UmiddelbarSendt innen sekunder etter hendelsen
2. (forsøk på nytt)30 sekunderHvis første forsøk mislykkes eller går ut
3. (forsøk på nytt)2 minutterEksponentiell tilbakeslag
4. (finale)10 minutterSiste forsøk før merking som mislykket
Important: Your endpoint must respond with a 2xx status within 10 sekunder. Non-2xx responses or timeouts trigger a retry. After 10 feil på rad, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Utviklerinnstillinger.

Beste praksis

  • Kontroller alltid signaturer før du behandler nyttelast for å forhindre falske hendelser.
  • Bruk Delivery-Id for deduplisering — gjenforsøk sender samme ID, så lagre behandlede IDer for å unngå dobbeltbehandling.
  • Svar raskt, behandle asynkront — returner 200 OK umiddelbart og håndtere forretningslogikk i en bakgrunnsjobb.
  • Bruk bare HTTPS-endepunkter — webhook-URLer må bruke TLS. HTTP-tilbakekalling avvises.
  • Håndter ukjente hendelser elegant — nye hendelsestyper kan legges til. Returner 200 for ukjente hendelser i stedet for feil.

D1 Vanvidd

D1 Frenzy utløses av raske tips og abonnementer mens en streamer er live. Den går gjennom 5 nivåer med økende mål.

GET /api/overdrive/{streamerId}

Få den aktive D1 Frenzy for 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" }

Nivåmål

NivåPoeng
1100
2250
3500
41,000
52,000

D1 Vanvidd — Poeng: Tips $1 → 100; Abonnement 500 × Nivå. Varighet: 5 Minutter; Nedkjøling: 30 Minutter.

SDK for utvidelse

Bygg tilpassede panel- og overleggsutvidelser som streamere kan installere på kanalsidene sine. Utvidelser kjører i sandboxed iframes og kommuniserer med vertssiden via postMessage.

Komme i gang

  1. Opprett en API-nøkkel i Utviklerinnstillinger.
  2. Bygg utvidelsen din som en frittstående HTML-side på domenet ditt (HTTPS kreves).
  3. Send den inn for vurdering i Mine utvidelser-delen.
  4. Når den er godkjent, kan streamere installere den fra Extension Marketplace.

Utvidelsestyper

TypeBeliggenhetAtferd
panelUnder stream-spillerenSynlig når strømmen er direkte. Kort i full bredde, 300 px standardhøyde.
overlayOver videospillerenSynlig når live. Posisjon/størrelse kontrollert av streameren via overleggsposisjoneringsverktøyet.

postMessage API

Utvidelsen din mottar kontekstdata automatisk når den lastes inn. Implementer disse hendelsene:

Bruk den nøyaktige D1Arena overordnede opprinnelsen for hver melding. Den offisielle SDK utleder og validerer denne opprinnelsen fra innbyggingssiden automatisk.

Fordi utvidelses-iframes med vilje bruker en ugjennomsiktig sandkasse-opprinnelse, autentiserer D1Arena-verten det eksakte registrerte iframe-vinduet. Utvidelseskoden må fortsatt autentisere det overordnede vinduet og den nøyaktige D1Arena-opprinnelsen før den aksepterer kontekst.

1. Signalberedskap

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

2. Motta 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 (valgfritt)

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

Tillatelsesomfang

Erklær hvilke data utvidelsen din trenger. Anmeldere bekrefter at koden din samsvarer med de deklarerte tillatelsene dine.

OmfangGir tilgang til
read:streamStrømstatus, tittel, kategori
read:viewersSeertall og liste
read:chatChatmeldinger (via pusher-kanal)
read:clipsKanalklipp via /api/clips/{slug}
read:tournamentsAktiv kampinformasjon via /api/active-match/{id}
read:channelKanalprofil, følgere, tidsplan

Sikkerhetskrav

Utvidelser kjøres i en iframe med sandkasse med sandbox="allow-scripts". Din utvidelse kan ikke får tilgang til informasjonskapsler, localStorage, eller gjør autentiserte forespørsler til d1arena.com.
  • Offentlig HTTPS kreves — Din iframe-URL må bruke TLS og løses kun til offentlige nettverksadresser.
  • Menneskelig lesbar kilde — Ingen skjult eller minifisert JavaScript. Anmeldere må kunne lese koden din.
  • Ingen ekstern skript lasting med mindre det er oppgitt i innleveringen. CDN-biblioteker (jQuery, Chart.js, etc.) er fine.
  • Ingen dataeksfiltrering — Utvidelser må ikke sende seerdata til tredjeparts analyse- eller sporingstjenester.
  • Innholdspolicy — Ingen annonser, NSFW-innhold, utvinning av kryptovaluta eller ondsinnet oppførsel.

Gjennomgangsprosess

StatusMening
pendingSendt inn, venter på administratorvurdering (vanligvis 1–3 virkedager).
approvedGodkjent og synlig i Extension Marketplace.
rejectedAvvist med en grunn. Løs problemer og send inn på nytt.
suspendedMidlertidig fjernet på grunn av brudd på retningslinjene. Kontakt support.

Versjonsoppdateringer

For å oppdatere en godkjent utvidelse, slett gjeldende versjon og send inn en ny med et økt versjonsnummer. Den nye versjonen går gjennom gjennomgang igjen.

Endringslogg

Spor API-endringer og nye funksjoner. Vi følger semantisk versjonering og kunngjør bruddendringer minst 30 dager i forveien.

v1.0mars 2026
  • Innledende offentlig API-utgivelse med API-nøkkelautentisering.
  • Strømmer: List opp direktesendinger, få streamerdetaljer etter slug.
  • Kategorier: Søk og liste opp alle spillkategorier.
  • Brukere: Offentlige profiler med konkurransestatistikk, ELO-rangering og antall medaljer.
  • Klipp: Bla gjennom og hent klippdetaljer med informasjon om streamer/skaper.
  • Turneringer: List, filtrer etter status/liga, få deltakerantallet.
  • ELO-poengoversikt: Globale og rangerte ledertavler per kategori.
  • Ligaer: Vis ligaer med plasseringer og poengfordelinger.
  • D1 Frenzy: Sanntids Frenzy-status for enhver streamer.
  • Webhooks (EventSub): 12 hendelsestyper inkludert strømme, kanal, turneringer, klipp og Frenzy-arrangementer.
  • Satsgrenser

Trenger du hjelp?

Spørsmål om API? Kontakt oss.