Skip to main content

Webhooks

Em vez de consultar a API repetidamente (polling), você pode registrar uma URL e receber uma requisição POST sempre que um evento relevante ocorrer — início de jogo, gol, encerramento, escalação, e mais. Cada entrega é assinada (HMAC-SHA256) para que você confirme que a requisição veio da Dados Futebol e não foi adulterada.
Webhooks estão disponíveis em todos os planos, com cota de endpoints ativos e de entregas mensais por plano. Configure-os no painel em https://dadosfutebol.com.br/webhooks ou via API.

Catálogo de eventos

Ao criar um webhook você escolhe quais eventos quer receber. O plano free recebe eventos apenas dos campeonatos aos quais tem acesso.
partida.placar_atualizado e partida.gol são complementares: o primeiro traz o placar novo, o segundo diz quem marcou e quando. Um gol dispara os dois.

partida.gol

Além dos campos da partida, o payload traz o objeto gol com o lance que acabou de acontecer:
tipo é gol, gol_contra ou penalti. jogador pode vir null quando a fonte ainda não confirmou a autoria — o placar e o minuto seguem válidos.
Cartões e substituições não vão no webhook: para eles use GET /v1/partidas/{id}/eventos, que durante o jogo traz todos os lances.

Formato do payload

O corpo é sempre um JSON com este envelope:
O objeto em dados espelha o recurso correspondente da API (partida, rodada ou fase), acrescido de gols nos eventos de partida. Use o id/campeonato_id para buscar detalhes completos nos endpoints GET /v1/... quando precisar.
Em jogos de mata-mata os campos rodada_* vêm nulos e fase traz id, nome e slug — por exemplo "Oitavas de Final". Em pontos corridos é o contrário. campeonato_id está sempre preenchido, venha o vínculo da rodada ou da fase.

gols

Todos os eventos partida.* carregam a lista de gols da partida até aquele momento, ordenada por minuto — assim você monta a narração do jogo sem uma chamada extra à API. Cada item tem tipo (gol, gol_contra ou penalti), jogador, time_nome e minuto. A chave está sempre presente: vem [] num 0 a 0 e também quando a fonte ainda não publicou os lances daquele jogo. O placar em placar_mandante/placar_visitante é quem desempata os dois casos.

Headers da requisição

Verificação da assinatura

Calcule o HMAC-SHA256 de "{X-DF-Timestamp}.{corpo_bruto}" usando o secret do seu webhook e compare, em tempo constante, com o header X-DF-Assinatura.
Use o corpo bruto da requisição (raw body), não o JSON já parseado e re-serializado — a ordem das chaves precisa ser idêntica à recebida.
Responda rapidamente com 2xx. Processe o evento de forma assíncrona se necessário — respostas lentas contam como falha.

Entrega e retentativas

  • O seu endpoint deve responder com status 2xx. Qualquer outro status (ou timeout) é tratado como falha. Redirecionamentos (3xx) não são seguidos.
  • Falhas temporárias (5xx, timeout, falha de conexão, 408, 429) são reenviadas com backoff crescente (segundos → minutos → 1 hora) por algumas tentativas.
  • Falhas permanentes (3xx e demais 4xx — endereço errado, rota inexistente, método não aceito) não são retentadas: a entrega é marcada como falha na primeira resposta.
  • Após muitas falhas consecutivas o webhook é desativado automaticamente e religado no dia seguinte para uma nova chance.
  • Se as falhas se acumularem sem nenhuma entrega bem-sucedida no meio, a desativação vira definitiva: você recebe um e-mail avisando, e o webhook só volta quando você corrigir o endpoint e reativá-lo no painel ou via PATCH /v1/webhooks/{id} ("ativo": true). Atualizar a URL também zera o histórico de falhas.
  • Cada entrega traz um X-DF-Entrega único — armazene-o e ignore duplicatas (a entrega é at-least-once; a ordem não é garantida).
  • A URL precisa usar HTTPS e apontar para um host público.

Cota de entregas

Cada plano inclui uma cota mensal de entregas bem-sucedidas (respostas 2xx). A contagem:
  • Conta apenas entregas com resposta 2xx — retentativas por falha do seu endpoint não consomem a cota.
  • É compartilhada entre todos os seus webhooks (somada por conta) e reseta no dia 1º de cada mês (UTC).
  • Eventos de gerenciamento via API (criar, listar, testar etc.) usam a cota de requisições normal, não a de entregas.
Quando a cota mensal se esgota, novos eventos deixam de ser entregues até o reset: a entrega é registrada com status descartada (motivo Cota mensal de entregas excedida) e fica visível em GET /v1/webhooks/{id}/entregas. Nenhum POST é enviado ao seu endpoint. Acompanhe o consumo no meta de GET /v1/webhooks:
entregas_mes_limite retorna null quando ilimitado.

Gerenciamento via API

Além do painel, você pode gerenciar webhooks pela API (autenticada por API Key):

Criar um webhook

curl
Resposta
O secret só aparece na criação e ao rotacionar. Se perdê-lo, gere um novo em POST /v1/webhooks/{id}/rotacionar-segredo.
Omita eventos (ou envie todos) para receber o catálogo completo.

Cotas por plano

Exceder a cota de endpoints ativos retorna HTTP 422 na criação: