GET /matches/{id}/live returns a complete snapshot of a match in progress — including the current score, match clock, live statistics, event timeline, and what’s happening on the pitch right now. Calling this endpoint requires either the live_scores or live_scores_statistics scope.
Find a live match
Before fetching live data, you need a match ID for a game currently in play. Use either of these catalog endpoints (both require thefixtures scope):
GET /matches/active?league={id}— returns onlyNOT_STARTEDorSTARTEDmatches for a league.GET /matches?league={id}&status=STARTED— returns only in-play matches.
match_id, you’re ready to fetch the live snapshot.
Fetch the live snapshot
Key fields explained
status — The live snapshot uses lowercase status values that differ from the catalog. Possible values are live (in play), ht (half-time break), ft (full-time), and not_started.
clock — The match clock object:
minuteandsecondgive the current timer, displayed asminute:second(e.g.75:56).periodtells you which phase of the match the clock is in:1H(first half),2H(second half),HT(half-time break), orFT(full-time).runningistruewhile the clock is ticking andfalseduring breaks.addedindicates added or stoppage time minutes, when applicable.
score — A simple { "home": int, "away": int } object with the current scoreline.
phase — Decoded real-time game state describing what’s happening on the pitch right now. The label field gives a human-readable description such as "Dangerous attack", "Corner", "Goal", or "Safe possession". The team field tells you which side is involved.
stats — An open-ended map of stat keys to per-side integers. Common soccer keys include shots_on_target, shots_off_target, attacks, dangerous_attacks, possession (as a percentage), corners, yellow_cards, and red_cards. Iterate the keys rather than assuming a fixed set — additional provider stats may appear.
events — An ordered timeline of match incidents. Each entry has a minute, type (e.g. goal, yellow_card, substitution), team, and label. The score field on each event captures the scoreline at that moment.
ball — The last known ball position, expressed as normalized coordinates (x and y between 0 and 1). This is anchored to the most recent tracked event.
REST polling vs. WebSocket
REST /live | WebSocket stream | |
|---|---|---|
| Best for | On-demand lookups, polling on a schedule, serverless functions | Continuous real-time display, low-latency score tickers |
| Scope needed | live_scores or live_scores_statistics | live_scores_statistics only |
| Connection | Stateless HTTP — no persistent connection | Persistent WebSocket connection |
| Updates | You control when you fetch | Server pushes every change as it happens |
Fallback behavior and error handling
The/live endpoint serves real-time hot state when available. If there is a brief gap in the live feed, it automatically falls back to the last persisted snapshot — so the endpoint keeps returning data through short interruptions and even after the match ends (returning the final state).
A
404 is returned only when no snapshot has ever been captured for the match — for example, if the match never went live or data collection hasn’t started yet. A match that has finished will still return its final snapshot, not a 404.