Live-Spielstatus
Aggregierter Live-Spielstatus — Punktestände, Perioden, Uhren, Ballbesitz und sportartspezifische situative Daten — aus Sportsbooks zusammengeführt zu einer einzigen autoritativen Ansicht pro Event. Eine Zeile pro Live-Spiel, konsensbasiert ausgewählt aus den Büchern, die es abdecken.
GET /api/v1/gamestate
GET /api/v1/gamestate/{sport}Authentifizierung
Erfordert API-Schlüssel. Verfügbar mit dem Game State Add-on (79 $/Monat) oder der
Enterprise-Stufe. Schlüssel ohne eines von beiden erhalten 403 tier_restricted
mit addon: "game_state" im Fehler-Body. Fügen Sie das Add-on über die
Abrechnungsseite bei jedem kostenpflichtigen Plan
hinzu (Hobby / Pro / Sharp); Enterprise-Schlüssel haben es bereits enthalten.
Live-Spielstatus wird auch über den Kanal gamestate per
SSE und WebSocket gestreamt
— siehe Streaming unten. (Streaming-Zugriff erfordert das
WebSocket Add-on oder Enterprise, zusätzlich zur oben genannten Game State-
Anforderung.)
Pfadparameter
| Parameter | Typ | Beschreibung |
|---|---|---|
sport | string | (optional) Einzelne zurückzugebende Sportart. Entspricht einer bekannten Atlas-Sportart (baseball, basketball, football, hockey, soccer, tennis, table_tennis, cricket, esports, snooker, other). Groß-/Kleinschreibung wird ignoriert. Unbekannte Sportarten geben ein leeres data-Objekt zurück. |
Ohne den Pfadparameter werden alle Sportarten mit Live-Events zurückgegeben.
Antwort-Hülle
{
"data": {
"<sport>": {
"<event_id>": { ...event state... }
}
},
"updated_at": "2026-04-23T23:55:01.234Z"
}Jeder Event-Status ist über seine kanonische event_id innerhalb seines Sportart-
Buckets indiziert. updated_at ist die Serverzeit, zu der diese Antwort erstellt
wurde — verwenden Sie sie, um die Aktualität bei Polling abzuschätzen.
Event-Status-Felder
Jedes Feld ist optional, sofern nicht anders angegeben. Das Vorhandensein variiert je nach Sportart —
Tennis-Events enthalten sets_home / server; Hockey-Events enthalten
power_play; Soccer-Events enthalten corners_* / yellow_cards_*; usw.
Immer vorhanden
| Feld | Typ | Hinweise |
|---|---|---|
home_team | string | Normalisierter Name des Heimteams |
away_team | string | Normalisierter Name des Auswärtsteams |
sport | string | Sportart-Bucket (baseball, soccer, …) |
league | string | Atlas-Liga-ID (z. B. mlb, england_-_premier_league) |
home_score | integer | Aktueller Heim-Punktestand in der natürlichen Einheit für die Sportart (Runs, Punkte, Tore, Sätze — Tennis verwendet summierte Satzpunkte) |
away_score | integer | Aktueller Auswärts-Punktestand |
is_live | boolean | In diesem Endpoint immer true (Nicht-Live-Events sind nicht enthalten) |
primary_book | string | Das Buch, aus dem die zusammengeführten Punktestände ausgewählt wurden. Konsensbasiert — höherwertige Bücher gewinnen bei Gleichstand |
book_count | integer | Anzahl der Sportsbooks, die zum Zeitpunkt des Mergens Live-Status für dieses Event beigetragen haben |
Zeitlich (die meisten Mannschaftssportarten)
| Feld | Typ | Beispiel |
|---|---|---|
game_period | string | "T5" (MLB Anfang des 5.), "Q3" (NBA Q3), "2H" (Soccer 2. Halbzeit), "P2" (NHL), "S2" (Tennis 2. Satz), "FT" (Spielende) |
game_clock | string | "49:06" für hochzählende Sportarten (Soccer), "5:42" für herunterzählende Sportarten (Basketball, Hockey) |
Situativ
| Feld | Typ | Hinweise |
|---|---|---|
possession | "home" | "away" | Welches Team in Ballbesitz ist (Mannschaftssportarten) oder aufschlägt (Tennis) |
server | "home" | "away" | Nur Tennis — aktueller Aufschläger |
last_play | string | Sportartspezifische Beschreibung des letzten Spielzugs, sofern verfügbar |
is_timeout | boolean | true während eines Timeouts |
Sportartspezifisch
| Feld | Sportart | Typ |
|---|---|---|
fouls_home, fouls_away | basketball, soccer | integer |
corners_home, corners_away | soccer | integer |
yellow_cards_home, yellow_cards_away | soccer | integer |
red_cards_home, red_cards_away | soccer | integer |
power_play | hockey | "home" | "away" |
sets_home, sets_away | tennis | integer (gewonnene Sätze) |
hits_home, hits_away | baseball | integer |
home_pitcher, away_pitcher | baseball | string — Anzeigename des Starting Pitchers |
wickets_home, wickets_away | cricket | integer |
overs | cricket | float |
batting_team | cricket | "home" | "away" |
Aktualität
| Feld | Typ | Bedeutung |
|---|---|---|
stale | true (sonst weggelassen) | Die TTL des Livestate-Schlüssels von primary_book ist zum Zeitpunkt des Mergens unter den Aktualitätsschwellenwert des Aggregators (~10s) gefallen. Punktestände sind die zuletzt bekannten Werte; das Buch ist verstummt. Behandeln Sie Punktestände und Periode des Events als möglicherweise hinter dem tatsächlichen Spielstatus zurückbleibend. |
aggregator_stale | true (sonst weggelassen) | Der SharpAPI-Aggregator selbst hat seit über ~30s keinen neuen gamestate:{sport}-Shard für diese Sportart geschrieben. Breiteres Signal als stale — weist auf eine Pipeline-Störung hin, nicht auf ein Problem mit einem einzelnen Buch. Wenn Sie dies anhaltend sehen, kontaktieren Sie den Support. |
Abwesenheit = aktuell. Sowohl stale als auch aggregator_stale werden nur
geschrieben, wenn sie zutreffen, was die Payload kompakt hält. Wenn Sie sie
nicht bei einem Event sehen, gelten die Daten als aktuell.
Beispielanfragen
cURL
# Alle Live-Events über alle Sportarten
curl "https://api.sharpapi.io/api/v1/gamestate" \
-H "X-API-Key: YOUR_API_KEY"
# Eine Sportart
curl "https://api.sharpapi.io/api/v1/gamestate/soccer" \
-H "X-API-Key: YOUR_API_KEY"Beispielantwort
{
"data": {
"soccer": {
"argentina_-_primera_division_bocajuniors_defensayjusticia_2026-04-23": {
"home_team": "Defensa y Justicia",
"away_team": "Boca Juniors",
"sport": "soccer",
"league": "argentina_-_primera_division",
"home_score": 0,
"away_score": 1,
"game_period": "2H",
"game_clock": "49:06",
"is_live": true,
"possession": "away",
"corners_home": 1,
"corners_away": 0,
"fouls_home": 0,
"fouls_away": 0,
"yellow_cards_home": 0,
"yellow_cards_away": 0,
"red_cards_home": 0,
"red_cards_away": 0,
"primary_book": "draftkings",
"book_count": 6
},
"chile_-_primera_division_concepcion_palestino_2026-04-24": {
"home_team": "Palestino",
"away_team": "Concepción",
"sport": "soccer",
"league": "chile_-_primera_division",
"home_score": 0,
"away_score": 0,
"is_live": true,
"primary_book": "unibet",
"book_count": 1,
"stale": true
}
}
},
"updated_at": "2026-04-23T23:55:01.234Z"
}Cross-Book-Merge-Modell
Die Felder jedes Events werden aus dem Livestate-Snapshot jedes Sportsbooks über einen dreiklassigen Algorithmus zusammengeführt:
- Klasse A — Punktestände werden per Konsens ausgewählt: Unter den Büchern mit dem am weitesten fortgeschrittenen Periodenrang gewinnt der höchste Gesamtpunktestand mit ≥2 Unterstützern. Ein einzelnes Buch, das einen Ausreißer-Score meldet (häufig in den ersten Sekunden einer Punkteänderung oder von einem fehlerhaften Adapter), wird abgelehnt.
- Klasse B — Zeitliche Felder (
game_period,game_clock) werden basierend auf der sportartabhängigen Uhrenrichtung — herunterzählend vs. hochzählend — und dem Periodenrang ausgewählt. - Klasse C — Situative Felder (
possession,corners_*, etc.) werden prioritätsbasiert aus einem festen Buchranking gefüllt.
primary_book gibt an, aus welchem Buch die siegreichen Punktestände stammten.
book_count ist die Gesamtzahl der Bücher, die zum Zeitpunkt des Mergens
irgendeinen Status zum Event beigetragen haben.
Streaming
Jede Aktualisierung, die der REST-Endpoint beim nächsten Poll anzeigen würde,
löst auch ein gamestate:update-Event auf den Streaming-Kanälen aus:
- SSE:
GET /api/v1/stream/gamestate - WebSocket: Abonnieren Sie
{channels: ["gamestate"]}aufwss://ws.sharpapi.io/ws
Streaming-Clients erhalten einen initialen gamestate:snapshot mit dem vollständigen
aktuellen Status (eine flache Liste von Event-Zeilen), dann gamestate:update-
Events mit geänderten Zeilen während des Mergens und gamestate:removed-
Events, wenn Events aus der Live-Menge fallen.
Rate Limits & Kontingente
Rate Limits richten sich nach Ihrer Basisstufe, nicht nach dem Add-on — Hobby-Schlüssel behalten
ihre 120 req/min, Pro behalten 300, Sharp behalten 1.000, Enterprise individuell.
Siehe Pricing . /gamestate zählt
genauso wie andere REST-Aufrufe zum Pro-Minute-Kontingent.
Fehlerbehebung
- 403
tier_restrictedmitaddon: "game_state"— Ihr Schlüssel hat das Game State Add-on nicht. Fügen Sie es über Billing für 79 $/Monat hinzu oder upgraden Sie auf Enterprise. - Leeres
data-Objekt — keine Live-Events im Bereich. Dies ist häufig zwischen Events bei kleineren Sportplänen. Pollen Sie erneut. - Events mit
stale: true— das primäre Buch ist verstummt. Punktestände können hinterherhinken; erwägen Sie, sie herauszufiltern oder einen UI- Indikator anzuzeigen. - Events mit
aggregator_stale: true— der SharpAPI-Aggregator hat diese Sportart seit >30s nicht aktualisiert. Wenn anhaltend, kontaktieren Sie den Support; ein kurzer Anstieg kann während Redeploys auftreten. - Dieselbe Partie erscheint zweimal unter verschiedenen
event_ids — bekannte Einschränkung bei einigen regionalen Ligen, in denen Sportsbooks inkonsistente Liganamen verwenden. Verwenden Sie(home_team, away_team)als sekundären Dedup-Schlüssel auf dem Client, bis die verbleibenden Alias-Lücken geschlossen sind.