Ga naar de hoofdinhoud
D1 Arena

D1 Arena

Loading...

D1 Arena

Ontwikkelaar-API

Gemeenschap

Ontwikkelaar-API

Bouw bots, overlays, streamtools en integraties met D1Arena-gegevens.

Authenticatie

Voor alle API-verzoeken is een API-sleutel vereist die wordt doorgegeven in de X-API-Key / Authorization: Bearer-header.

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

Om een ​​API-sleutel aan te maken, gaat u naar Ontwikkelaarsinstellingen in uw dashboard. U kunt maximaal 5 sleutels hebben.

API-verzoeken zijn beperkt in aantal per API-sleutel. Wanneer u de limiet overschrijdt, retourneren verzoeken 429 Too Many Requests met een header Retry-After.

Basis-URL

https://d1arena.com/api/v1

Alle eindpunten retourneren JSON. Gepagineerde eindpunten omvatten een meta-object met current_page, last_page en total.

Stromen

GET /streams
Geef momenteel livestreams weer. Ondersteunt paginering en categoriefiltering.
ParameterTypBeschrijving
category_idintegerFilter op game-/categorie-ID
limitintegerResultaten per pagina (standaard: 20)
pageintegerPaginanummer
Reactie
{ "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}
Ontvang de livestatus van een enkele streamer en streamgegevens op gebruikersnaam of slug.
Reactie
{ "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" } }

Categorieën

GET /categories
Maak een lijst van alle spelcategorieën. Ondersteunt zoeken en paginering.
ParameterTypBeschrijving
searchstringFilter categorieën op naam
limitintegerResultaten per pagina (standaard: 50)
Reactie
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Gebruikers

GET /users/{slug}
Ontvang het openbare profiel van een speler en competitieve statistieken op basis van gebruikersnaam of slug.
Reactie
{ "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 } } }

Klemmen

GET /clips
Maak een lijst van openbare clips. Ondersteunt filteren op streamer en categorie.
ParameterTypBeschrijving
streamer_idintegerFilter clips op de gebruikers-ID van de streamer
category_idintegerFilter op game-/categorie-ID
limitintegerResultaten per pagina (standaard: 20)
Reactie
{ "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}
Haal de details van een enkele clip op per naaktslak.
Reactie
{ "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" } } }

Toernooien

GET /tournaments
Lijst toernooien. Ondersteunt filteren op status en competitie.
ParameterTypBeschrijving
statusstringFilter op status (bijv. open, in_progress, completed)
league_idintegerFilter op competitie-ID
limitintegerResultaten per pagina (standaard: 20)
Reactie
{ "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}
Ontvang toernooigegevens en het aantal deelnemers.
Reactie
{ "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-ranglijsten

GET /elo/leaderboard
Verkrijg het ELO-gerangschikte klassement. Optioneel filteren op spelcategorie.
ParameterTypBeschrijving
category_idintegerFilter op game-/categorie-ID
limitintegerAantal resultaten (standaard: 50)
Reactie
{ "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 } }

Liga's

GET /leagues
Maak een lijst van competities met optionele status- en categoriefilters.
ParameterTypBeschrijving
statusstringFilter op competitiestatus
category_idintegerFilter op game-/categorie-ID
limitintegerResultaten per pagina (standaard: 20)
Reactie
{ "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
Ontvang competitiestanden (spelersranglijst op punten).
Reactie
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Foutreacties

Alle fouten retourneren een consistente JSON-envelop. Het object error bevat altijd een door een machine leesbare code en een door mensen leesbare message.

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

Statuscodes

200
Oké — Verzoek geslaagd. Het antwoord bevat de gevraagde gegevens.
400
Slecht verzoek — Het verzoek heeft een onjuiste indeling of er ontbreken vereiste parameters. Controleer de error.message voor details.
401
Ongeautoriseerd — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Verboden — Uw API-sleutel is uitgeschakeld of heeft geen toestemming voor deze bron. Controleer uw Ontwikkelaarsinstellingen.
404
Niet gevonden — De aangevraagde bron bestaat niet. Controleer het slug-, ID- of eindpuntpad.
422
Validatiefout — Validatie van aanvraagparameters is mislukt. Het object error.errors wijst veldnamen toe aan hun specifieke problemen.
429
Tarief beperkt — Te veel verzoeken. De header Retry-After geeft aan hoeveel seconden er moeten worden gewacht voordat het opnieuw wordt geprobeerd.
500
Serverfout — Er heeft zich een onverwachte fout voorgedaan aan onze kant. Als dit aanhoudt, contact opnemen met ondersteuning.

Referentie foutcodes

CodeerHTTP-statusBeschrijving
invalid_api_key401De API-sleutel ontbreekt, heeft een onjuiste indeling of bestaat niet
api_key_disabled403De API-sleutel is ingetrokken of uitgeschakeld
not_found404De gevraagde bron kon niet worden gevonden
validation_error422Een of meer aanvraagparameters zijn ongeldig
rate_limited429De limiet voor de aanvraagsnelheid is overschreden voor deze API-sleutel
server_error500Interne serverfout. Probeer het opnieuw of neem contact op met de ondersteuning

Tarieflimieten

API-verzoeken zijn beperkt in aantal per API-sleutel. Wanneer u de limiet overschrijdt, retourneren verzoeken 429 Too Many Requests met een header Retry-After.

Limieten per niveau

NiveauVerzoeken / Minuut (Standaard)Maximaal aantal sleutels
Voorgerecht (Gratis)605
PRO605
Ultiem605
Partner605

Kopteksten voor tarieflimieten

API-verzoeken zijn beperkt in aantal per API-sleutel. Wanneer u de limiet overschrijdt, retourneren verzoeken 429 Too Many Requests met een header Retry-After.

KoptekstBeschrijving
Retry-AfterSeconden wachten voordat u het opnieuw probeert (alleen aanwezig bij 429 reacties)

Beste praktijken

Tips om binnen de perken te blijven:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Abonneer u op webhooks voor realtime gebeurtenissen in plaats van eindpunten te pollen.
  • Batchaanvragen waar mogelijk: gebruik filterparameters om precies te krijgen wat u nodig heeft, in minder oproepen.

Webhooks (EventSub)

Abonneer u op realtime pushmeldingen in plaats van op polls. Wanneer er een gebeurtenis plaatsvindt, verzendt D1Arena een HTTP POST naar uw callback-URL met een JSON-payload ondertekend met HMAC-SHA256.

Installatie

Maak webhook-abonnementen in Ontwikkelaarsinstellingen. Voor elk abonnement is het volgende vereist:

  • Terugbel-URL — Een openbaar toegankelijk HTTPS-eindpunt op uw server.
  • Evenementen — Een of meer evenementtypen waarop u zich kunt abonneren.

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

Payload-formaat

Elke webhooklevering verzendt een JSON-body met deze structuur:

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

Kopteksten

Elke levering bevat de volgende headers voor routering en verificatie:

KoptekstBeschrijving
Content-Typeapplication/json
X-D1Arena-EventType gebeurtenis (bijv. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hexadecimale samenvatting van de onbewerkte aanvraagtekst
X-D1Arena-Signature-VersionFormaat van handtekeningsleutel: v2 voor huidige abonnementen of v1-hashed-secret voor oudere abonnementen
X-D1Arena-Delivery-IdUnieke leverings-UUID — gebruik voor deduplicatie
X-D1Arena-TimestampUnix-tijdstempel van wanneer de gebeurtenis is verzonden

Handtekeningen verifiëren

Controleer altijd de header X-D1Arena-Signature voordat u een webhook verwerkt. De handtekening wordt berekend als HMAC-SHA256(raw_body, webhook_secret).

Voor v2-leveringen gebruikt u het geheim whsec_ dat werd weergegeven toen het abonnement werd aangemaakt. Voor een levering van v1-hashed-secret vóór de upgrade berekent u eerst SHA256(whsec_secret) op basis van dat oorspronkelijke geheim en gebruikt u de resulterende hexadecimale samenvatting in kleine letters als de HMAC sleutel. Maak het abonnement opnieuw aan als dit praktisch mogelijk is en verplaats het naar 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);
Knooppunt.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)

Beschikbare evenementen

EvenementBeschrijving
stream.onlineEr is een streamer live gegaan
stream.offlineEen streamer is offline gegaan
channel.followEen gebruiker heeft een kanaal gevolgd
channel.subscribeNieuw supporterabonnement op een kanaal
channel.tipEr is een tip naar een streamer gestuurd
tournament.startedEen toernooi-matchplay is begonnen
tournament.endedEr is een toernooi afgesloten
tournament.match.completedEr werd een wedstrijdresultaat geregistreerd
clip.createdEr is een nieuwe clip gemaakt van een livestream
overdrive.startedD1 Frenzy begon op een kanaal
overdrive.level_upD1 Frenzy ging naar het volgende niveau
overdrive.endedD1 Frenzy voltooid of verlopen

Voorbeelden van gebeurtenispayloads

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

Beleid voor bezorging en opnieuw proberen

PogingVertragingOpmerkingen
1e (initieel)OnmiddellijkVerzonden binnen enkele seconden na de gebeurtenis
2e (opnieuw proberen)30 secondenAls de eerste poging mislukt of een time-out optreedt
3e (opnieuw proberen)2 minutenExponentiële uitstel
4e (finale)10 minutenLaatste poging voordat deze als mislukt wordt gemarkeerd
Important: Your endpoint must respond with a 2xx status within 10 seconden. Non-2xx responses or timeouts trigger a retry. After 10 opeenvolgende mislukkingen, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Ontwikkelaarsinstellingen.

Beste praktijken

  • Controleer handtekeningen altijd voordat payloads worden verwerkt om vervalste gebeurtenissen te voorkomen.
  • Gebruik de Delivery-Id voor deduplicatie — Bij nieuwe pogingen wordt dezelfde ID verzonden. Bewaar verwerkte ID's dus om dubbele verwerking te voorkomen.
  • Reageer snel, verwerk asynchroon — retourneer 200 OK onmiddellijk en handel de bedrijfslogica af in een achtergrondtaak.
  • Gebruik alleen HTTPS-eindpunten — webhook-URL's moeten TLS gebruiken. HTTP-callbacks worden afgewezen.
  • Ga op een elegante manier om met onbekende gebeurtenissen — er kunnen nieuwe gebeurtenistypen worden toegevoegd. Retourneer 200 voor niet-herkende gebeurtenissen in plaats van fouten.

D1 Waanzin

D1 Frenzy wordt geactiveerd door snelle tips en abonnementen terwijl een streamer live is. Het vordert door 5 niveaus met toenemende doelstellingen.

GET /api/overdrive/{streamerId}

Koop de actieve D1 Frenzy voor een streamer. Retourneert {"active": false} als er geen is.

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

Niveaudoelen

NiveauPunten
1100
2250
3500
41,000
52,000

D1 Waanzin — Punten: Tip $1 → 100; Abonnement 500 × Niveau. Duur: 5 Minuten; Afkoelen: 30 Minuten.

Extensie SDK

Bouw aangepaste paneel- en overlay-extensies die streamers op hun kanaalpagina's kunnen installeren. Extensies worden uitgevoerd in iframes in een sandbox en communiceren met de hostpagina via postMessage.

Aan de slag

  1. Maak een API-sleutel in Ontwikkelaarsinstellingen.
  2. Bouw uw extensie als een zelfstandige HTML-pagina die wordt gehost op uw domein (HTTPS vereist).
  3. Dien het ter beoordeling in in de sectie Mijn extensies.
  4. Na goedkeuring kunnen streamers het installeren via de Extension Marketplace.

Extensietypen

TypLocatieGedrag
panelHieronder de streamspelerZichtbaar wanneer de stream live is. Kaart over de volledige breedte, standaardhoogte 300px.
overlayVia de videospelerZichtbaar wanneer live. Positie/grootte geregeld door de streamer via de overlay-positioneringstool.

postMessage-API

Uw extensie ontvangt automatisch contextgegevens wanneer deze wordt geladen. Implementeer deze evenementen:

Gebruik voor elk bericht de exacte D1Arena bovenliggende oorsprong. De officiële SDK leidt deze oorsprong automatisch af van de insluitingspagina en valideert deze.

Omdat extensie-iframes opzettelijk een ondoorzichtige sandbox-oorsprong gebruiken, verifieert de D1Arena-host het exacte geregistreerde iframe-venster. Extensiecode moet nog steeds het bovenliggende venster en de exacte D1Arena-oorsprong verifiëren voordat context wordt geaccepteerd.

1. Signaalgereedheid

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

2. Ontvang context

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. Acties verzenden (optioneel)

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

Toestemmingsbereiken

Geef aan welke gegevens uw extensie nodig heeft. Reviewers verifiëren dat uw code overeenkomt met uw aangegeven machtigingen.

ReikwijdteVerleent toegang tot
read:streamStreamstatus, titel, categorie
read:viewersAantal kijkers en lijst
read:chatChatberichten (via Pusher-kanaal)
read:clipsKanaalclips via /api/clips/{slug}
read:tournamentsActieve wedstrijdinformatie via /api/active-match/{id}
read:channelKanaalprofiel, volgers, schema

Beveiligingsvereisten

Extensies worden uitgevoerd in een iframe in de sandbox met sandbox="allow-scripts". Uw extensie kan niet heeft toegang tot cookies, localStorage of doet geverifieerde verzoeken aan d1arena.com.
  • Openbaar HTTPS vereist — Uw iframe-URL moet TLS gebruiken en alleen worden omgezet in openbare netwerkadressen.
  • Voor mensen leesbare bron — Geen versluierd of verkleind JavaScript. Reviewers moeten uw code kunnen lezen.
  • Geen extern script laden tenzij aangegeven in uw inzending. CDN-bibliotheken (jQuery, Chart.js, enz.) zijn prima.
  • Geen data-exfiltratie — Extensies mogen geen kijkersgegevens naar analyse- of trackingservices van derden sturen.
  • Inhoudsbeleid — Geen advertenties, NSFW-inhoud, cryptocurrency-mining of kwaadaardig gedrag.

Beoordelingsproces

ToestandBetekenis
pendingIngediend, in afwachting van beoordeling door de beheerder (doorgaans één tot drie werkdagen).
approvedGoedgekeurd en zichtbaar op de Extensiemarktplaats.
rejectedAfgewezen met een reden. Los de problemen op en dien het opnieuw in.
suspendedTijdelijk verwijderd wegens beleidsschending. Neem contact op met ondersteuning.

Versie-updates

Als u een goedgekeurde extensie wilt bijwerken, verwijdert u de huidige versie en dient u een nieuwe in met een verhoogd versienummer. De nieuwe versie wordt opnieuw beoordeeld.

Wijzigingslog

Houd API-wijzigingen en nieuwe functies bij. We volgen semantisch versiebeheer en kondigen belangrijke wijzigingen minstens 30 dagen van tevoren aan.

v1.0Maart 2026
  • Eerste openbare API-release met API-sleutelverificatie.
  • Streams: geef livestreams weer, ontvang streamergegevens per slug.
  • Categorieën: zoek en vermeld alle spelcategorieën.
  • Gebruikers: openbare profielen met competitieve statistieken, ELO-beoordeling en medailletellingen.
  • Clips: blader en haal clipdetails op met informatie over de streamer/maker.
  • Toernooien: Lijst, filter op status/competitie, krijg deelnemersaantallen.
  • ELO-klassement: Globale en per categorie gerangschikte klassementen.
  • Leagues: lijst competities met klassementen en puntenverdelingen.
  • D1 Frenzy: Realtime Frenzy-status voor elke streamer.
  • Webhooks (EventSub): 12 soorten evenementen, waaronder stream-, kanaal-, toernooi-, clip- en Frenzy-evenementen.
  • Tarieflimieten

Hulp nodig?

Vragen over de API? Neem contact met ons op.