Hoppa till huvudinnehållet
D1 Arena

D1 Arena

Loading...

D1 Arena

API för utvecklare

gemenskapen

API för utvecklare

Bygg botar, överlägg, strömningsverktyg och integrationer med D1Arena-data.

Autentisering

Alla API-förfrågningar kräver en API-nyckel som skickas i rubriken X-API-Key / Authorization: Bearer.

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

För att skapa en API-nyckel, gå till Utvecklarinställningar i din instrumentpanel. Du kan ha upp till 5 nycklar.

API-förfrågningar är hastighetsbegränsade per API-nyckel. När du överskrider gränsen returnerar förfrågningar 429 Too Many Requests med en Retry-After rubrik.

Bas-URL

https://d1arena.com/api/v1

Alla slutpunkter returnerar JSON. Paginerade slutpunkter inkluderar ett meta-objekt med current_page, last_page och total.

Strömmar

GET /streams
Lista för närvarande liveströmmar. Stöder paginering och kategorifiltrering.
ParameterTypBeskrivning
category_idintegerFiltrera efter spel-/kategori-ID
limitintegerResultat per sida (standard: 20)
pageintegerSidnummer
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 enskild streamers livestatus och streaminformation efter användarnamn eller snigel.
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
Lista alla spelkategorier. Stöder sökning och paginering.
ParameterTypBeskrivning
searchstringFiltrera kategorier efter namn
limitintegerResultat per sida (standard: 50)
Svar
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Användare

