CS2 data reference

Pre-match lineups

Each team's listed roster as snapshotted before a match — a roster, not a confirmed starting five.

GET /v1/{game}/matches/{id}/lineups returns the roster snapshots taken for each team ahead of the match. The same rows are available embedded, via include=lineups, on GET /v1/{game}/matches/{id} and on the bulk endpoint.

A snapshot is a team's listed roster, not an announced starting five. player_ids usually holds 6–7 ids, and can hold more or fewer. Who actually played is on the match's stat lines once it has been played.

The shape

FieldMeaning
idThe snapshot's id (UUIDv7).
match_idThe match it was taken for.
team_idThe team whose roster this is.
player_idsAn array of player ids — resolve them in one call with /players?ids=.
captured_atWhen we observed this roster (RFC 3339, UTC).

Rows come back grouped by team, oldest capture first within each team.

Append-on-change

A row is written only when a team's observed roster differs from the last one recorded for that match. So:

  • The last row per team is the roster as last seen before the match.
  • More than one row for a team means the roster changed in the run-up — the earlier rows are the history of that change.
  • An old captured_at means "hasn't changed since", not "stale".
lineups = get(f"/v1/cs2/matches/{match_id}/lineups")["data"]

latest = {}
for row in lineups:                 # oldest first per team, so the last one wins
    latest[row["team_id"]] = row

for team_id, row in latest.items():
    print(team_id, len(row["player_ids"]), "listed as of", row["captured_at"])

Coverage

Capture began on 2026-07-09; matches before that have no lineup rows, and not every match since has them. Check rather than assume: data_available.lineups on a match row says whether any exist, and ?has=lineups filters a match list to those that do.

An empty data: [] is the normal answer for a match with no snapshots — and, as with the other match sub-resources, for a match id that doesn't exist. See errors.

Lineups vs roster history

Roster history is derived from who actually played in completed matches. Lineups are what was listed beforehand. Comparing a team's last pre-match snapshot with the players on its stat lines is how you spot a stand-in.

On this page