Webhook de eventos de partidas de futebol
Receba cada gol, cartão, substituição, início de jogo, intervalo e fim de jogo das ligas, times, jogadores ou partidas que você escolher, como uma requisição POST em JSON na sua própria URL. Não é preciso fazer polling nem ter chave de API: chamamos seu endpoint assim que registramos o evento.
Use para alimentar seu próprio bot, um overlay de live, uma planilha ou sua automação residencial. No app, esse destino se chama "Servidor HTTP".
O que você recebe
Uma requisição HTTP POST por evento, para os eventos que você escolher:
- Início do jogo
- Gols, com o autor e a assistência quando nossos dados trazem essa informação
- Cartões amarelos e vermelhos
- Substituições
- Placar do intervalo
- Resultado final
- Para uma liga ou um time: novos vídeos e Shorts do YouTube dos canais que acompanhamos para eles
Siga uma liga inteira, um time, um jogador ou uma única partida. Uma liga cobre todos os seus jogos. Um jogador recebe apenas os eventos em que aparece: gols, assistências, cartões e substituições. Se você seguir uma única partida, os envios param sozinhos depois do apito final.
O corpo é o próprio evento, com os mesmos campos para todos os tipos, então um único handler dá conta de tudo.
Exemplo de requisição
Um gol, do jeito que seu endpoint recebe (valores de exemplo; a ordem dos campos pode variar):
POST /hooks/9f2c51e7a4 HTTP/1.1
Content-Type: application/json
{
"eventId": "6f1d2c3e-8a4b-4c5d-9e6f-7a8b9c0d1e2f",
"matchId": "1234567",
"type": "goal",
"country": "England",
"countryId": "44",
"countryLogo": "https://example.com/flags/england.png",
"league": "Coastal League",
"leagueId": "300",
"leagueLogo": "https://example.com/logos/coastal-league.png",
"matchStadium": "Riverside Park",
"matchReferee": "M. Keller",
"teamHome": "Riverside FC",
"teamHomeId": "5001",
"teamHomeBadge": "https://example.com/badges/riverside-fc.png",
"teamHomeScore": "1",
"teamAway": "Northbridge Athletic",
"teamAwayId": "5002",
"teamAwayBadge": "https://example.com/badges/northbridge-athletic.png",
"teamAwayScore": "0",
"time": "31",
"score": "1 - 0",
"side": "home",
"player1": "J. Moreno",
"player1Id": "70001",
"player2": "L. Okafor",
"player2Id": "70002",
"card": "",
"timestamp": { "_seconds": 1792855872, "_nanoseconds": 512000000 }
}Configuração
1. Crie um endpoint
Seu endpoint precisa aceitar uma requisição POST com corpo JSON e responder com um status 2xx. Aqui vai uma versão mínima em Node.js, com um caminho difícil de adivinhar que funciona como segredo:
import http from "node:http";
http.createServer((req, res) => {
if (req.method !== "POST" || req.url !== "/hooks/9f2c51e7a4") return res.writeHead(404).end();
let body = "";
req.on("data", (chunk) => (body += chunk));
req.on("end", () => {
const event = JSON.parse(body);
if (event.type === "goal") console.log(`${event.player1} scores: ${event.teamHome} ${event.score} ${event.teamAway}`);
res.writeHead(204).end();
});
}).listen(8080);Publique-o em um endereço HTTPS público.
2. Crie a integração
- Entre no Football Live Score e abra a página da liga, do time, do jogador ou da partida que você quer acompanhar.
- Selecione Criar integração, dê um nome a ela e escolha Webhook HTTP como destino.
- Cole o endereço do seu endpoint em URL do webhook e selecione Enviar mensagem de teste. Seu endpoint recebe uma requisição cujo corpo é apenas {"type": "✅ Football Live Score: sua integração está funcionando."}. Responda com um status 2xx e o teste passa.
- Escolha os eventos. Gol já vem marcado.
- Selecione Criar integração.
No app, toque no botão de transmissão na tela de uma partida, time, liga ou jogador, adicione um destino Servidor HTTP com a mesma URL, escolha os eventos e inicie a transmissão.

