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 match timeline

Get the events of a played match in the order they happened: goals, cards, substitutions, shots, VAR checks and more. Use it to build a match report, a goal list or a minute-by-minute feed. Filter by event type, period or team to get just what you need.

GET https://api.soccer-data.co/v1/matches/{match_id}/timeline
  • Returns 409 while the match is live. Use the live timeline endpoint until full-time.
  • Goals come in three types. Penalties are penalty_scored and own goals are own_goal, so send event_type=goal,penalty_scored,own_goal to get every goal.
  • Shoot-out kicks are also penalty_scored, with period set to penalties. Use the period filter to leave them out.
  • Stoppage time is always split out. A card at 45+3 has minute 45 and extra_time 3.
  • If a match has no timeline, you still get a 200 with an empty events list. meta.coverage is none and meta.reason tells you why.
  • An unknown event_type returns 400.
Path parameters
match_idstringrequired

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

Query parameters
event_type string

Comma-separated list of event types to keep. Leave it out to get every event.

goalown_goalshot_on_targetshot_off_targetshot_blockedshot_savedshot_woodworkyellow_cardred_cardyellow_red_cardfouloffsidecorner_kicksubstitutionpenalty_awardedpenalty_scoredpenalty_missedpenalty_savedvarperiod_startperiod_endadded_time
period string

Comma-separated list of periods to keep, for example only the second half.

first_halfsecond_halfextra_time_first_halfextra_time_second_halfpenalties
team_id string

Only return events for this team.

Response fields
data.match_idstring

The match's id.

data.coveragestring

full when a timeline exists for this match, none when it doesn't.

data.events[]array

Events in the order they happened. Empty when there is no timeline. Read the list as it comes; it is already sorted.

data.events[].sequenceinteger

Position of the event in the match, starting at 1.

data.events[].minuteinteger

Minute of the event within normal time for that period. Stoppage minutes go in extra_time.

data.events[].extra_timeinteger

Stoppage minutes on top of minute. 0 for events in normal time.

data.events[].periodstring

first_half, second_half, extra_time_first_half, extra_time_second_half or penalties.

data.events[].typestring

What happened. One of goal, own_goal, shot_on_target, shot_off_target, shot_blocked, shot_saved, shot_woodwork (hit the post or bar), yellow_card, red_card, yellow_red_card, foul, offside, corner_kick, substitution, penalty_awarded, penalty_scored, penalty_missed, penalty_saved, var, period_start, period_end or added_time. For own_goal, player is the one who put it in their own net and team is their side, so the goal counts for the other team.

data.events[].teamobject|null

The team involved.

data.events[].team.idstring|null

Team's id. Null when only the name is known.

data.events[].team.namestring

Team's name.

data.events[].team.slugstring|null

URL-friendly name, handy for building links.

data.events[].playerobject|null

The player involved. Same fields as team: id (null when only the name is known), name and slug.

meta.totalinteger

Number of events returned, after filters.

meta.coveragestring

Same as data.coverage: full or none.

meta.reasonstring

Only present when coverage is none. match_not_started, no_events, or not_supported when we don't cover events for this competition.

meta.last_updatedstring|null

When the timeline last changed.

curl "https://api.soccer-data.co/v1/matches/match_9pd0ck6g2m9i/timeline" \
  -H "X-Api-Key: $SOCCER_DATA_KEY"
200 · Example response
{
    "data": {
        "match_id": "match_9pd0ck6g2m9i",
        "coverage": "full",
        "events": [
            {
                "sequence": 3,
                "minute": 45,
                "extra_time": 3,
                "period": "first_half",
                "type": "yellow_card",
                "team": {
                    "id": "team_4mimn5fmya2v",
                    "name": "Aston Villa",
                    "slug": "aston-villa-team_4mimn5fmya2v"
                },
                "player": {
                    "id": "player_85xcr2xm5vxo",
                    "name": "Ollie Watkins",
                    "slug": "ollie-watkins-player_85xcr2xm5vxo"
                }
            }
        ]
    },
    "meta": {
        "total": 10,
        "coverage": "full",
        "last_updated": "2026-05-15T21:05:49.659Z"
    }
}
Get a free key to try it