Перейти к основному содержанию
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 } }

Рейтинги ЭЛО

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
Ограниченная ставка — Слишком много запросов. Заголовок 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
ПРО605
Окончательный605
Партнер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'); });
Питон
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-адреса веб-перехватчиков должны использовать 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 сообщений

Ваше расширение автоматически получает контекстные данные при загрузке. Реализуйте эти события:

Используйте точный родительский источник 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Утверждено и доступно на рынке расширений.
rejectedОтклонено по причине. Устраните проблемы и отправьте заявку повторно.
suspendedВременно удален за нарушение правил. Свяжитесь со службой поддержки.

Обновления версий

Чтобы обновить одобренное расширение, удалите текущую версию и отправьте новую с увеличенным номером версии. Новая версия снова проходит проверку.

Журнал изменений

Отслеживайте изменения API и новые функции. Мы следим за семантическим управлением версиями и объявляем о критических изменениях как минимум за 30 дней.

v1.0март 2026 г.
  • Первоначальный общедоступный выпуск API с аутентификацией по ключу API.
  • Потоки. Список прямых трансляций, получение сведений о стримерах по слагам.
  • Категории. Найдите и перечислите все категории игр.
  • Пользователи: общедоступные профили с соревновательной статистикой, рейтингом ELO и количеством медалей.
  • Клипы. Просмотр и получение сведений о клипе с информацией о стримере/авторе.
  • Турниры. Список, фильтрация по статусу/лиге, получение количества участников.
  • Таблица лидеров ELO: глобальные таблицы лидеров и таблицы лидеров по категориям.
  • Лиги. Список лиг с турнирной таблицей и разбивкой по очкам.
  • D1 Frenzy Статус Frenzy в реальном времени для любого стримера.
  • Веб-перехватчики (EventSub): 12 типов событий, включая потоки, каналы, турниры, клипы и события Frenzy.
  • Ограничения ставок

Нужна помощь?

Есть вопросы о API? Свяжитесь с нами.