Pular para o conteúdo principal
D1 Arena

D1 Arena

Loading...

D1 Arena

API do Desenvolvedor

Comunidade

API do Desenvolvedor

Crie bots, sobreposições, ferramentas de streaming e integrações com dados D1Arena.

Autenticação

Todas as solicitações de API requerem uma chave de API passada no cabeçalho X-API-Key / Authorization: Bearer.

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

Para criar uma chave de API, acesse Configurações do desenvolvedor em seu painel. Você pode ter até 5 chaves.

As solicitações de API têm taxa limitada por chave de API. Quando você excede o limite, as solicitações retornam 429 Too Many Requests com um cabeçalho Retry-After.

URL base

https://d1arena.com/api/v1

Todos os endpoints retornam JSON. Os endpoints paginados incluem um objeto meta com current_page, last_page e total.

Fluxos

GET /streams
Listar as transmissões ao vivo atualmente. Suporta paginação e filtragem de categorias.
ParâmetroTipoDescrição
category_idintegerFiltrar por ID de jogo/categoria
limitintegerResultados por página (padrão: 20)
pageintegerNúmero da página
Resposta
{ "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}
Obtenha o status ao vivo de um único streamer e detalhes da transmissão por nome de usuário ou slug.
Resposta
{ "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" } }

Categorias

GET /categories
Liste todas as categorias de jogos. Suporta pesquisa e paginação.
ParâmetroTipoDescrição
searchstringFiltrar categorias por nome
limitintegerResultados por página (padrão: 50)
Resposta
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

Usuários

GET /users/{slug}
Obtenha o perfil público e as estatísticas competitivas de um jogador por nome de usuário ou slug.
Resposta
{ "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 } } }

Clipes

GET /clips
Liste clipes públicos. Suporta filtragem por streamer e categoria.
ParâmetroTipoDescrição
streamer_idintegerFiltrar clipes por ID de usuário do streamer
category_idintegerFiltrar por ID de jogo/categoria
limitintegerResultados por página (padrão: 20)
Resposta
{ "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}
Obtenha os detalhes de um único clipe por slug.
Resposta
{ "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" } } }

Torneios

