Webhook des événements de match de foot

Recevez chaque but, carton, remplacement, coup d'envoi, mi-temps et fin de match des championnats, équipes, joueurs ou matchs de votre choix, sous forme de requête POST en JSON sur votre propre URL. Rien à interroger, pas de clé d'API : nous appelons votre serveur dès que nous enregistrons l'événement.

Branchez-y votre propre bot, un habillage de stream, un tableur ou votre domotique. Dans l'application, cette destination s'appelle « Serveur HTTP ».

Ce que vous recevez

Une requête HTTP POST par événement, pour les événements choisis :

  • Coup d'envoi
  • Buts, avec le buteur et le passeur quand nos données les indiquent
  • Cartons jaunes et rouges
  • Remplacements
  • Score à la mi-temps
  • Score final
  • Pour un championnat ou une équipe : les nouvelles vidéos et les Shorts YouTube des chaînes que nous suivons pour eux

Suivez tout un championnat, une équipe, un joueur ou un seul match. Un championnat couvre tous ses matchs. Un joueur ne reçoit que les événements qui le concernent : buts, passes décisives, cartons et remplacements. Un match seul s'arrête de lui-même au coup de sifflet final.

Le corps de la requête est l'événement lui-même, avec les mêmes champs pour tous les types : un seul gestionnaire suffit.

Exemple de requête

Un but, tel que votre serveur le reçoit (valeurs d'exemple ; l'ordre des champs peut varier) :

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

Configuration

1. Préparez un point d'accès

Votre serveur doit accepter une requête POST avec un corps JSON et répondre avec un statut 2xx. Voici une version minimale en Node.js, avec un chemin difficile à deviner qui sert de secret :

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);

Déployez-le sur une adresse HTTPS publique.

2. Créez l'intégration

  • Connectez-vous à Football Live Score et ouvrez la page du championnat, de l'équipe, du joueur ou du match à suivre.
  • Choisissez Créer une intégration, donnez-lui un nom et sélectionnez Webhook HTTP comme destination.
  • Collez l'adresse de votre serveur dans URL du webhook et choisissez Envoyer un message de test. Votre serveur reçoit une requête dont le corps est seulement {"type": "✅ Football Live Score : votre intégration fonctionne."}. Répondez avec un statut 2xx et le test réussit.
  • Choisissez les événements. But est déjà coché.
  • Choisissez Créer l'intégration.

Dans l'application, touchez le bouton de diffusion sur l'écran d'un match, d'une équipe, d'un championnat ou d'un joueur, ajoutez une destination Serveur HTTP avec la même URL, puis choisissez les événements et lancez la diffusion.

2. Créez l'intégration

Champs de la requête

Chaque requête contient les mêmes champs. Toutes les valeurs sont des chaînes, sauf timestamp et, pour les événements YouTube, post. Un champ qui ne concerne pas l'événement est une chaîne vide.

  • eventId : identifiant unique de l'événement. Si deux de vos intégrations couvrent le même événement, les deux requêtes portent le même eventId : vous pouvez ignorer les doublons.
  • type : match_started, match_half_time, match_ended, goal, card, substitution, youtube ou youtube-short.
  • matchId : identifiant du match (vide pour les événements YouTube).
  • country, countryId, countryLogo : pays de la compétition, son identifiant et l'URL de son drapeau.
  • league, leagueId, leagueLogo : nom, identifiant et URL du logo de la compétition.
  • matchStadium, matchReferee : stade et arbitre, quand ils sont connus.
  • teamHome, teamHomeId, teamHomeBadge, teamHomeScore : nom, identifiant, URL de l'écusson et score actuel de l'équipe à domicile.
  • teamAway, teamAwayId, teamAwayBadge, teamAwayScore : la même chose pour l'équipe à l'extérieur.
  • time : la minute d'un but, d'un carton ou d'un remplacement, telle que l'écrit notre flux de données.
  • score : le score sous la forme « domicile - extérieur », par exemple "1 - 0". Pour un but, le score après ce but.
  • side : home ou away, c'est-à-dire l'équipe qui a marqué, reçu le carton ou fait le changement.
  • player1, player1Id : le buteur, le joueur averti ou exclu, ou le joueur qui entre.
  • player2, player2Id : le passeur décisif (vide s'il n'y en a pas), ou le joueur qui sort.
  • card : le carton tel que le nomme notre flux, par exemple "yellow card" ou "red card".
  • timestamp : le moment où nous avons enregistré l'événement, sous forme d'objet avec _seconds (temps Unix) et _nanoseconds.
  • post : pour les événements YouTube seulement, la vidéo, avec notamment post.youtubeData.title, post.youtubeData.url et post.channelDisplayName.

Envoi

  • Format : une requête POST avec Content-Type: application/json et l'événement comme corps. Une requête par événement et par intégration, jamais groupée.
  • Succès : n'importe quel statut 2xx. Un statut 4xx ou 5xx, ou une erreur de connexion, compte comme un échec.
  • Pas de nouvel essai : un envoi raté n'est pas renvoyé. Il apparaît comme une erreur dans le journal de l'intégration.
  • Échecs répétés : après plusieurs échecs d'affilée, l'intégration passe en Erreur et cesse d'envoyer. Un envoi réussi remet le compteur à zéro.
  • Ordre : les requêtes partent indépendamment, donc deux événements de la même minute peuvent arriver dans n'importe quel ordre.
  • Sécurité : les requêtes ne sont pas signées et ne portent aucun jeton. Utilisez une adresse HTTPS avec une longue partie aléatoire, comme dans l'exemple, et ignorez les requêtes vers tout autre chemin.
  • Requête de test : le bouton de test n'envoie que le champ type : vérifiez que votre code accepte un corps sans les autres champs.

Questions

Faut-il une clé d'API ?

Non. Vous nous donnez une URL. Aucune clé à demander, à renouveler ou à envoyer.

Puis-je recevoir seulement les buts ?

Oui. Ne cochez que But en créant l'intégration. Vous pourrez changer les événements plus tard avec Modifier.

Pourquoi ai-je reçu deux fois le même but ?

Sans doute parce que deux de vos intégrations le couvrent, par exemple une pour le championnat et une pour l'équipe. Chacune envoie l'événement, avec le même eventId. Ignorer les eventId déjà reçus règle ce cas, ainsi que les rares envois en double.

Est-ce la même chose que la destination « Serveur HTTP » de l'application ?

Oui. L'application l'appelle « Serveur HTTP » et le site « Webhook HTTP ». Les deux envoient la même requête.

Les messages arrivent-ils vite ?

Dès que l'événement arrive dans nos données en direct : le message part en quelques minutes.

Comment mettre en pause ou supprimer une intégration ?

Sur le site, ouvrez votre compte, puis Intégrations. Chaque intégration affiche son statut, le nombre de messages envoyés ou en échec, un journal des derniers envois et des boutons pour la mettre en pause, la modifier ou la supprimer. Dans l'application, vos diffusions se trouvent dans l'onglet du compte.

Que se passe-t-il après le coup de sifflet final ?

Une intégration qui suit un seul match s'arrête d'elle-même après la fin du match. Celles qui suivent un championnat, une équipe ou un joueur continuent, match après match, jusqu'à ce que vous les mettiez en pause ou les supprimiez.

Quelles compétitions puis-je suivre ?

Tous les championnats et toutes les coupes de notre page de couverture.

Est-ce payant ?

Les intégrations sont gratuites pour le moment. Un abonnement pourra arriver plus tard.

Autres intégrations

Pouvons-nous utiliser Google Analytics pour améliorer le site ? Ni publicité, ni suivi publicitaire. Politique de confidentialité