Building with AI? Give your coding tool the whole reference in one file: https://soccer-data.co/llms.txt
SOCCER DATA Docs
Sign in Get API key
// Matches

Get a match

Fetch one match in full: teams, kickoff, a detailed score breakdown with the half-time score, the venue, the referee and both managers. Use it for a match page, or to check which extra data (odds, xG, shot map) exists before you call those endpoints.

GET https://api.soccer-data.co/v1/matches/{match_id} Live
  • Check odds_available, xg_available and shotmap_available first, so you don't spend requests on data that isn't there.
  • shotmap_available can be false even when xg_available is true.
  • Score breakdown fields stay null until the match is finished.
  • This endpoint has no live clock. For the in-play minute, use List matches with status=live or the live stats endpoint.
  • While a match is live, responses are normally at most 5 minutes old on Free and 15 seconds old on Pro and Business. If a fresh answer can't be fetched, you may get an older copy marked X-Cache: STALE instead: see When an answer is stale.
  • An unknown match id returns 404 NOT_FOUND.
Path parameters
match_idstringrequired

The match's id, like match_…. Find one with the ID guide.

Response fields
data.idstring

The match's id.

data.competition_idstring

The competition this match belongs to.

data.competition_namestring

The competition's name, so you don't need a second call to show it.

data.season_idstring

The season this match belongs to.

data.matchdayinteger|null

League round number. Null for cup and knockout fixtures. On play-off fixtures it is the play-off round number, not a league gameweek.

data.stagestring

regular for league and group games, playoff for knockout, cup and promotion or relegation play-off fixtures.

data.stage_namestring|null

Name of the round for cup games, such as final, semi_final or group_stage. Null for normal league games.

data.group_labelstring|null

Group letter (A to L) for group-stage games in some tournaments. Null otherwise.

data.statusstring

Where the match stands: scheduled, live, finished, postponed or cancelled.

data.utc_datestring

Kickoff time in UTC, as an ISO 8601 date-time.

data.home_team.idstring

Home team's id.

data.home_team.namestring

Home team's name.

data.away_team.idstring

Away team's id.

data.away_team.namestring

Away team's name.

data.score.homeinteger|null

Home goals in normal time. Null if the match hasn't been played.

data.score.awayinteger|null

Away goals in normal time. Null if the match hasn't been played.

data.score.final_scoreobject|null

Final score with home and away, included only when it differs from the normal-time score (for example after a shoot-out).

data.score.regulationobject|null

Score after 90 minutes, with home and away. Null until the match is finished.

data.score.after_extra_timeobject|null

Goals after 120 minutes, with home and away. Null if there was no extra time.

data.score.penalty_shootoutobject|null

Penalties scored by each side in a shoot-out, with home and away. Null if the match wasn't settled on penalties.

data.score.went_to_extra_timeboolean|null

Whether extra time was played. False for formats that go straight to penalties. Null until finished, or when we can't confirm it.

data.score.went_to_penaltiesboolean|null

Whether the match was decided by a shoot-out. Null until finished.

data.score.winnerstring|null

home, away or draw, taking extra time and penalties into account. Null until finished.

data.score.half_time_homeinteger|null

Home goals at half-time.

data.score.half_time_awayinteger|null

Away goals at half-time.

data.venueobject|null

Where the match is played. Null for cancelled matches that never had a venue.

data.venue.namestring

Stadium name.

data.venue.citystring

City the stadium is in.

data.is_neutralboolean|null

True when the match is played at neither team's home ground. Null means we don't know, so don't treat it as false.

data.refereeobject|null

The match referee. For career totals, use the match referee endpoint.

data.referee.idstring

Referee's id.

data.referee.namestring

Referee's name.

data.home_managerobject|null

Home team's manager. Can be null.

data.home_manager.idstring

Manager's id.

data.home_manager.namestring

Manager's name.

data.away_managerobject|null

Away team's manager. Can be null.

data.away_manager.idstring

Manager's id.

data.away_manager.namestring

Manager's name.

data.odds_availableboolean

True when pre-match odds exist. Older matches usually only have closing prices.

data.live_odds_availableboolean

True when in-play odds are available right now.

data.xg_availableboolean

True when match-level expected goals (xG) exist.

data.shotmap_availableboolean

True only when the shot map has at least one shot with an xG above zero.

data.xg_qualitystring

full when per-shot xG values exist, none when they don't. Treat any value you don't recognise as none.

curl "https://api.soccer-data.co/v1/matches/match_9pd0ck6g2m9i" \
  -H "X-Api-Key: $SOCCER_DATA_KEY"
200 · Example response
{
    "data": {
        "id": "match_9pd0ck6g2m9i",
        "competition_id": "competition_705uv6jm8myn",
        "competition_name": "Premier League",
        "season_id": "season_98l95mxugqs9",
        "matchday": 37,
        "stage": "regular",
        "stage_name": null,
        "group_label": null,
        "status": "finished",
        "utc_date": "2026-05-15T19:00:00.000Z",
        "home_team": {
            "id": "team_4mimn5fmya2v",
            "name": "Aston Villa"
        },
        "away_team": {
            "id": "team_74p8tg2k93z4",
            "name": "Liverpool"
        },
        "score": {
            "home": 4,
            "away": 2,
            "final_score": null,
            "regulation": {
                "home": 4,
                "away": 2
            },
            "after_extra_time": null,
            "penalty_shootout": null,
            "went_to_extra_time": false,
            "went_to_penalties": false,
            "winner": "home",
            "half_time_home": 1,
            "half_time_away": 0
        },
        "venue": {
            "name": "Villa Park",
            "city": "Birmingham"
        },
        "is_neutral": false,
        "referee": {
            "id": "referee_o1sm9am51qq5",
            "name": "Chris Kavanagh"
        },
        "home_manager": {
            "id": "manager_17xiheuxdn67",
            "name": "Unai Emery"
        },
        "away_manager": {
            "id": "manager_fzvvh82pzed4",
            "name": "Arne Slot"
        },
        "odds_available": true,
        "live_odds_available": false,
        "xg_available": true,
        "shotmap_available": true,
        "xg_quality": "full"
    }
}
Get a free key to try it