Преминете към основното съдържание
D1 Arena

D1 Arena

Loading...

D1 Arena

API за разработчици

Общност

API за разработчици

Изградете ботове, наслагвания, инструменти за поточно предаване и интеграции с данни на D1Arena.

Удостоверяване

Всички API заявки изискват API ключ, предаден в заглавката X-API-Key / Authorization: Bearer.

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

За да създадете API ключ, отидете на Настройки на програмиста в таблото си за управление. Можете да имате до 5 ключа.

Заявките за API са ограничени по скорост за всеки API ключ. Когато превишите ограничението, заявките връщат 429 Too Many Requests със заглавка Retry-After.

Основен URL адрес

https://d1arena.com/api/v1

Всички крайни точки връщат JSON. Странираните крайни точки включват обект meta с current_page, last_page и total.

Потоци

GET /streams
Избройте текущите потоци на живо. Поддържа филтриране по страници и категории.
ПараметърТипОписание
category_idintegerФилтрирайте по идентификатор на игра/категория
limitintegerРезултати на страница (по подразбиране: 20)
pageintegerНомер на страницата
Отговор
{ "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}
Получавайте статус на живо на един стриймър и подробности за потока по потребителско име или плужек.
Отговор
{ "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" } }

Категории

GET /categories
Избройте всички категории игри. Поддържа търсене и пагинация.
ПараметърТипОписание
searchstringФилтрирайте категориите по име
limitintegerРезултати на страница (по подразбиране: 50)
Отговор
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Потребители

GET /users/{slug}
Вземете публичен профил на играч и конкурентни статистики по потребителско име или плужек.
Отговор
{ "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 } } }

клипове

GET /clips
Избройте публични клипове. Поддържа филтриране по стример и категория.
ПараметърТипОписание
streamer_idintegerФилтрирайте клиповете по потребителския идентификатор на стриймъра
category_idintegerФилтрирайте по идентификатор на игра/категория
limitintegerРезултати на страница (по подразбиране: 20)
Отговор
{ "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}
Вземете подробности за единичен клип чрез slug.
Отговор
{ "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" } } }

Турнири