GET /users/{slug}
Få en spelares offentliga profil och konkurrensstatistik efter användarnamn eller snigel.
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
Lista offentliga klipp. Stöder filtrering efter streamer och kategori.
ParameterTypBeskrivning
streamer_idintegerFiltrera klipp efter streamers användar-ID
category_idintegerFiltrera efter spel-/kategori-ID
limitintegerResultat per sida (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å information om ett enstaka 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" } } }

Turneringar

GET /tournaments
Lista turneringar. Stöder filtrering efter status och liga.
ParameterTypBeskrivning
statusstringFiltrera efter status (t.ex. open, in_progress, completed)
league_idintegerFiltrera efter liga-ID
limitintegerResultat per sida (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å turneringsinformation och deltagarantal.
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-ranking

GET /elo/leaderboard
Skaffa den ELO-rankade topplistan. Filtrera eventuellt efter spelkategori.
ParameterTypBeskrivning
category_idintegerFiltrera efter spel-/kategori-ID
limitintegerAntal resultat (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 } }

Ligor

GET /leagues
Lista ligor med valfria status- och kategorifilter.
ParameterTypBeskrivning
statusstringFiltrera efter ligastatus
category_idintegerFiltrera efter spel-/kategori-ID
limitintegerResultat per sida (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å ligaställning (spelarrankningar efter poäng).
Svar
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Felsvar

Alla fel returnerar ett konsekvent JSON-kuvert. Objektet error innehåller alltid ett maskinläsbart code och ett mänskligt läsbart message.

Felsvarsformat
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Valideringsfelformat (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 — Begäran lyckades. Svaret innehåller de begärda uppgifterna.
400
Dålig begäran — Begäran är felaktig eller saknar nödvändiga parametrar. Kontrollera error.message för mer information.
401
Obehörig — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Förbjudet — Din API-nyckel har inaktiverats eller saknar behörighet för den här resursen. Kontrollera din Utvecklarinställningar.
404
Hittade inte — Den begärda resursen finns inte. Verifiera slug, ID eller ändpunktssökväg.
422
Valideringsfel — Begäran parametrar misslyckades valideringen. Objektet error.errors mappar fältnamn till deras specifika problem.
429
Begränsat pris — För många förfrågningar. Rubriken Retry-After anger hur många sekunder som ska vänta innan du försöker igen.
500
Serverfel — Ett oväntat fel inträffade hos oss. Om detta kvarstår, kontakta supporten.

Felkoder referens

KodHTTP-statusBeskrivning
invalid_api_key401API-nyckeln saknas, är felaktig eller finns inte
api_key_disabled403API-nyckeln har återkallats eller inaktiverats
not_found404Den begärda resursen kunde inte hittas
validation_error422En eller flera begärandeparametrar är ogiltiga
rate_limited429Begärans gräns har överskridits för denna API-nyckel
server_error500Internt serverfel — försök igen eller kontakta supporten

Prisgränser

API-förfrågningar är hastighetsbegränsade per API-nyckel. När du överskrider gränsen returnerar förfrågningar 429 Too Many Requests med en Retry-After rubrik.

Gränser efter nivå

TierFörfrågningar / minut (Standard)Max Keys
Förrätt (Gratis)605
PRO605
Ultimate605
Partner605

Rate Limit Headers

API-förfrågningar är hastighetsbegränsade per API-nyckel. När du överskrider gränsen returnerar förfrågningar 429 Too Many Requests med en Retry-After rubrik.

RubrikBeskrivning
Retry-AfterSekunder att vänta innan du försöker igen (endast närvarande vid 429 svar)

Bästa metoder

Tips för att hålla dig inom gränserna:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Prenumerera på webhooks för händelser i realtid istället för slutpunkter för polling.
  • Batchförfrågningar där det är möjligt – använd filterparametrar för att få exakt vad du behöver i färre samtal.

Webhooks (EventSub)

Prenumerera på push-meddelanden i realtid istället för polling. När en händelse inträffar skickar D1Arena ett HTTP POST till din återuppringnings-URL med en JSON-nyttolast signerad med HMAC-SHA256.

Inställning

Skapa webhook-prenumerationer i Utvecklarinställningar. Varje prenumeration kräver:

  • Callback URL — En offentligt tillgänglig HTTPS-slutpunkt på din server.
  • Händelser — En eller flera evenemangstyper att prenumerera på.

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

Nyttolastformat

Varje webhook-leverans skickar en JSON-kropp med denna struktur:

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

Rubriker

Varje leverans innehåller följande rubriker för routing och verifiering:

RubrikBeskrivning
Content-Typeapplication/json
X-D1Arena-EventHändelsetyp (t.ex. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hexadecimal sammanfattning av den råa begärandekroppen
X-D1Arena-Signature-VersionSigneringsnyckelformat: v2 för nuvarande prenumerationer eller v1-hashed-secret för äldre prenumerationer
X-D1Arena-Delivery-IdUnikt leverans-UUID — använd för deduplicering
X-D1Arena-TimestampUnix-tidsstämpel för när händelsen skickades

Verifiera signaturer

Verifiera alltid X-D1Arena-Signature-huvudet innan du bearbetar en webhook. Signaturen beräknas som HMAC-SHA256(raw_body, webhook_secret).

För v2 leveranser, använd hemligheten whsec_ som visades när prenumerationen skapades. För en föruppgradering av v1-hashed-secret-leverans, beräkna först SHA256(whsec_secret) från den ursprungliga hemligheten och använd den resulterande gemena hexadecimalen som HMAC-nyckeln. Återskapa prenumerationen när det är praktiskt möjligt att flytta till 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)

Tillgängliga evenemang

HändelseBeskrivning
stream.onlineEn streamer gick live
stream.offlineEn streamer gick offline
channel.followEn användare följde en kanal
channel.subscribeNy supporterprenumeration på en kanal
channel.tipEtt tips skickades till en streamer
tournament.startedEtt turneringsmatch har börjat
tournament.endedEn turnering har avslutats
tournament.match.completedEtt matchresultat registrerades
clip.createdEtt nytt klipp skapades från en livestream
overdrive.startedD1 Frenzy startade på en kanal
overdrive.level_upD1 Frenzy avancerade till nästa nivå
overdrive.endedD1 Frenzy avslutad eller förfallit

Exempel på evenemangsnyttolast

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

Policy för leverans och försök igen

FörsökFördröjningAnteckningar
1:a (initial)OmedelbartSkickas inom några sekunder efter händelsen
2:a (försök igen)30 sekunderOm första försöket misslyckas eller timeout
3:a (försök igen)2 minuterExponentiell backoff
4:a (final)10 minuterSista försöket innan markeringen som misslyckad
Important: Your endpoint must respond with a 2xx status within 10 sekunder. Non-2xx responses or timeouts trigger a retry. After 10 misslyckanden i rad, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Utvecklarinställningar.

Bästa metoder

  • Verifiera alltid signaturer innan du bearbetar nyttolaster för att förhindra falska händelser.
  • Använd Delivery-Id för deduplicering — återförsök skickar samma ID, så lagra bearbetade ID:n för att undvika dubbelbearbetning.
  • Svara snabbt, bearbeta asynkront — returnera 200 OK omedelbart och hantera affärslogik i ett bakgrundsjobb.
  • Använd endast HTTPS-slutpunkter — webhook-URL:er måste använda TLS. HTTP-återuppringningar avvisas.
  • Hantera okända händelser graciöst — nya händelsetyper kan läggas till. Returnera 200 för okända händelser snarare än fel.

D1 Frenzy

D1 Frenzy utlöses av snabba tips och prenumerationer medan en streamer är live. Den går vidare genom 5 nivåer med ökande mål.

GET /api/overdrive/{streamerId}

Skaffa den aktiva D1 Frenzy för en streamer. Returnerar {"active": false} om 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åPoäng
1100
2250
3500
41,000
52,000

D1 Frenzy — Poäng: Tips $1 → 100; Prenumeration 500 × Tier. Varaktighet: 5 Protokoll; Nedkylning: 30 Protokoll.

Tilläggs-SDK

Bygg anpassade panel- och överlagringstillägg som streamers kan installera på sina kanalsidor. Tillägg körs i sandlådeförsedda iframes och kommunicerar med värdsidan via postMessage.

Komma igång

  1. Skapa en API-nyckel i Utvecklarinställningar.
  2. Bygg ditt tillägg som en fristående HTML-sida på din domän (HTTPS krävs).
  3. Skicka in den för granskning i avsnittet Mina tillägg.
  4. När de har godkänts kan streamers installera den från Extension Marketplace.

Tilläggstyper

TypPlatsBeteende
panelNedanför streamspelarenSynlig när streamen är live. Kort i full bredd, 300 px standardhöjd.
overlayÖver videospelarenSynlig när den är live. Position/storlek kontrolleras av streamern via överläggspositioneringsverktyget.

postMessage API

Ditt tillägg tar emot kontextdata automatiskt när det läses in. Genomför dessa händelser:

Använd det exakta D1Arena föräldraursprunget för varje meddelande. Den officiella SDK härleder och validerar detta ursprung från inbäddningssidan automatiskt.

Eftersom tilläggs-iframes avsiktligt använder ett ogenomskinligt sandlådeursprung, autentiserar D1Arena-värden det exakta registrerade iframe-fönstret. Tilläggskoden måste fortfarande autentisera det överordnade fönstret och det exakta D1Arena ursprunget innan sammanhanget accepteras.

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. Ta emot sammanhang

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. Skicka åtgärder (valfritt)

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

Tillståndsomfång

Deklarera vilken data ditt tillägg behöver. Granskare verifierar att din kod matchar dina angivna behörigheter.

OmfattningGer tillgång till
read:streamStream status, titel, kategori
read:viewersAntal tittare och lista
read:chatChattmeddelanden (via Pusher-kanal)
read:clipsKanalklipp via /api/clips/{slug}
read:tournamentsAktiv matchinformation via /api/active-match/{id}
read:channelKanalprofil, följare, schema

Säkerhetskrav

Tillägg körs i en sandlådeförsedd iframe med sandbox="allow-scripts". Ditt tillägg kan inte får åtkomst till cookies, localStorage eller gör autentiserade förfrågningar till d1arena.com.
  • Offentlig HTTPS krävs — Din iframe-URL måste använda TLS och endast lösas till offentliga nätverksadresser.
  • Människoläsbar källa — Inget fördunklat eller förminskat JavaScript. Granskare måste kunna läsa din kod.
  • Inget externt skript laddas om det inte anges i din inlämning. CDN-bibliotek (jQuery, Chart.js, etc.) är bra.
  • Ingen dataexfiltrering — Tillägg får inte skicka tittardata till tredjepartsanalyser eller spårningstjänster.
  • Innehållspolicy — Inga annonser, NSFW-innehåll, brytning av kryptovalutor eller skadligt beteende.

Granskningsprocess

StatusMening
pendingInskickad, väntar på admingranskning (vanligtvis 1–3 arbetsdagar).
approvedGodkänd och synlig på Extension Marketplace.
rejectedAvvisades med en anledning. Åtgärda problem och skicka in igen.
suspendedTillfälligt borttagen på grund av policyöverträdelse. Kontakta supporten.

Versionsuppdateringar

För att uppdatera ett godkänt tillägg, ta bort den nuvarande versionen och skicka in en ny med ett ökat versionsnummer. Den nya versionen går igenom granskning igen.

Ändringslogg

Spåra API-ändringar och nya funktioner. Vi följer semantisk versionering och tillkännager brytande ändringar minst 30 dagar i förväg.

v1.0mars 2026
  • Initial offentlig API-version med API-nyckelautentisering.
  • Strömmar: Lista liveströmmar, få information om streamer efter slug.
  • Kategorier: Sök och lista alla spelkategorier.
  • Användare: Offentliga profiler med konkurrensstatistik, ELO-betyg och antal medaljer.
  • Klipp: Bläddra och hämta klippdetaljer med information om streamer/skapare.
  • Turneringar: Lista, filtrera efter status/liga, få deltagare.
  • ELO Leaderboard: Globala och per kategori rankade topplistor.
  • Ligor: Lista ligor med ställning och poänguppdelning.
  • D1 Frenzy: Frenzy-status i realtid för alla streamare.
  • Webhooks (EventSub): 12 evenemangstyper inklusive stream, kanal, turnering, klipp och Frenzy-evenemang.
  • Prisgränser

Behöver du hjälp?

Frågor om API? Kontakta oss.