Перейти до основного вмісту
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}
Отримайте деталі окремого кліпу за допомогою кулі.
Відповідь
{ "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Фільтрувати за ідентифікатором ліги
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
Не знайдено — Потрібний ресурс не існує. Перевірте слаг, ідентифікатор або шлях кінцевої точки.
422
Помилка перевірки — Параметри запиту не пройшли перевірку. Об’єкт error.errors зіставляє назви полів із їхніми конкретними проблемами.
429
Rate Limited — Забагато запитів. Заголовок Retry-After вказує, скільки секунд чекати перед повторною спробою.
500
Помилка сервера — З нашого боку сталася несподівана помилка. Якщо це продовжується, зв'язатися зі службою підтримки.

Довідка про коди помилок

КодСтатус HTTPопис
invalid_api_key401Ключ API відсутній, неправильно сформований або не існує
api_key_disabled403Ключ API анульовано або вимкнено
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)

Підпишіться на push-повідомлення в режимі реального часу замість опитування. Коли відбувається подія, 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.

Формат корисного навантаження

Кожен вебхук надсилає тіло 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 розширення

Створюйте спеціальні панелі та розширення для оверлеїв, які стримери можуть установлювати на сторінках своїх каналів. Розширення працюють в ізольованому програмному середовищі iframe і спілкуються з головною сторінкою через postMessage.

Початок роботи

  1. Створіть ключ API в Налаштування розробника.
  2. Створіть своє розширення як окрему HTML-сторінку, розміщену у вашому домені (потрібен HTTPS).
  3. Надішліть його на розгляд у розділі Мої розширення.
  4. Після схвалення стримери зможуть установити його з Extension Marketplace.

Типи розширень

ТипРозташуванняПоведінка
panelПід програвачем потокуВидно під час трансляції. Картка повної ширини, висота за замовчуванням 300 пікселів.
overlayЧерез відеоплеєрВидно в прямому ефірі. Розташування/розмір контролюється стримером за допомогою інструмента позиціонування накладання.

API postMessage

Ваше розширення автоматично отримує контекстні дані під час завантаження. Реалізувати такі заходи:

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

Оскільки розширення iframe навмисно використовують непрозоре джерело пісочниці, хост D1Arena автентифікує саме зареєстроване вікно iframe. Код розширення все ще має автентифікувати батьківське вікно та точне походження 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". Ваше розширення не може отримує доступ до файлів cookie, 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: Глобальні та категорійні таблиці лідерів.
  • Ліги: список ліг із турнірною таблицею та розподілом очок.
  • D1 Frenzy: Статус Frenzy в реальному часі для будь-якого стримера.
  • Веб-хуки (EventSub): 12 типів подій, включаючи потоки, канали, турніри, кліп і події Frenzy.
  • Обмеження швидкості

Потрібна допомога?

Запитання щодо API? Зв'яжіться з нами.