Webhook für Fußball-Spielereignisse
Empfange jedes Tor, jede Karte und jede Auswechslung, dazu Anpfiff, Halbzeit und Abpfiff der Ligen, Teams, Spieler oder Spiele deiner Wahl, als JSON-POST-Anfrage an deine eigene URL. Kein Polling, kein API-Schlüssel: Wir rufen deinen Endpunkt auf, sobald wir das Ereignis erfassen.
Damit fütterst du deinen eigenen Bot, ein Stream-Overlay, eine Tabelle oder deine Hausautomation. In der App heißt dieses Ziel „HTTP-Server“.
Was du bekommst
Eine HTTP-POST-Anfrage pro Ereignis, für die Ereignisse deiner Wahl:
- Anpfiff
- Tore, mit Torschütze und Vorlagengeber, wenn unsere Daten sie enthalten
- Gelbe und Rote Karten
- Auswechslungen
- Halbzeitstand
- Endergebnis
- Für eine Liga oder ein Team: neue YouTube-Videos und Shorts der Kanäle, die wir dafür verfolgen
Folge einer ganzen Liga, einem Team, einem Spieler oder einem einzelnen Spiel. Eine Liga umfasst alle ihre Spiele. Ein Spieler bekommt nur die Ereignisse, in denen er vorkommt: Tore, Vorlagen, Karten und Auswechslungen. Ein einzelnes Spiel endet von selbst mit dem Abpfiff.
Der Body ist das Ereignis selbst, mit denselben Feldern für jeden Typ: Ein Handler deckt alles ab.
Beispielanfrage
Ein Tor, so wie dein Endpunkt es empfängt (Beispielwerte; die Reihenfolge der Felder kann variieren):
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 }
}Einrichtung
1. Bau einen Endpunkt
Dein Endpunkt muss eine POST-Anfrage mit JSON-Body annehmen und mit einem 2xx-Status antworten. Eine Minimalversion in Node.js, mit einem schwer zu erratenden Pfad als Geheimnis:
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);Stell ihn unter einer öffentlichen HTTPS-Adresse bereit.
2. Erstell die Integration
- Melde dich bei Football Live Score an und öffne die Seite der Liga, des Teams, des Spielers oder des Spiels, dem du folgen willst.
- Wähle Integration erstellen, gib ihr einen Namen und wähle HTTP-Webhook als Ziel.
- Füge die Adresse deines Endpunkts unter Webhook-URL ein und wähle Testnachricht senden. Dein Endpunkt bekommt eine Anfrage, deren Body nur {"type": "✅ Football Live Score: Deine Integration funktioniert."} enthält. Antworte mit einem 2xx-Status, dann ist der Test bestanden.
- Wähle die Ereignisse. Tor ist schon ausgewählt.
- Wähle Integration erstellen.
In der App tippst du auf einem Spiel-, Team-, Liga- oder Spielerbildschirm auf die Übertragen-Schaltfläche, legst ein HTTP-Server-Ziel mit derselben URL an, wählst die Ereignisse und startest die Übertragung.