GET /tournaments
Избройте турнири. Поддържа филтриране по статус и лига.
ПараметърТипОписание
statusstringФилтриране по състояние (напр. open, in_progress, completed)
league_idintegerФилтрирайте по ID на лигата
limitintegerРезултати на страница (по подразбиране: 20)
Отговор
{ "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}
Получете подробности за турнира и брой участници.
Отговор
{ "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 класации

GET /elo/leaderboard
Вземете ELO класираната класация. По желание филтрирайте по категория игра.
ПараметърТипОписание
category_idintegerФилтрирайте по идентификатор на игра/категория
limitintegerБрой резултати (по подразбиране: 50)
Отговор
{ "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 } }

Лиги

GET /leagues
Избройте лиги с незадължителен статус и филтри за категории.
ПараметърТипОписание
statusstringФилтриране по статус на лигата
category_idintegerФилтрирайте по идентификатор на игра/категория
limitintegerРезултати на страница (по подразбиране: 20)
Отговор
{ "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
Вземете класиране на лигата (класиране на играчи по точки).
Отговор
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Отговори за грешки

Всички грешки връщат последователен JSON плик. Обектът error винаги съдържа машинно четим code и message.

Формат на отговора за грешка
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Формат на грешка при проверка (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."] } } }

Статус кодове

200
добре — Заявката е успешна. Отговорът съдържа исканите данни.
400
Лоша заявка — Заявката е неправилно оформена или липсват необходимите параметри. Проверете error.message за подробности.
401
Неразрешено — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Забранено — Вашият API ключ е деактивиран или няма разрешение за този ресурс. Проверете вашия Настройки на програмиста.
404
Не е намерено — Заявеният ресурс не съществува. Проверете slug, ID или пътя на крайната точка.
422
Грешка при валидиране — Параметрите на заявката не бяха валидирани. Обектът error.errors преобразува имената на полетата към техните специфични проблеми.
429
Rate Limited — Твърде много заявки. Заглавката Retry-After показва колко секунди да изчакате, преди да опитате отново.
500
Грешка в сървъра — Възникна неочаквана грешка от наша страна. Ако това продължава, свържете се с поддръжката.

Справочник за кодове за грешки

КодСъстояние на HTTPОписание
invalid_api_key401API ключът липсва, неправилно е образуван или не съществува
api_key_disabled403API ключът е отменен или деактивиран
not_found404Исканият ресурс не може да бъде намерен
validation_error422Един или повече параметри на заявката са невалидни
rate_limited429Лимитът за честота на заявките е надвишен за този API ключ
server_error500Вътрешна грешка в сървъра — моля, опитайте отново или се свържете с поддръжката

Граници на скоростта

Заявките за API са ограничени по скорост за всеки API ключ. Когато превишите ограничението, заявките връщат 429 Too Many Requests със заглавка Retry-After.

Ограничения по ниво

НивоЗаявки / Мин (По подразбиране)Макс Кийс
Стартер (безплатно)605
PRO605
Ultimate605
Партньор605

Заглавки за ограничение на скоростта

Заявките за API са ограничени по скорост за всеки API ключ. Когато превишите ограничението, заявките връщат 429 Too Many Requests със заглавка Retry-After.

ЗаглавкаОписание
Retry-AfterСекунди за изчакване преди повторен опит (присъства само при 429 отговора)

Най-добри практики

Съвети за спазване на ограниченията:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Абонирайте се за webhooks за събития в реално време, вместо за анкетиране на крайни точки.
  • Групови заявки, където е възможно — използвайте параметри на филтъра, за да получите точно това, от което се нуждаете, с по-малко обаждания.

Уеб кукички (EventSub)

Абонирайте се за насочени известия в реално време вместо анкети. Когато възникне събитие, D1Arena изпраща HTTP POST към вашия URL адрес за обратно извикване с JSON полезен товар, подписан с HMAC-SHA256.

Настройка

Създайте абонаменти за уеб кукичка в Настройки на програмиста. Всеки абонамент изисква:

  • URL адрес за обратно извикване — Обществено достъпна HTTPS крайна точка на вашия сървър.
  • събития — Един или повече типове събития, за които да се абонирате.

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

Формат на полезния товар

Всяка доставка на webhook изпраща JSON тяло със следната структура:

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

Заглавки

Всяка доставка включва следните заглавки за маршрутизиране и проверка:

ЗаглавкаОписание
Content-Typeapplication/json
X-D1Arena-EventТип събитие (напр. stream.online)
X-D1Arena-SignatureHMAC-SHA256 шестнадесетичен обобщен текст на необработеното тяло на заявката
X-D1Arena-Signature-VersionФормат на подписващ ключ: v2 за текущи абонаменти или v1-hashed-secret за наследени абонаменти
X-D1Arena-Delivery-IdУникален UUID за доставка — използвайте за дедупликация
X-D1Arena-TimestampВремево клеймо на Unix кога е изпратено събитието

Проверка на подписите

Винаги проверявайте заглавката X-D1Arena-Signature, преди да обработите уеб кукичка. Подписът се изчислява като HMAC-SHA256(raw_body, webhook_secret).

За v2 доставки използвайте тайната whsec_, показана при създаването на абонамента. За доставка на v1-hashed-secret преди надграждане, първо изчислете SHA256(whsec_secret) от тази оригинална тайна и използвайте полученото шестнадесетично обобщение с малки букви като ключ HMAC. Създайте отново абонамента, когато е практично, за да преминете към 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)

Налични събития

СъбитиеОписание
stream.onlineСтриймър пусна на живо
stream.offlineСтриймър излезе офлайн
channel.followПотребител последва канал
channel.subscribeНов абонамент за поддръжник на канал
channel.tipБеше изпратен съвет до стример
tournament.startedТурнирният мач започна
tournament.endedТурнирът приключи
tournament.match.completedБеше записан резултат от мача
clip.createdБеше създаден нов клип от поток на живо
overdrive.startedD1 Frenzy започна в канал
overdrive.level_upD1 Frenzy премина към следващото ниво
overdrive.endedD1 Frenzy завършен или изтекъл

Примери за полезно натоварване на събития

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

Политика за доставка и повторен опит

опитЗакъснениеБележки
1-ви (начален)НезабавноИзпратено в рамките на секунди след събитието
2-ри (повторен опит)30 секундиАко първият опит е неуспешен или изтече време
3-ти (повторен опит)2 минутиЕкспоненциално отстъпление
4-ти (финален)10 минутиПоследен опит преди маркирането като неуспешен
Important: Your endpoint must respond with a 2xx status within 10 секунди. Non-2xx responses or timeouts trigger a retry. After 10 поредни провала, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Настройки на програмиста.

Най-добри практики

  • Винаги проверявайте подписите преди да обработите полезни товари, за да предотвратите фалшиви събития.
  • Използвайте Delivery-Id за дедупликация — повторните опити изпращат същия идентификатор, така че съхранявайте обработените идентификатори, за да избегнете двойна обработка.
  • Отговаряйте бързо, обработвайте асинхронно — връща 200 OK незабавно и обработва бизнес логиката във фоново задание.
  • Използвайте само HTTPS крайни точки — URL адресите на webhook трябва да използват TLS. HTTP обратните извиквания се отхвърлят.
  • Справяйте се с неизвестни събития елегантно — могат да се добавят нови типове събития. Връща 200 за неразпознати събития, вместо за грешка.

D1 Лудост

D1 Frenzy се задейства от бързи съвети и абонаменти, докато стриймър е на живо. Напредва през 5 нива с нарастващи цели.

GET /api/overdrive/{streamerId}

Вземете активния D1 Frenzy за стриймър. Връща {"active": false}, ако няма.

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

Ниво Цели

НивоТочки
1100
2250
3500
41,000
52,000

D1 Лудост — Точки: Съвет $1 → 100; Абонамент 500 × Ниво. Продължителност: 5 минути; Разхлаждане: 30 минути.

SDK за разширение

Създайте персонализирани разширения за панел и наслагване, които стриймърите могат да инсталират на страниците на своите канали. Разширенията се изпълняват във вградени рамки в пясъчна среда и комуникират с хост страницата чрез postMessage.

Първи стъпки

  1. Създайте API ключ в Настройки на програмиста.
  2. Създайте вашето разширение като самостоятелна HTML страница, хоствана на вашия домейн (изисква се HTTPS).
  3. Изпратете го за преглед в секцията Моите разширения.
  4. След като бъде одобрен, стримерите могат да го инсталират от Extension Marketplace.

Видове разширения

ТипМестоположениеПоведение
panelПод плейъра за потокВижда се, когато потокът е на живо. Карта с пълна ширина, височина по подразбиране 300 пиксела.
overlayПрез видео плейъраВижда се на живо. Позиция/размер, контролиран от стримера чрез инструмента за позициониране на наслагване.

API за postMessage

Вашето разширение получава контекстни данни автоматично, когато се зареди. Изпълнете тези събития:

Използвайте точния родителски произход D1Arena за всяко съобщение. Официалният SDK извлича и потвърждава автоматично този произход от страницата за вграждане.

Тъй като вградените рамки на разширението умишлено използват непрозрачен източник на пясъчник, хостът D1Arena удостоверява точно регистрирания прозорец на вградена рамка. Кодът на разширението все още трябва да удостоверява родителския прозорец и точния произход на D1Arena, преди да приеме контекста.

1. Сигнална готовност

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

2. Получаване на контекст

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. Изпратете действия (по избор)

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

Обхват на разрешенията

Декларирайте от какви данни се нуждае вашето разширение. Рецензентите потвърждават, че вашият код съответства на вашите декларирани разрешения.

ОбхватПредоставя достъп до
read:streamСъстояние на потока, заглавие, категория
read:viewersБрой и списък на зрителите
read:chatСъобщения в чата (чрез Pusher канал)
read:clipsКлипове на канала чрез /api/clips/{slug}
read:tournamentsИнформация за активно съответствие чрез /api/active-match/{id}
read:channelПрофил на канала, последователи, график

Изисквания за сигурност

Разширенията се изпълняват в iframe в пясъчна среда с sandbox="allow-scripts". Вашето разширение не може осъществява достъп до бисквитки, localStorage или прави удостоверени заявки към d1arena.com.
  • Изисква се публичен HTTPS — Вашият URL адрес на iframe трябва да използва TLS и да се разрешава само до публични мрежови адреси.
  • Човешки четим източник — Без обфусциран или минимизиран само JavaScript. Рецензентите трябва да могат да четат вашия код.
  • Няма зареждане на външен скрипт освен ако не е декларирано във вашето представяне. CDN библиотеките (jQuery, Chart.js и др.) са добри.
  • Няма ексфилтрация на данни — Разширенията не трябва да изпращат данни за зрителите до услуги за анализ или проследяване на трети страни.
  • Политика за съдържанието — Без реклами, NSFW съдържание, копаене на криптовалута или злонамерено поведение.

Процес на преглед

СтатусСмисъл
pendingИзпратено, чака преглед от администратор (обикновено 1-3 работни дни).
approvedОдобрено и видимо в Extension Marketplace.
rejectedОтхвърлено с основание. Коригирайте проблемите и изпратете отново.
suspendedВременно премахнат за нарушение на правилата. Свържете се с поддръжката.

Актуализации на версиите

За да актуализирате одобрено разширение, изтрийте текущата версия и изпратете нова с увеличен номер на версия. Новата версия минава отново през преглед.

Дневник на промените

Проследявайте промените в API и новите функции. Следим семантичните версии и обявяваме извънредни промени поне 30 дни предварително.

v1.0март 2026 г
  • Първоначално публично издание на API с удостоверяване на API ключ.
  • Потоци: Списък с потоци на живо, получаване на подробности за стриймъра по охлъвка.
  • Категории: Търсете и избройте всички категории игри.
  • Потребители: Публични профили с конкурентни статистики, ELO рейтинг и брой медали.
  • Клипове: Преглеждайте и извличайте подробности за клипа с информация за стриймър/създател.
  • Турнири: Списък, филтриране по статус/лига, получаване на брой участници.
  • ELO Leaderboard: Глобални и класирани по категория класации.
  • Лиги: Списък на лигите с класиране и разпределение на точките.
  • D1 Frenzy: Статус на Frenzy в реално време за всеки стриймър.
  • Уебкукички (EventSub): 12 типа събития, включително поток, канал, турнир, клип и Frenzy събития.
  • Граници на скоростта

Нуждаете се от помощ?

Въпроси относно API? Свържете се с нас.