Webhook per gli eventi delle partite di calcio
Ricevi ogni gol, cartellino e sostituzione, oltre a calcio d'inizio, intervallo e fine partita dei campionati, delle squadre, dei giocatori o delle partite che scegli, come richiesta POST in JSON al tuo URL. Niente polling e nessuna chiave API: chiamiamo il tuo endpoint appena registriamo l'evento.
Usalo per alimentare un tuo bot, un overlay per lo streaming, un foglio di calcolo o la domotica di casa. Nell'app questa destinazione si chiama «Server HTTP».
Cosa ricevi
Una richiesta HTTP POST per ogni evento, per gli eventi che scegli:
- Calcio d'inizio
- Gol, con marcatore e assist quando i nostri dati li riportano
- Cartellini gialli e rossi
- Sostituzioni
- Risultato all'intervallo
- Risultato finale
- Per un campionato o una squadra: i nuovi video e Shorts di YouTube dei canali che seguiamo per loro
Segui un intero campionato, una squadra, un giocatore o una sola partita. Un campionato copre tutte le sue partite. Un giocatore riceve solo gli eventi che lo riguardano: gol, assist, cartellini e sostituzioni. Una singola partita si ferma da sola al fischio finale.
Il corpo è l'evento stesso, con gli stessi campi per ogni tipo: basta un solo handler.
Esempio di richiesta
Un gol, così come lo riceve il tuo endpoint (valori di esempio; l'ordine dei campi può variare):
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 }
}Configurazione
1. Prepara un endpoint
Il tuo endpoint deve accettare una richiesta POST con corpo JSON e rispondere con uno stato 2xx. Ecco una versione minima in Node.js, con un percorso difficile da indovinare che fa da segreto:
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);Pubblicalo su un indirizzo HTTPS pubblico.
2. Crea l'integrazione
- Accedi a Football Live Score e apri la pagina del campionato, della squadra, del giocatore o della partita che vuoi seguire.
- Scegli Crea integrazione, dalle un nome e seleziona Webhook HTTP come destinazione.
- Incolla l'indirizzo del tuo endpoint in URL del webhook e scegli Invia messaggio di prova. Il tuo endpoint riceve una richiesta il cui corpo è solo {"type": "✅ Football Live Score: la tua integrazione funziona."}. Rispondi con uno stato 2xx e la prova è superata.
- Scegli gli eventi. Gol è già selezionato.
- Scegli Crea integrazione.
Nell'app, tocca il pulsante di trasmissione nella schermata di una partita, una squadra, un campionato o un giocatore, aggiungi una destinazione Server HTTP con lo stesso URL, poi scegli gli eventi e avvia la trasmissione.

Campi della richiesta
Ogni richiesta ha gli stessi campi. Tutti i valori sono stringhe, tranne timestamp e, negli eventi YouTube, post. Un campo che non riguarda l'evento è una stringa vuota.
- eventId: ID univoco dell'evento. Se due tue integrazioni coprono lo stesso evento, entrambe le richieste hanno lo stesso eventId, così puoi scartare i duplicati.
- type: match_started, match_half_time, match_ended, goal, card, substitution, youtube o youtube-short.
- matchId: l'ID della partita (vuoto negli eventi YouTube).
- country, countryId, countryLogo: il paese della competizione, il suo ID e l'URL della bandiera.
- league, leagueId, leagueLogo: nome, ID e URL del logo della competizione.
- matchStadium, matchReferee: stadio e arbitro, quando sono noti.
- teamHome, teamHomeId, teamHomeBadge, teamHomeScore: nome, ID, URL dello stemma e punteggio attuale della squadra di casa.
- teamAway, teamAwayId, teamAwayBadge, teamAwayScore: lo stesso per la squadra ospite.
- time: il minuto di un gol, un cartellino o una sostituzione, come lo scrive il nostro flusso di dati.
- score: il punteggio come «casa - ospiti», per esempio "1 - 0". Per un gol, il punteggio dopo quel gol.
- side: home o away, cioè la squadra che ha segnato, ha preso il cartellino o ha fatto il cambio.
- player1, player1Id: il marcatore, il giocatore ammonito o espulso, oppure il giocatore che entra.
- player2, player2Id: l'autore dell'assist (vuoto se non c'è), oppure il giocatore che esce.
- card: il cartellino come lo chiama il nostro flusso di dati, per esempio "yellow card" o "red card".
- timestamp: quando abbiamo registrato l'evento, come oggetto con _seconds (tempo Unix) e _nanoseconds.
- post: solo negli eventi YouTube, il video, con tra l'altro post.youtubeData.title, post.youtubeData.url e post.channelDisplayName.
Consegna
- Formato: una richiesta POST con Content-Type: application/json e l'evento come corpo. Una richiesta per evento e integrazione, mai raggruppate.
- Successo: qualsiasi stato 2xx. Uno stato 4xx o 5xx, o un errore di connessione, conta come errore.
- Nessun nuovo tentativo: un invio non riuscito non viene ripetuto. Compare come errore nel registro dell'integrazione.
- Errori ripetuti: dopo diversi errori di fila, l'integrazione passa a Errore e smette di inviare. Un invio riuscito azzera il conteggio.
- Ordine: le richieste partono in modo indipendente, quindi due eventi dello stesso minuto possono arrivare in qualsiasi ordine.
- Sicurezza: le richieste non sono firmate e non contengono token. Usa un indirizzo HTTPS con una lunga parte casuale, come nell'esempio, e ignora le richieste verso qualsiasi altro percorso.
- Richiesta di prova: il pulsante di prova invia solo il campo type, quindi assicurati che il tuo codice accetti un corpo senza gli altri campi.
Domande
Mi serve una chiave API?
No. Ci dai un URL. Non c'è nessuna chiave da richiedere, rinnovare o inviare.
Posso ricevere solo i gol?
Sì. Seleziona solo Gol quando crei l'integrazione. Puoi cambiare gli eventi in seguito con Modifica.
Perché ho ricevuto lo stesso gol due volte?
Probabilmente perché due tue integrazioni lo coprono, per esempio una per il campionato e una per la squadra. Ognuna invia l'evento, con lo stesso eventId. Scartare gli eventId ripetuti risolve questo caso e anche il raro invio doppio.
È la stessa cosa della destinazione «Server HTTP» nell'app?
Sì. L'app la chiama «Server HTTP» e il sito «Webhook HTTP». Entrambe inviano la stessa richiesta.
Quanto ci mettono ad arrivare i messaggi?
Appena l'evento arriva nei nostri dati in diretta: il messaggio parte entro pochi minuti.
Come metto in pausa o elimino un'integrazione?
Sul sito, apri il tuo account e poi Integrazioni. Ogni integrazione mostra lo stato, quanti messaggi sono stati inviati o non sono andati a buon fine, un registro degli ultimi invii e i pulsanti per metterla in pausa, modificarla o eliminarla. Nell'app, le tue trasmissioni sono nella scheda dell'account.
Cosa succede dopo il fischio finale?
Un'integrazione che segue una sola partita si ferma da sola a fine gara. Quelle che seguono un campionato, una squadra o un giocatore continuano, partita dopo partita, finché non le metti in pausa o le elimini.
Quali competizioni posso seguire?
Tutti i campionati e le coppe della nostra pagina sulla copertura.
Costa qualcosa?
Le integrazioni sono gratuite, per ora. In futuro potrebbe arrivare un abbonamento.