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.
Para criar uma chave de API, acesse Configurações do desenvolvedor em seu painel. Você pode ter até 5 chaves.
429 Too Many Requests com um cabeçalho Retry-After.
URL base
Todos os endpoints retornam JSON. Os endpoints paginados incluem um objeto meta com current_page, last_page e total.
Fluxos
| Parâmetro | Tipo | Descrição |
|---|---|---|
category_id | integer | Filtrar por ID de jogo/categoria |
limit | integer | Resultados por página (padrão: 20) |
page | integer | Número da página |
Categorias
| Parâmetro | Tipo | Descrição |
|---|---|---|
search | string | Filtrar categorias por nome |
limit | integer | Resultados por página (padrão: 50) |
Usuários
Clipes
| Parâmetro | Tipo | Descrição |
|---|---|---|
streamer_id | integer | Filtrar clipes por ID de usuário do streamer |
category_id | integer | Filtrar por ID de jogo/categoria |
limit | integer | Resultados por página (padrão: 20) |
Torneios
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | string | Filtrar por status (por exemplo, open, in_progress, completed) |
league_id | integer | Filtrar por ID da liga |
limit | integer | Resultados por página (padrão: 20) |
Classificações ELO
| Parâmetro | Tipo | Descrição |
|---|---|---|
category_id | integer | Filtrar por ID de jogo/categoria |
limit | integer | Número de resultados (padrão: 50) |
Ligas
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | string | Filtrar por status da liga |
category_id | integer | Filtrar por ID de jogo/categoria |
limit | integer | Resultados por página (padrão: 20) |
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.
Códigos de status
Referência de códigos de erro
| Código | Status HTTP | Descrição |
|---|---|---|
invalid_api_key | 401 | A chave de API está ausente, malformada ou não existe |
api_key_disabled | 403 | A chave de API foi revogada ou desativada |
not_found | 404 | O recurso solicitado não foi encontrado |
validation_error | 422 | Um ou mais parâmetros de solicitação são inválidos |
rate_limited | 429 | Limite de taxa de solicitação excedido para esta chave de API |
server_error | 500 | Erro 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ível | Solicitações/minuto (Padrão) | Máximo de chaves |
|---|---|---|
| Iniciante (Grátis) | 60 | 5 |
| PRÓ | 60 | 5 |
| Final | 60 | 5 |
| Parceiro | 60 | 5 |
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çalho | Descrição |
|---|---|
Retry-After | Segundos para esperar antes de tentar novamente (presente apenas em 429 respostas) |
Melhores Práticas
- 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:
Cabeçalhos
Cada entrega inclui os seguintes cabeçalhos para roteamento e verificação:
| Cabeçalho | Descrição |
|---|---|
Content-Type | application/json |
X-D1Arena-Event | Tipo de evento (por exemplo: stream.online) |
X-D1Arena-Signature | Resumo hexadecimal HMAC-SHA256 do corpo da solicitação bruta |
X-D1Arena-Signature-Version | Formato da chave de assinatura: v2 para assinaturas atuais ou v1-hashed-secret para assinaturas legadas |
X-D1Arena-Delivery-Id | UUID de entrega exclusivo — use para desduplicação |
X-D1Arena-Timestamp | Carimbo 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.
Eventos disponíveis
| Evento | Descrição |
|---|---|
| stream.online | Um streamer entrou ao vivo |
| stream.offline | Um streamer ficou offline |
| channel.follow | Um usuário seguiu um canal |
| channel.subscribe | Nova inscrição de apoiador em um canal |
| channel.tip | Uma dica foi enviada para um streamer |
| tournament.started | Uma partida de torneio começou |
| tournament.ended | Um torneio foi concluído |
| tournament.match.completed | Um resultado de partida foi registrado |
| clip.created | Um novo clipe foi criado a partir de uma transmissão ao vivo |
| overdrive.started | D1 Frenzy começou em um canal |
| overdrive.level_up | D1 Frenzy avançou para o próximo nível |
| overdrive.ended | Frenesi D1 concluído ou expirado |
Exemplos de carga útil de evento
stream.online
stream.offline
channel.follow
channel.tip
tournament.match.completed
clip.created
Política de entrega e nova tentativa
| Tentativa | Atraso | Notas |
|---|---|---|
| 1º (inicial) | Imediato | Enviado segundos após o evento |
| 2º (tentar novamente) | 30 segundos | Se a primeira tentativa falhar ou expirar |
| 3º (tentar novamente) | 2 minutos | Espera exponencial |
| 4º (final) | 10 minutos | Última tentativa antes de marcar como falhada |
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 OKimediatamente 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
200para 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.
Alvos de nível
| Nível | Pontos |
|---|---|
| 1 | 100 |
| 2 | 250 |
| 3 | 500 |
| 4 | 1,000 |
| 5 | 2,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
- Crie uma chave API em Configurações do desenvolvedor.
- Crie sua extensão como uma página HTML independente hospedada em seu domínio (é necessário HTTPS).
- Envie-o para revisão na seção Minhas extensões.
- Depois de aprovado, os streamers podem instalá-lo no Extension Marketplace.
Tipos de extensão
| Tipo | Localização | Comportamento |
|---|---|---|
panel | Abaixo do player do stream | Visível quando a transmissão está ao vivo. Cartão de largura total, altura padrão de 300px. |
overlay | No player de vídeo | Visí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
2. Receba contexto
3. Envie ações (opcional)
Escopos de permissão
Declare quais dados sua extensão precisa. Os revisores verificam se seu código corresponde às permissões declaradas.
| Escopo | Concede acesso a |
|---|---|
read:stream | Status da transmissão, título, categoria |
read:viewers | Contagem e lista de espectadores |
read:chat | Mensagens de bate-papo (via canal Pusher) |
read:clips | Clipes do canal via /api/clips/{slug} |
read:tournaments | Informações de partida ativa via /api/active-match/{id} |
read:channel | Perfil do canal, seguidores, programação |
Requisitos de segurança
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
| Estado | Significado |
|---|---|
| pending | Enviado, aguardando revisão do administrador (normalmente de 1 a 3 dias úteis). |
| approved | Aprovado e visível no Extension Marketplace. |
| rejected | Rejeitado com um motivo. Corrija os problemas e reenvie. |
| suspended | Removido 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.
- 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.