Felder der Anfrage
Jede Anfrage hat dieselben Felder. Alle Werte sind Strings, außer timestamp und, bei YouTube-Ereignissen, post. Ein Feld, das nicht zum Ereignis passt, ist ein leerer String.
- eventId: eindeutige ID des Ereignisses. Wenn zwei deiner Integrationen dasselbe Ereignis abdecken, tragen beide Anfragen dieselbe eventId, so kannst du Duplikate verwerfen.
- type: match_started, match_half_time, match_ended, goal, card, substitution, youtube oder youtube-short.
- matchId: die Spiel-ID (leer bei YouTube-Ereignissen).
- country, countryId, countryLogo: Land des Wettbewerbs, seine ID und die URL seiner Flagge.
- league, leagueId, leagueLogo: Name, ID und Logo-URL des Wettbewerbs.
- matchStadium, matchReferee: Stadion und Schiedsrichter, wenn bekannt.
- teamHome, teamHomeId, teamHomeBadge, teamHomeScore: Name, ID, Wappen-URL und aktueller Spielstand der Heimmannschaft.
- teamAway, teamAwayId, teamAwayBadge, teamAwayScore: dasselbe für die Gastmannschaft.
- time: die Minute eines Tors, einer Karte oder eines Wechsels, so wie unser Datenfeed sie schreibt.
- score: der Spielstand als „Heim - Gast“, zum Beispiel "1 - 0". Bei einem Tor der Stand nach diesem Tor.
- side: home oder away, also das Team, das getroffen, die Karte bekommen oder gewechselt hat.
- player1, player1Id: der Torschütze, der verwarnte oder vom Platz gestellte Spieler oder der eingewechselte Spieler.
- player2, player2Id: der Vorlagengeber (leer, wenn keiner) oder der ausgewechselte Spieler.
- card: die Karte, wie unser Datenfeed sie nennt, zum Beispiel "yellow card" oder "red card".
- timestamp: wann wir das Ereignis erfasst haben, als Objekt mit _seconds (Unix-Zeit) und _nanoseconds.
- post: nur bei YouTube-Ereignissen das Video, unter anderem mit post.youtubeData.title, post.youtubeData.url und post.channelDisplayName.
Zustellung
- Format: eine POST-Anfrage mit Content-Type: application/json und dem Ereignis als Body. Eine Anfrage pro Ereignis und Integration, nie gebündelt.
- Erfolg: jeder 2xx-Status. Ein 4xx- oder 5xx-Status oder ein Verbindungsfehler gilt als Fehlschlag.
- Keine Wiederholung: Eine fehlgeschlagene Zustellung wird nicht erneut gesendet. Sie erscheint als Fehler im Protokoll der Integration.
- Wiederholte Fehlschläge: Nach mehreren Fehlschlägen in Folge wechselt die Integration auf Fehler und sendet nicht mehr. Eine erfolgreiche Zustellung setzt den Zähler zurück.
- Reihenfolge: Die Anfragen gehen unabhängig voneinander raus, zwei Ereignisse aus derselben Minute können also in beliebiger Reihenfolge ankommen.
- Sicherheit: Die Anfragen sind nicht signiert und tragen kein Token. Nutze eine HTTPS-Adresse mit einem langen Zufallsteil wie im Beispiel und ignoriere Anfragen an jeden anderen Pfad.
- Testanfrage: Der Test-Button sendet nur das Feld type. Dein Handler sollte also einen Body ohne die anderen Felder akzeptieren.
Fragen
Brauche ich einen API-Schlüssel?
Nein. Du gibst uns eine URL. Es gibt keinen Schlüssel, den du beantragen, erneuern oder mitsenden musst.
Kann ich nur Tore empfangen?
Ja. Wähle beim Erstellen nur Tor. Die Ereignisse kannst du später mit Bearbeiten ändern.
Warum habe ich dasselbe Tor zweimal bekommen?
Vermutlich decken zwei deiner Integrationen es ab, zum Beispiel eine für die Liga und eine für das Team. Jede sendet das Ereignis, mit derselben eventId. Wenn du bereits erhaltene eventIds verwirfst, ist das erledigt, ebenso die seltene doppelte Zustellung.
Ist das dasselbe wie das Ziel „HTTP-Server“ in der App?
Ja. Die App nennt es „HTTP-Server“, die Website „HTTP-Webhook“. Beide senden dieselbe Anfrage.
Wie schnell kommen die Nachrichten an?
Sobald das Ereignis in unseren Live-Daten ankommt: Die Nachricht ist innerhalb weniger Minuten da.
Wie pausiere oder lösche ich eine Integration?
Öffne auf der Website dein Konto und dann Integrationen. Jede Integration zeigt ihren Status, wie viele Nachrichten gesendet wurden oder fehlgeschlagen sind, ein Protokoll der letzten Zustellungen sowie Schaltflächen zum Pausieren, Bearbeiten und Löschen. In der App findest du deine Übertragungen im Konto-Tab.
Was passiert nach dem Abpfiff?
Eine Integration für ein einzelnes Spiel endet nach dem Abpfiff von selbst. Integrationen für eine Liga, ein Team oder einen Spieler laufen Spiel für Spiel weiter, bis du sie pausierst oder löschst.
Welchen Wettbewerben kann ich folgen?
Allen Ligen und Pokalen auf unserer Abdeckungsseite.
Kostet das etwas?
Integrationen sind derzeit kostenlos. Später kann ein Abo dazukommen.
Weitere Integrationen
Anleitungen: Eine Übertragung starten · Platzhalter für Nachrichten