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
| Field | Meaning |
|---|---|
id | The snapshot's id (UUIDv7). |
match_id | The match it was taken for. |
team_id | The team whose roster this is. |
player_ids | An array of player ids — resolve them in one call with /players?ids=. |
captured_at | When 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_atmeans "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.