CS2 API: maps[] empty and point-in-time semantics of /matches/{id}/stats/
Hi Bzzoiro team,
I'm using the CS2 API (Sports Addon) for internal backtesting research, and I have three questions.
1) maps[] is empty for finished matches
In GET /csgo/api/v2/matches/{id}/, the maps field is present but empty ([]) for every finished match I sampled: 40 finished matches spread from December 2025 to October 2026, including ESL Pro League Season 24 matches, across all ages. The docs show a finished best-of-3 with three maps. Is maps[] populated for CS2 matches at all? If so, which matches have it, and is it restricted by plan or tier, or is it a known data gap?
2) Are /matches/{id}/stats/ values frozen at kickoff?
The docs say the endpoint returns how both sides were playing "going into the match". For a finished match, are form_results, map_pool, head_to_head and the aggregate rates (map_winrate, round_winrate_t/ct, pistol_winrate, opening_conversion, first_to_rounds, kd_ratio, avg_damage):
(a) stored when the match was collected, before kickoff, and never changed afterwards, or
(b) recomputed on request using only data from before the match start, or
(c) computed from current data at request time?
Is there any timestamp field (for example as_of or computed_at) that tells me when these values were calculated? What time window do form_results, the aggregate rates and map_pool use? (head_to_head recent_matches is often an empty list even when total_matches is above zero; is that expected?)
3) elo_rating and player-stats
Is team elo_rating only the current value, or is there any way to get the rating as it stood before a given match? What does elo_peak mean? For /matches/{id}/player-stats/, are the stats and percentiles computed as of that match, and over what window and population?
A short answer to each would help me a lot. I'm also happy to share example match IDs.
Thanks,
Gigi
Comments
1
Bzzoiro · Admin
Oct 18, 2026 15:21
Hi,
Thanks for the detailed report. You were right on every point, and here is what changed in the CS2 API today.
Point-in-time stats (/matches/{id}/stats/ and /player-stats/)
- Stats for a match are now collected only before it starts, and never overwritten afterwards.
- Both endpoints now return collected_at (when the snapshot was taken) and pre_match (true if it was taken before the start). For backtesting, filter on pre_match = true.
- Older snapshots were kept rather than deleted: about 16% of them were taken after the start and now show pre_match = false.
- The map pool "winrate" field is the share of the team's picks or bans on each map, not a win rate. The key is unchanged, and the docs now say what it is.
ELO before the match
- Matches now include home_elo_before and away_elo_before, the ratings each team had going into that match. Upcoming matches show the current rating. The existing rating fields are still the current ones.
Head-to-head
- The home and away win counts in H2H were sometimes the wrong way round. They are now always counted for this match's home and away teams, including for older matches.
best_of and maps
- best_of is now derived from the final score where the score shows more than one map. best_of = 1 means Bo1 or unknown.
- maps[] stays an empty list. Per-map results are not collected at the moment, and the docs now say so. The previous docs example with map scores was wrong, sorry about that. The other CS2 examples in the docs were rebuilt from real responses.
Bzzoiro
Log in to comment.