Campos do payload
Todas as requisições têm os mesmos campos. Todos os valores são strings, exceto timestamp e, nos eventos do YouTube, post. Um campo que não se aplica ao evento vem como string vazia.
- eventId: ID único do evento. Se duas das suas integrações cobrirem o mesmo evento, as duas requisições trazem o mesmo eventId, então você pode descartar as duplicatas.
- type: match_started, match_half_time, match_ended, goal, card, substitution, youtube ou youtube-short.
- matchId: o ID da partida (vazio nos eventos do YouTube).
- country, countryId, countryLogo: o país da competição, o ID dele e a URL da bandeira.
- league, leagueId, leagueLogo: o nome, o ID e a URL do logo da competição.
- matchStadium, matchReferee: estádio e árbitro, quando conhecidos.
- teamHome, teamHomeId, teamHomeBadge, teamHomeScore: nome, ID, URL do escudo e placar atual do mandante.
- teamAway, teamAwayId, teamAwayBadge, teamAwayScore: o mesmo para o visitante.
- time: o minuto de um gol, cartão ou substituição, do jeito que nosso feed de dados escreve.
- score: o placar no formato "mandante - visitante", por exemplo "1 - 0". Em um gol, o placar depois desse gol.
- side: home ou away, ou seja, o time que marcou, levou o cartão ou fez a substituição.
- player1, player1Id: o autor do gol, o jogador que levou o cartão ou o jogador que entra.
- player2, player2Id: o jogador que deu a assistência (vazio se não houver) ou o jogador que sai.
- card: o cartão com o nome que nosso feed de dados usa, por exemplo "yellow card" ou "red card".
- timestamp: quando registramos o evento, como um objeto com _seconds (Unix time) e _nanoseconds.
- post: apenas nos eventos do YouTube, o vídeo, incluindo post.youtubeData.title, post.youtubeData.url e post.channelDisplayName.
Entrega
- Formato: uma requisição POST com Content-Type: application/json e o evento como corpo. Uma requisição por evento e por integração, nunca em lote.
- Sucesso: qualquer status 2xx. Um status 4xx ou 5xx, ou um erro de conexão, conta como falha.
- Sem novas tentativas: uma entrega que falhou não é reenviada. Ela aparece como erro no registro da integração.
- Falhas repetidas: depois de várias falhas seguidas, a integração passa para Erro e para de enviar. Uma entrega bem-sucedida zera a contagem.
- Ordem: as requisições são enviadas de forma independente, então dois eventos do mesmo minuto podem chegar em qualquer ordem.
- Segurança: as requisições não são assinadas e não levam token. Use um endereço HTTPS com uma parte aleatória longa, como no exemplo, e ignore requisições para qualquer outro caminho.
- Requisição de teste: o botão de teste envia só o campo type, então garanta que seu handler aceite um corpo sem os outros campos.
Perguntas
Preciso de uma chave de API?
Não. Você nos passa uma URL. Não há chave para solicitar, renovar ou enviar.
Posso receber só os gols?
Sim. Marque apenas Gol ao criar a integração. Você pode mudar os eventos depois com Editar.
Por que recebi o mesmo gol duas vezes?
Provavelmente porque duas das suas integrações cobrem esse gol, por exemplo uma para a liga e outra para o time. Cada uma envia o evento, com o mesmo eventId. Descartar eventIds repetidos resolve isso, e também os raros envios duplicados.
É o mesmo que o destino "Servidor HTTP" do app?
Sim. O app chama de "Servidor HTTP" e o site, de "Webhook HTTP". Os dois enviam a mesma requisição.
Em quanto tempo as mensagens chegam?
Assim que o evento entra nos nossos dados ao vivo: a mensagem chega em poucos minutos.
Como pausar ou excluir uma integração?
No site, abra sua conta e depois Integrações. Cada integração mostra o status, quantas mensagens foram enviadas ou falharam, um registro dos últimos envios e botões para pausar, editar ou excluir. No app, suas transmissões ficam na aba Conta.
O que acontece depois do apito final?
Uma integração que acompanha uma única partida para sozinha quando o jogo termina. As de liga, time ou jogador continuam, jogo após jogo, até você pausar ou excluir.
Quais competições posso acompanhar?
Todas as ligas e copas da nossa página de cobertura.
É pago?
As integrações são gratuitas por enquanto. Uma assinatura pode vir mais tarde.