Langkau ke kandungan utama
D1 Arena

D1 Arena

Loading...

D1 Arena

API Pembangun

Komuniti

API Pembangun

Bina bot, tindanan, alatan strim dan penyepaduan dengan data D1Arena.

Pengesahan

Semua permintaan API memerlukan kunci API yang dihantar dalam pengepala X-API-Key / Authorization: Bearer.

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

Untuk membuat kunci API, pergi ke Tetapan Pembangun dalam papan pemuka anda. Anda boleh mempunyai sehingga 5 kunci.

Permintaan API adalah terhad pada setiap kunci API. Apabila anda melebihi had, permintaan mengembalikan 429 Too Many Requests dengan pengepala Retry-After.

URL asas

https://d1arena.com/api/v1

Semua titik akhir mengembalikan JSON. Titik akhir bernombor termasuk objek meta dengan current_page, last_page dan total.

Aliran

GET /streams
Senaraikan strim langsung pada masa ini. Menyokong penomboran dan penapisan kategori.
ParametertaipPenerangan
category_idintegerTapis mengikut ID permainan/kategori
limitintegerKeputusan setiap halaman (lalai: 20)
pageintegerNombor halaman
Respon
{ "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}
Dapatkan status langsung penstrim tunggal dan butiran strim mengikut nama pengguna atau slug.
Respon
{ "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" } }

Kategori

GET /categories
Senaraikan semua kategori permainan. Menyokong carian dan penomboran.
ParametertaipPenerangan
searchstringTapis kategori mengikut nama
limitintegerHasil setiap halaman (lalai: 50)
Respon
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Pengguna

GET /users/{slug}
Dapatkan profil awam pemain dan statistik persaingan mengikut nama pengguna atau slug.
Respon
{ "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
Senaraikan klip awam. Menyokong penapisan mengikut strim dan kategori.
ParametertaipPenerangan
streamer_idintegerTapis klip mengikut ID pengguna penstrim
category_idintegerTapis mengikut ID permainan/kategori
limitintegerKeputusan setiap halaman (lalai: 20)
Respon
{ "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}
Dapatkan butiran satu klip dengan slug.
Respon
{ "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" } } }

Kejohanan

