Lompat ke konten utama
D1 Arena

D1 Arena

Loading...

D1 Arena

API Pengembang

Komunitas

API Pengembang

Bangun bot, overlay, alat streaming, dan integrasi dengan data D1Arena.

Otentikasi

Semua permintaan API memerlukan kunci API yang diteruskan di header 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, buka Pengaturan Pengembang di dasbor Anda. Anda dapat memiliki hingga 5 kunci.

Permintaan API dibatasi tarifnya per kunci API. Bila Anda melampaui batas, permintaan akan menampilkan 429 Too Many Requests dengan header Retry-After.

URL dasar

https://d1arena.com/api/v1

Semua titik akhir mengembalikan JSON. Titik akhir yang diberi nomor halaman mencakup objek meta dengan current_page, last_page, dan total.

Aliran

GET /streams
Daftar streaming langsung saat ini. Mendukung penomoran halaman dan pemfilteran kategori.
ParameterKetikDeskripsi
category_idintegerFilter berdasarkan ID game/kategori
limitintegerHasil per halaman (default: 20)
pageintegerNomor 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 satu streamer dan detail streaming berdasarkan 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
Daftar semua kategori permainan. Mendukung pencarian dan penomoran halaman.
ParameterKetikDeskripsi
searchstringFilter kategori berdasarkan nama
limitintegerHasil per halaman (default: 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 publik pemain dan statistik kompetitif berdasarkan nama pengguna atau siput.
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
Daftar klip publik. Mendukung pemfilteran berdasarkan streamer dan kategori.
ParameterKetikDeskripsi
streamer_idintegerFilter klip berdasarkan ID pengguna streamer
category_idintegerFilter berdasarkan ID game/kategori
limitintegerHasil per halaman (default: 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 detail 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" } } }

Turnamen

GET /tournaments
Daftar turnamen. Mendukung pemfilteran berdasarkan status dan liga.
ParameterKetikDeskripsi
statusstringFilter berdasarkan status (misalnya open, in_progress, completed)
league_idintegerFilter berdasarkan ID liga
limitintegerHasil per halaman (default: 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 detail turnamen dan jumlah 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 } }

Peringkat ELO

GET /elo/leaderboard
Dapatkan papan peringkat peringkat ELO. Filter secara opsional berdasarkan kategori game.
ParameterKetikDeskripsi
category_idintegerFilter berdasarkan ID game/kategori
limitintegerJumlah hasil (default: 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
Daftar liga dengan status opsional dan filter kategori.
ParameterKetikDeskripsi
statusstringFilter berdasarkan status liga
category_idintegerFilter berdasarkan ID game/kategori
limitintegerHasil per halaman (default: 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 (peringkat pemain berdasarkan poin).
Respon
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Respons Kesalahan

Semua kesalahan mengembalikan amplop JSON yang konsisten. Objek error selalu berisi code yang dapat dibaca mesin dan message yang dapat dibaca manusia.

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

Kode Status

200
Oke — Permintaan berhasil. Respon berisi data yang diminta.
400
Permintaan Buruk — Permintaan salah format atau parameter yang diperlukan tidak ada. Periksa error.message untuk detailnya.
401
Tidak sah — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Terlarang — Kunci API Anda telah dinonaktifkan atau tidak memiliki izin untuk sumber daya ini. Periksa Anda Pengaturan Pengembang.
404
Tidak Ditemukan — Sumber daya yang diminta tidak ada. Verifikasi jalur slug, ID, atau titik akhir.
422
Kesalahan Validasi — Validasi parameter permintaan gagal. Objek error.errors memetakan nama bidang ke masalah spesifiknya.
429
Tarif Terbatas — Terlalu banyak permintaan. Header Retry-After menunjukkan berapa detik untuk menunggu sebelum mencoba lagi.
500
Kesalahan Server — Terjadi kesalahan tak terduga di pihak kami. Jika hal ini terus berlanjut, hubungi dukungan.

Referensi Kode Kesalahan

KodeStatus HTTPDeskripsi
invalid_api_key401Kunci API hilang, formatnya salah, atau tidak ada
api_key_disabled403Kunci API telah dicabut atau dinonaktifkan
not_found404Sumber daya yang diminta tidak dapat ditemukan
validation_error422Satu atau beberapa parameter permintaan tidak valid
rate_limited429Batas kapasitas permintaan untuk kunci API ini terlampaui
server_error500Kesalahan server internal — coba lagi atau hubungi dukungan

Batasan Tarif

Permintaan API dibatasi tarifnya per kunci API. Bila Anda melampaui batas, permintaan akan menampilkan 429 Too Many Requests dengan header Retry-After.

Batasan berdasarkan Tingkat

TingkatPermintaan / Menit (Bawaan)Kunci Maks
Pemula (Gratis)605
PRO605
Terakhir605
Mitra605

Header Batas Nilai

Permintaan API dibatasi tarifnya per kunci API. Bila Anda melampaui batas, permintaan akan menampilkan 429 Too Many Requests dengan header Retry-After.

TajukDeskripsi
Retry-AfterBeberapa detik untuk menunggu sebelum mencoba kembali (hanya ada pada 429 tanggapan)

Praktik Terbaik

Kiat untuk tetap berada dalam batas:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Berlangganan webhooks untuk acara real-time alih-alih melakukan polling pada titik akhir.
  • Permintaan batch jika memungkinkan — gunakan parameter filter untuk mendapatkan apa yang Anda perlukan dalam lebih sedikit panggilan.

Webhook (EventSub)

Berlangganan pemberitahuan push waktu nyata alih-alih melakukan polling. Saat suatu peristiwa terjadi, D1Arena mengirimkan HTTP POST ke URL panggilan balik Anda dengan payload JSON yang ditandatangani dengan HMAC-SHA256.

Pengaturan

Buat langganan webhook di Pengaturan Pengembang. Setiap langganan memerlukan:

  • URL panggilan balik — Titik akhir HTTPS yang dapat diakses publik di server Anda.
  • Acara — Satu atau beberapa jenis acara untuk berlangganan.

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

Format Muatan

Setiap pengiriman webhook mengirimkan isi JSON dengan struktur ini:

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

Header

Setiap pengiriman mencakup header berikut untuk perutean dan verifikasi:

TajukDeskripsi
Content-Typeapplication/json
X-D1Arena-EventJenis peristiwa (misalnya stream.online)
X-D1Arena-SignatureIntisari hex HMAC-SHA256 dari badan permintaan mentah
X-D1Arena-Signature-VersionFormat kunci penandatanganan: v2 untuk langganan saat ini atau v1-hashed-secret untuk langganan lama
X-D1Arena-Delivery-IdUUID pengiriman unik — digunakan untuk deduplikasi
X-D1Arena-TimestampStempel waktu Unix saat acara dikirim

Memverifikasi Tanda Tangan

Selalu verifikasi header X-D1Arena-Signature sebelum memproses webhook. Tanda tangan dihitung sebagai HMAC-SHA256(raw_body, webhook_secret).

Untuk pengiriman v2, gunakan rahasia whsec_ yang ditampilkan saat langganan dibuat. Untuk pengiriman v1-hashed-secret pra-peningkatan, pertama-tama hitung SHA256(whsec_secret) dari rahasia asli tersebut dan gunakan intisari hex huruf kecil yang dihasilkan sebagai kunci HMAC. Buat ulang langganan jika memungkinkan 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 piton
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

AcaraDeskripsi
stream.onlineStreamer menayangkan siaran langsung
stream.offlineStreamer menjadi offline
channel.followSeorang pengguna mengikuti saluran
channel.subscribeLangganan pendukung baru di suatu saluran
channel.tipTip telah dikirim ke streamer
tournament.startedPertandingan pertandingan turnamen telah dimulai
tournament.endedSebuah turnamen telah selesai
tournament.match.completedHasil pertandingan dicatat
clip.createdKlip baru dibuat dari streaming langsung
overdrive.startedD1 Frenzy dimulai di sebuah saluran
overdrive.level_upD1 Frenzy maju ke level berikutnya
overdrive.endedD1 Frenzy selesai atau kedaluwarsa

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

Kebijakan Pengiriman & Coba Lagi

MencobaPenundaanCatatan
1 (awal)SegeraDikirim dalam hitungan detik setelah acara
ke-2 (coba lagi)30 detikJika upaya pertama gagal atau waktu habis
ke-3 (coba lagi)2 menitKemunduran eksponensial
ke-4 (akhir)10 menitUpaya terakhir sebelum ditandai sebagai gagal
Important: Your endpoint must respond with a 2xx status within 10 detik. 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 Pengaturan Pengembang.

Praktik Terbaik

  • Selalu verifikasi tanda tangan sebelum memproses muatan untuk mencegah kejadian palsu.
  • Gunakan Delivery-Id untuk deduplikasi — percobaan ulang mengirimkan ID yang sama, jadi simpan ID yang diproses untuk menghindari pemrosesan ganda.
  • Tanggapi dengan cepat, proses secara asinkron — segera kembalikan 200 OK dan tangani logika bisnis di pekerjaan latar belakang.
  • Gunakan titik akhir HTTPS saja — URL webhook harus menggunakan TLS. Panggilan balik HTTP ditolak.
  • Tangani peristiwa yang tidak diketahui dengan anggun — jenis acara baru dapat ditambahkan. Kembalikan 200 untuk kejadian yang tidak dikenali, bukannya error.

D1 Kegilaan

D1 Frenzy dipicu oleh tip cepat dan langganan saat streamer sedang live. Ini berkembang melalui 5 level dengan target yang meningkat.

GET /api/overdrive/{streamerId}

Dapatkan D1 Frenzy aktif untuk streamer. Mengembalikan {"active": false} jika tidak ada.

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

Target Tingkat

TingkatPoin
1100
2250
3500
41,000
52,000

D1 Kegilaan — Poin: Tip $1 → 100; Berlangganan 500 × Tingkat. Durasi: 5 Menit; Pendinginan: 30 Menit.

SDK Ekstensi

Buat panel khusus dan ekstensi overlay yang dapat dipasang oleh streamer di halaman saluran mereka. Ekstensi berjalan di iframe sandbox dan berkomunikasi dengan halaman host melalui postMessage.

Memulai

  1. Buat kunci API di Pengaturan Pengembang.
  2. Bangun ekstensi Anda sebagai halaman HTML mandiri yang dihosting di domain Anda (diperlukan HTTPS).
  3. Kirimkan untuk ditinjau di bagian Ekstensi Saya.
  4. Setelah disetujui, streamer dapat menginstalnya dari Extension Marketplace.

Jenis Ekstensi

KetikLokasiPerilaku
panelDi bawah pemutar aliranTerlihat saat streaming sedang live. Kartu lebar penuh, tinggi default 300 piksel.
overlayMelalui pemutar videoTerlihat saat siaran langsung. Posisi/ukuran dikontrol oleh streamer melalui alat pemosisian overlay.

API pascaPesan

Ekstensi Anda menerima data konteks secara otomatis saat dimuat. Terapkan acara ini:

Gunakan asal induk D1Arena yang tepat untuk setiap pesan. SDK resmi memperoleh dan memvalidasi asal ini dari halaman penyematan secara otomatis.

Karena iframe ekstensi sengaja menggunakan asal kotak pasir buram, host D1Arena mengautentikasi jendela iframe yang terdaftar dengan tepat. Kode ekstensi masih harus mengautentikasi jendela induk dan asal D1Arena yang tepat sebelum menerima konteks.

1. Kesiapan sinyal

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

2. Menerima 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. Kirim tindakan (opsional)

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

Cakupan Izin

Nyatakan data apa yang dibutuhkan ekstensi Anda. Peninjau memverifikasi kode Anda cocok dengan izin yang Anda nyatakan.

Ruang lingkupMemberikan Akses Ke
read:streamStatus aliran, judul, kategori
read:viewersJumlah dan daftar pemirsa
read:chatPesan obrolan (melalui saluran Pusher)
read:clipsKlip saluran melalui /api/clips/{slug}
read:tournamentsInfo pertandingan aktif melalui /api/active-match/{id}
read:channelProfil saluran, pengikut, jadwal

Persyaratan Keamanan

Ekstensi dijalankan di iframe kotak pasir dengan sandbox="allow-scripts". Ekstensi Anda tidak bisa mengakses cookie, Penyimpanan lokal, atau membuat permintaan yang diautentikasi ke d1arena.com.
  • HTTPS publik diperlukan — URL iframe Anda harus menggunakan TLS dan hanya ditujukan ke alamat jaringan publik.
  • Sumber yang dapat dibaca manusia — Tidak ada JavaScript yang dikaburkan atau hanya diperkecil. Reviewer harus bisa membaca kode Anda.
  • Tidak ada pemuatan skrip eksternal kecuali dinyatakan dalam kiriman Anda. Pustaka CDN (jQuery, Chart.js, dll.) baik-baik saja.
  • Tidak ada eksfiltrasi data — Ekstensi tidak boleh mengirimkan data pengunjung ke layanan analisis atau pelacakan pihak ketiga.
  • Kebijakan konten — Tidak ada iklan, konten NSFW, penambangan mata uang kripto, atau perilaku jahat.

Proses Peninjauan

StatusArtinya
pendingDikirim, menunggu peninjauan admin (biasanya 1-3 hari kerja).
approvedDisetujui dan terlihat di Extension Marketplace.
rejectedDitolak dengan alasan. Perbaiki masalah dan kirim ulang.
suspendedDihapus sementara karena pelanggaran kebijakan. Hubungi dukungan.

Pembaruan Versi

Untuk memperbarui ekstensi yang disetujui, hapus versi saat ini dan kirimkan versi baru dengan nomor versi yang bertambah. Versi baru melalui peninjauan lagi.

log perubahan

Lacak perubahan API dan fitur baru. Kami mengikuti pembuatan versi semantik dan mengumumkan perubahan yang dapat menyebabkan gangguan setidaknya 30 hari sebelumnya.

v1.0Maret 2026
  • Rilis API publik awal dengan autentikasi kunci API.
  • Streaming: Buat daftar streaming langsung, dapatkan detail streamer berdasarkan slug.
  • Kategori: Cari dan buat daftar semua kategori game.
  • Pengguna: Profil publik dengan statistik kompetitif, peringkat ELO, dan jumlah medali.
  • Klip: Jelajahi dan ambil detail klip dengan info streamer/pembuat.
  • Turnamen: Daftar, filter berdasarkan status/liga, dapatkan jumlah peserta.
  • Papan Peringkat ELO: Papan peringkat global dan peringkat per kategori.
  • Liga: Buat daftar liga dengan klasemen dan rincian poin.
  • D1 Frenzy: Status Frenzy real-time untuk streamer mana pun.
  • Webhook (EventSub): 12 jenis acara termasuk streaming, saluran, turnamen, klip, dan acara Frenzy.
  • Batasan Tarif

Butuh Bantuan?

Pertanyaan tentang API? Hubungi kami.