GET /tournaments
Listar torneios. Suporta filtragem por status e liga.
ParâmetroTipoDescrição
statusstringFiltrar por status (por exemplo, open, in_progress, completed)
league_idintegerFiltrar por ID da liga
limitintegerResultados por página (padrão: 20)
Resposta
{ "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}
Obtenha detalhes do torneio e contagem de participantes.
Resposta
{ "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 } }

Classificações ELO

GET /elo/leaderboard
Obtenha a tabela de classificação classificada pela ELO. Opcionalmente, filtre por categoria de jogo.
ParâmetroTipoDescrição
category_idintegerFiltrar por ID de jogo/categoria
limitintegerNúmero de resultados (padrão: 50)
Resposta
{ "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 } }

Ligas

GET /leagues
Liste ligas com filtros opcionais de status e categoria.
ParâmetroTipoDescrição
statusstringFiltrar por status da liga
category_idintegerFiltrar por ID de jogo/categoria
limitintegerResultados por página (padrão: 20)
Resposta
{ "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
Obtenha a classificação da liga (classificação dos jogadores por pontos).
Resposta
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

Respostas de erro

Todos os erros retornam um envelope JSON consistente. O objeto error sempre contém um code legível por máquina e um message legível por humanos.

Formato de resposta de erro
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
Formato de erro de validação (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."] } } }

Códigos de status

200
OK — Solicitação bem-sucedida. A resposta contém os dados solicitados.
400
Solicitação incorreta — A solicitação está malformada ou faltam parâmetros obrigatórios. Verifique o error.message para obter detalhes.
401
Não autorizado — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
Proibido — Sua chave de API foi desativada ou não tem permissão para este recurso. Verifique o seu Configurações do desenvolvedor.
404
Não encontrado — O recurso solicitado não existe. Verifique o slug, o ID ou o caminho do endpoint.
422
Erro de validação — Os parâmetros de solicitação falharam na validação. O objeto error.errors mapeia nomes de campos para seus problemas específicos.
429
Taxa limitada — Muitos pedidos. O cabeçalho Retry-After indica quantos segundos esperar antes de tentar novamente.
500
Erro do servidor — Ocorreu um erro inesperado da nossa parte. Se isso persistir, entre em contato com o suporte.

Referência de códigos de erro

CódigoStatus HTTPDescrição
invalid_api_key401A chave de API está ausente, malformada ou não existe
api_key_disabled403A chave de API foi revogada ou desativada
not_found404O recurso solicitado não foi encontrado
validation_error422Um ou mais parâmetros de solicitação são inválidos
rate_limited429Limite de taxa de solicitação excedido para esta chave de API
server_error500Erro interno do servidor — tente novamente ou entre em contato com o suporte

Limites de taxa

As solicitações de API têm taxa limitada por chave de API. Quando você excede o limite, as solicitações retornam 429 Too Many Requests com um cabeçalho Retry-After.

Limites por nível

NívelSolicitações/minuto (Padrão)Máximo de chaves
Iniciante (Grátis)605
PRÓ605
Final605
Parceiro605

Cabeçalhos de limite de taxa

As solicitações de API têm taxa limitada por chave de API. Quando você excede o limite, as solicitações retornam 429 Too Many Requests com um cabeçalho Retry-After.

CabeçalhoDescrição
Retry-AfterSegundos para esperar antes de tentar novamente (presente apenas em 429 respostas)

Melhores Práticas

Dicas para permanecer dentro dos limites:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • Assine webhooks para eventos em tempo real em vez de pesquisar endpoints.
  • Solicitações em lote sempre que possível — use parâmetros de filtro para obter exatamente o que você precisa em menos chamadas.

Webhooks (EventSub)

Assine notificações push em tempo real em vez de pesquisas. Quando ocorre um evento, D1Arena envia um HTTP POST para sua URL de retorno de chamada com uma carga JSON assinada com HMAC-SHA256.

Configuração

Crie assinaturas de webhook em Configurações do desenvolvedor. Cada assinatura requer:

  • URL de retorno de chamada — Um endpoint HTTPS acessível publicamente em seu servidor.
  • Eventos — Um ou mais tipos de eventos para assinar.

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

Formato de carga útil

Cada entrega de webhook envia um corpo JSON com esta estrutura:

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

Cabeçalhos

Cada entrega inclui os seguintes cabeçalhos para roteamento e verificação:

CabeçalhoDescrição
Content-Typeapplication/json
X-D1Arena-EventTipo de evento (por exemplo: stream.online)
X-D1Arena-SignatureResumo hexadecimal HMAC-SHA256 do corpo da solicitação bruta
X-D1Arena-Signature-VersionFormato da chave de assinatura: v2 para assinaturas atuais ou v1-hashed-secret para assinaturas legadas
X-D1Arena-Delivery-IdUUID de entrega exclusivo — use para desduplicação
X-D1Arena-TimestampCarimbo de data/hora Unix de quando o evento foi enviado

Verificando assinaturas

Sempre verifique o cabeçalho X-D1Arena-Signature antes de processar um webhook. A assinatura é calculada como HMAC-SHA256(raw_body, webhook_secret).

Para entregas v2, use o segredo whsec_ mostrado quando a assinatura foi criada. Para uma entrega v1-hashed-secret pré-atualização, primeiro calcule SHA256(whsec_secret) a partir desse segredo original e use o resumo hexadecimal resultante como a chave HMAC. Recrie a assinatura quando for prático para migrar para 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'); });
Pitão
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)

Eventos disponíveis

EventoDescrição
stream.onlineUm streamer entrou ao vivo
stream.offlineUm streamer ficou offline
channel.followUm usuário seguiu um canal
channel.subscribeNova inscrição de apoiador em um canal
channel.tipUma dica foi enviada para um streamer
tournament.startedUma partida de torneio começou
tournament.endedUm torneio foi concluído
tournament.match.completedUm resultado de partida foi registrado
clip.createdUm novo clipe foi criado a partir de uma transmissão ao vivo
overdrive.startedD1 Frenzy começou em um canal
overdrive.level_upD1 Frenzy avançou para o próximo nível
overdrive.endedFrenesi D1 concluído ou expirado

Exemplos de carga útil de evento

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

Política de entrega e nova tentativa

TentativaAtrasoNotas
1º (inicial)ImediatoEnviado segundos após o evento
2º (tentar novamente)30 segundosSe a primeira tentativa falhar ou expirar
3º (tentar novamente)2 minutosEspera exponencial
4º (final)10 minutosÚltima tentativa antes de marcar como falhada
Important: Your endpoint must respond with a 2xx status within 10 segundos. Non-2xx responses or timeouts trigger a retry. After 10 falhas consecutivas, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in Configurações do desenvolvedor.

Melhores Práticas

  • Sempre verifique as assinaturas antes de processar cargas úteis para evitar eventos falsificados.
  • Use o Delivery-Id para desduplicação — as novas tentativas enviam o mesmo ID, portanto, armazene os IDs processados para evitar processamento duplo.
  • Responda rapidamente, processe de forma assíncrona — return 200 OK imediatamente e lide com a lógica de negócios em um trabalho em segundo plano.
  • Use apenas pontos de extremidade HTTPS — URLs de webhook devem usar TLS. Os retornos de chamada HTTP são rejeitados.
  • Lidar com eventos desconhecidos normalmente — novos tipos de eventos podem ser adicionados. Retorne 200 para eventos não reconhecidos em vez de erros.

Frenesi D1

D1 Frenzy é acionado por dicas rápidas e assinaturas enquanto um streamer está ao vivo. Ele progride através de 5 níveis com metas crescentes.

GET /api/overdrive/{streamerId}

Obtenha o D1 Frenzy ativo para um streamer. Retorna {"active": false} se nenhum.

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

Alvos de nível

NívelPontos
1100
2250
3500
41,000
52,000

Frenesi D1 — Pontos: Dica $1 → 100; Assinatura 500 × Nível. Duração: 5 Minutos; Recarga: 30 Minutos.

SDK de extensão

Crie painéis personalizados e extensões de sobreposição que os streamers podem instalar nas páginas de seus canais. As extensões são executadas em iframes em sandbox e se comunicam com a página host via postMessage.

Primeiros passos

  1. Crie uma chave API em Configurações do desenvolvedor.
  2. Crie sua extensão como uma página HTML independente hospedada em seu domínio (é necessário HTTPS).
  3. Envie-o para revisão na seção Minhas extensões.
  4. Depois de aprovado, os streamers podem instalá-lo no Extension Marketplace.

Tipos de extensão

TipoLocalizaçãoComportamento
panelAbaixo do player do streamVisível quando a transmissão está ao vivo. Cartão de largura total, altura padrão de 300px.
overlayNo player de vídeoVisível quando ao vivo. Posição/tamanho controlado pelo streamer através da ferramenta de posicionamento de sobreposição.

API postMessage

Sua extensão recebe dados de contexto automaticamente quando é carregada. Implemente estes eventos:

Use a origem pai D1Arena exata para cada mensagem. O SDK oficial deriva e valida esta origem da página de incorporação automaticamente.

Como os iframes de extensão usam intencionalmente uma origem de sandbox opaca, o host D1Arena autentica a janela iframe registrada exata. O código de extensão ainda deve autenticar a janela pai e a origem exata de D1Arena antes de aceitar o contexto.

1. Prontidão de sinal

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

2. Receba contexto

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. Envie ações (opcional)

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

Escopos de permissão

Declare quais dados sua extensão precisa. Os revisores verificam se seu código corresponde às permissões declaradas.

EscopoConcede acesso a
read:streamStatus da transmissão, título, categoria
read:viewersContagem e lista de espectadores
read:chatMensagens de bate-papo (via canal Pusher)
read:clipsClipes do canal via /api/clips/{slug}
read:tournamentsInformações de partida ativa via /api/active-match/{id}
read:channelPerfil do canal, seguidores, programação

Requisitos de segurança

As extensões são executadas em iframe em sandbox com sandbox="allow-scripts". Sua extensão não pode acessa cookies, localStorage ou faz solicitações autenticadas para d1arena.com.
  • Público HTTPS obrigatório — O URL do seu iframe deve usar TLS e resolver apenas para endereços de rede pública.
  • Fonte legível por humanos — Nenhum JavaScript ofuscado ou apenas reduzido. Os revisores devem ser capazes de ler seu código.
  • Nenhum carregamento de script externo a menos que declarado em sua submissão. Bibliotecas CDN (jQuery, Chart.js, etc.) estão bem.
  • Sem exfiltração de dados — As extensões não devem enviar dados do visualizador para serviços de análise ou rastreamento de terceiros.
  • Política de conteúdo — Sem anúncios, conteúdo NSFW, mineração de criptomoedas ou comportamento malicioso.

Processo de revisão

EstadoSignificado
pendingEnviado, aguardando revisão do administrador (normalmente de 1 a 3 dias úteis).
approvedAprovado e visível no Extension Marketplace.
rejectedRejeitado com um motivo. Corrija os problemas e reenvie.
suspendedRemovido temporariamente por violação da política. Entre em contato com o suporte.

Atualizações de versão

Para atualizar uma extensão aprovada, exclua a versão atual e envie uma nova com um número de versão incrementado. A nova versão passa novamente por revisão.

Registro de alterações

Acompanhe alterações de API e novos recursos. Seguimos o versionamento semântico e anunciamos alterações importantes com pelo menos 30 dias de antecedência.

v1.0Março de 2026
  • Lançamento inicial da API pública com autenticação de chave de API.
  • Streams: liste transmissões ao vivo e obtenha detalhes do streamer por slug.
  • Categorias: pesquise e liste todas as categorias de jogos.
  • Usuários: perfis públicos com estatísticas competitivas, classificação ELO e contagem de medalhas.
  • Clipes: navegue e recupere detalhes do clipe com informações do streamer/criador.
  • Torneios: Liste, filtre por status/liga, obtenha contagens de participantes.
  • Tabela de classificação ELO: tabelas de classificação globais e por categoria.
  • Ligas: liste as ligas com classificações e distribuição de pontos.
  • D1 Frenzy: Status do Frenzy em tempo real para qualquer streamer.
  • Webhooks (EventSub): 12 tipos de eventos, incluindo eventos de stream, canal, torneio, clipe e Frenzy.
  • Limites de taxa

Precisar de ajuda?

Dúvidas sobre API? Contate-nos.