GET /tournaments
Senaraikan kejohanan. Menyokong penapisan mengikut status dan liga.
ParametertaipPenerangan
statusstringTapis mengikut status (cth. open, in_progress, completed)
league_idintegerTapis mengikut ID liga
limitintegerKeputusan setiap halaman (lalai: 20)
Respon
{ "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}
Dapatkan butiran kejohanan dan kiraan peserta.
Respon
{ "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 } }

Kedudukan ELO

GET /elo/leaderboard
Dapatkan papan pendahulu berperingkat ELO. Tapis mengikut kategori permainan secara pilihan.
ParametertaipPenerangan
category_idintegerTapis mengikut ID permainan/kategori
limitintegerBilangan keputusan (lalai: 50)
Respon
{ "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

GET /leagues
Senaraikan liga dengan status pilihan dan penapis kategori.
ParametertaipPenerangan
statusstringTapis mengikut status liga
category_idintegerTapis mengikut ID permainan/kategori
limitintegerKeputusan setiap halaman (lalai: 20)
Respon
{ "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
Dapatkan kedudukan liga (kedudukan pemain mengikut mata).
Respon
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Jawapan Ralat

Semua ralat mengembalikan sampul JSON yang konsisten. Objek error sentiasa mengandungi code yang boleh dibaca oleh mesin dan message yang boleh dibaca oleh manusia.

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

Kod Status

200
OK — Permintaan berjaya. Respons mengandungi data yang diminta.
400
Permintaan Buruk — Permintaan salah bentuk atau tiada parameter yang diperlukan. Semak error.message untuk butiran.
401
tanpa kebenaran — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Dilarang — Kunci API anda telah dilumpuhkan atau tiada kebenaran untuk sumber ini. Semak anda Tetapan Pembangun.
404
Tidak Ditemui — Sumber yang diminta tidak wujud. Sahkan laluan slug, ID atau titik akhir.
422
Ralat Pengesahan — Permintaan parameter gagal pengesahan. Objek error.errors memetakan nama medan kepada isu khusus mereka.
429
Kadar Terhad — Terlalu banyak permintaan. Pengepala Retry-After menunjukkan berapa saat untuk menunggu sebelum mencuba semula.
500
Ralat Pelayan — Ralat yang tidak dijangka berlaku pada pihak kami. Jika ini berterusan, hubungi sokongan.

Rujukan Kod Ralat

KodStatus HTTPPenerangan
invalid_api_key401Kunci API tiada, salah bentuk atau tidak wujud
api_key_disabled403Kunci API telah dibatalkan atau dilumpuhkan
not_found404Sumber yang diminta tidak ditemui
validation_error422Satu atau lebih parameter permintaan adalah tidak sah
rate_limited429Had kadar permintaan melebihi had untuk kunci API ini
server_error500Ralat pelayan dalaman — sila cuba semula atau hubungi sokongan

Had Kadar

Permintaan API adalah terhad pada setiap kunci API. Apabila anda melebihi had, permintaan mengembalikan 429 Too Many Requests dengan pengepala Retry-After.

Had mengikut Peringkat

PeringkatPermintaan / Minit (Lalai)Kekunci Maks
Pemula (Percuma)605
PRO605
muktamad605
rakan kongsi605

Pengepala Had Kadar

Permintaan API adalah terhad pada setiap kunci API. Apabila anda melebihi had, permintaan mengembalikan 429 Too Many Requests dengan pengepala Retry-After.

PengepalaPenerangan
Retry-AfterBeberapa saat untuk menunggu sebelum mencuba semula (hanya hadir pada 429 respons)

Amalan Terbaik

Petua untuk kekal dalam had:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Langgan webhooks untuk acara masa nyata dan bukannya titik akhir pengundian.
  • Permintaan kelompok jika boleh — gunakan parameter penapis untuk mendapatkan apa yang anda perlukan dengan tepat dalam lebih sedikit panggilan.

Webhooks (EventSub)

Langgan pemberitahuan tolak masa nyata dan bukannya pengundian. Apabila peristiwa berlaku, D1Arena menghantar HTTP POST ke URL panggil balik anda dengan muatan JSON yang ditandatangani dengan HMAC-SHA256.

Persediaan

Buat langganan webhook dalam Tetapan Pembangun. Setiap langganan memerlukan:

  • URL panggilan balik — Titik akhir HTTPS yang boleh diakses secara umum pada pelayan anda.
  • Peristiwa — Satu atau lebih jenis acara untuk dilanggan.

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

Format Muatan

Setiap penghantaran webhook menghantar badan JSON dengan struktur ini:

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

Pengepala

Setiap penghantaran termasuk pengepala berikut untuk penghalaan dan pengesahan:

PengepalaPenerangan
Content-Typeapplication/json
X-D1Arena-EventJenis acara (cth. stream.online)
X-D1Arena-SignatureHMAC-SHA256 hex pencernaan badan permintaan mentah
X-D1Arena-Signature-VersionFormat kunci tandatangan: v2 untuk langganan semasa atau v1-hashed-secret untuk langganan lama
X-D1Arena-Delivery-IdUUID penghantaran unik — gunakan untuk penduadua
X-D1Arena-TimestampCap masa Unix apabila acara itu dihantar

Mengesahkan Tandatangan

Sentiasa sahkan pengepala X-D1Arena-Signature sebelum memproses webhook. Tandatangan dikira sebagai HMAC-SHA256(raw_body, webhook_secret).

Untuk penghantaran v2, gunakan rahsia whsec_ yang ditunjukkan semasa langganan dibuat. Untuk penghantaran pra-naik taraf v1-hashed-secret, mula-mula hitung SHA256(whsec_secret) daripada rahsia asal itu dan gunakan ringkasan hex huruf kecil yang terhasil sebagai kekunci HMAC. Buat semula langganan apabila praktikal untuk berpindah ke 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'); });
Ular sawa
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)

Acara yang Tersedia

PeristiwaPenerangan
stream.onlinePenstrim telah bersiaran langsung
stream.offlinePenstrim pergi ke luar talian
channel.followSeorang pengguna mengikuti saluran
channel.subscribeLangganan penyokong baharu pada saluran
channel.tipPetua telah dihantar ke strim
tournament.startedPermainan perlawanan kejohanan telah bermula
tournament.endedSatu kejohanan telah berakhir
tournament.match.completedKeputusan perlawanan direkodkan
clip.createdKlip baharu telah dibuat daripada strim langsung
overdrive.startedD1 Frenzy bermula pada saluran
overdrive.level_upD1 Frenzy mara ke peringkat seterusnya
overdrive.endedD1 Frenzy selesai atau tamat tempoh

Contoh Muatan Peristiwa

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

Polisi Penghantaran & Cuba Semula

PercubaankelewatanNota
pertama (awal)serta mertaDihantar dalam beberapa saat dari acara
ke-2 (cuba semula)30 saatJika percubaan pertama gagal atau tamat masa
ke-3 (cuba semula)2 minitPengunduran eksponen
ke-4 (akhir)10 minitPercubaan terakhir sebelum menandakan sebagai gagal
Important: Your endpoint must respond with a 2xx status within 10 saat. Non-2xx responses or timeouts trigger a retry. After 10 kegagalan berturut-turut, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Tetapan Pembangun.

Amalan Terbaik

  • Sentiasa sahkan tandatangan sebelum memproses muatan untuk mengelakkan peristiwa palsu.
  • Gunakan Id Penghantaran untuk penyahduplikasian — cuba semula menghantar ID yang sama, jadi simpan ID yang diproses untuk mengelakkan pemprosesan dua kali.
  • Balas dengan cepat, proses secara tidak segerak — pulangkan 200 OK serta-merta dan kendalikan logik perniagaan dalam kerja latar belakang.
  • Gunakan titik akhir HTTPS sahaja — URL webhook mesti menggunakan TLS. Panggilan balik HTTP ditolak.
  • Mengendalikan peristiwa yang tidak diketahui dengan anggun — jenis acara baharu boleh ditambah. Kembalikan 200 untuk peristiwa yang tidak dikenali dan bukannya kesilapan.

D1 Kegilaan

D1 Frenzy dicetuskan oleh petua dan langganan pantas semasa strim disiarkan secara langsung. Ia berkembang melalui 5 peringkat dengan sasaran yang semakin meningkat.

GET /api/overdrive/{streamerId}

Dapatkan D1 Frenzy aktif untuk strim. Mengembalikan {"active": false} jika tiada.

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

Sasaran Tahap

Tahapmata
1100
2250
3500
41,000
52,000

D1 Kegilaan — mata: Petua $1 → 100; Langganan 500 × Peringkat. Tempoh: 5 minit; Cooldown: 30 minit.

SDK sambungan

Bina panel tersuai dan pelanjutan tindanan yang boleh dipasang oleh penstrim pada halaman saluran mereka. Sambungan dijalankan dalam iframe kotak pasir dan berkomunikasi dengan halaman hos melalui postMessage.

Bermula

  1. Buat kunci API dalam Tetapan Pembangun.
  2. Bina sambungan anda sebagai halaman HTML kendiri yang dihoskan pada domain anda (HTTPS diperlukan).
  3. Serahkannya untuk semakan dalam bahagian Sambungan Saya.
  4. Setelah diluluskan, streamer boleh memasangnya daripada Extension Marketplace.

Jenis Sambungan

taipLokasiTingkah laku
panelDi bawah pemain strimKelihatan apabila strim disiarkan secara langsung. Kad lebar penuh, ketinggian lalai 300px.
overlayAtas pemain videoKelihatan semasa hidup. Kedudukan/saiz dikawal oleh penstrim melalui alat penentududukan tindanan.

API postMessage

Sambungan anda menerima data konteks secara automatik apabila ia dimuatkan. Laksanakan acara ini:

Gunakan D1Arena asal induk yang tepat untuk setiap mesej. SDK rasmi memperoleh dan mengesahkan asal ini daripada halaman pembenaman secara automatik.

Oleh kerana iframe sambungan dengan sengaja menggunakan asal kotak pasir legap, hos D1Arena mengesahkan tetingkap iframe berdaftar yang tepat. Kod sambungan mesti masih mengesahkan tetingkap induk dan asal D1Arena yang tepat sebelum menerima konteks.

1. Kesediaan isyarat

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

2. Terima konteks

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. Hantar tindakan (pilihan)

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

Skop Kebenaran

Isytiharkan data yang diperlukan oleh sambungan anda. Penyemak mengesahkan kod anda sepadan dengan kebenaran anda yang diisytiharkan.

SkopMemberi Akses Kepada
read:streamStatus strim, tajuk, kategori
read:viewersKiraan dan senarai penonton
read:chatMesej sembang (melalui saluran Pusher)
read:clipsKlip saluran melalui /api/clips/{slug}
read:tournamentsMaklumat perlawanan aktif melalui /api/active-match/{id}
read:channelProfil saluran, pengikut, jadual

Keperluan Keselamatan

Sambungan dijalankan dalam iframe kotak pasir dengan sandbox="allow-scripts". Sambungan anda tidak boleh mengakses kuki, localStorage atau membuat permintaan yang disahkan kepada d1arena.com.
  • Awam HTTPS diperlukan — URL iframe anda mesti menggunakan TLS dan menyelesaikan hanya kepada alamat rangkaian awam.
  • Sumber yang boleh dibaca manusia — Tiada JavaScript yang dikelirukan atau diperkecilkan sahaja. Penyemak mesti boleh membaca kod anda.
  • Tiada pemuatan skrip luaran melainkan diisytiharkan dalam penyerahan anda. Perpustakaan CDN (jQuery, Chart.js, dll.) adalah baik.
  • Tiada exfiltration data — Sambungan tidak boleh menghantar data penonton kepada analitis atau perkhidmatan penjejakan pihak ketiga.
  • Dasar kandungan — Tiada iklan, kandungan NSFW, perlombongan mata wang kripto atau tingkah laku berniat jahat.

Proses Semakan

StatusMaknanya
pendingDiserahkan, menunggu semakan pentadbir (biasanya 1-3 hari perniagaan).
approvedDiluluskan dan boleh dilihat di Extension Marketplace.
rejectedDitolak dengan alasan. Selesaikan isu dan serahkan semula.
suspendedDialih keluar buat sementara waktu kerana melanggar dasar. Hubungi sokongan.

Kemas Kini Versi

Untuk mengemas kini sambungan yang diluluskan, padamkan versi semasa dan serahkan yang baharu dengan nombor versi yang ditambah. Versi baharu melalui semakan semula.

Changelog

Jejaki perubahan API dan ciri baharu. Kami mengikuti versi semantik dan mengumumkan perubahan pecah sekurang-kurangnya 30 hari lebih awal.

v1.0Mac 2026
  • Keluaran API awam awal dengan pengesahan kunci API.
  • Strim: Senaraikan strim langsung, dapatkan butiran penstrim mengikut slug.
  • Kategori: Cari dan senaraikan semua kategori permainan.
  • Pengguna: Profil awam dengan statistik kompetitif, penilaian ELO dan kiraan pingat.
  • Klip: Semak imbas dan dapatkan butiran klip dengan maklumat penstrim/pencipta.
  • Kejohanan: Senaraikan, tapis mengikut status/liga, dapatkan kiraan peserta.
  • Papan Pendahulu ELO: Papan pendahulu kedudukan global dan setiap kategori.
  • Liga: Senaraikan liga dengan kedudukan dan pecahan mata.
  • D1 Frenzy: Status Frenzy masa nyata untuk mana-mana strim.
  • Webhooks (EventSub): 12 jenis acara termasuk strim, saluran, kejohanan, klip dan acara Frenzy.
  • Had Kadar

Perlukan Bantuan?

Ada soalan tentang API? Hubungi kami.