League-wide figures for each competitive map
Each competitive map's league-wide figures over the trailing `window`: maps played (a map played out — technical results and walkovers are not counted), the average number of rounds, the rounds played and won on each side, and the bans and picks recorded in the vetoes whose sequence included the map. `veto_matches` is the number of those matches. A map added to the pool recently has fewer, so read a map's bans and picks against its own `veto_matches`, never against another map's. A veto choice counts only on a competitive map and only when its acting team is one of the match's two sides. Every map in the Active Duty pool is listed, with zeros before its first map, plus any retired map still played in the window. Most played first. The result is computed once per ten minutes per parameter set and shared across callers. Enveloped `{"data": [MapStat, ...], "meta": {...}}`.
Each competitive map's league-wide figures over the trailing window: maps played (a map played out — technical results and walkovers are not counted), the average number of rounds, the rounds played and won on each side, and the bans and picks recorded in the vetoes whose sequence included the map.
veto_matches is the number of those matches. A map added to the pool recently has fewer, so read a map's bans and picks against its own veto_matches, never against another map's. A veto choice counts only on a competitive map and only when its acting team is one of the match's two sides. Every map in the Active Duty pool is listed, with zeros before its first map, plus any retired map still played in the window.
Most played first. The result is computed once per ten minutes per parameter set and shared across callers. Enveloped {"data": [MapStat, ...], "meta": {...}}.
Primary auth (live). Authorization: Bearer <api-key> — the header takes precedence over the query fallback. The raw key is hashed (SHA-256, hex) and looked up in api.keys.key_hash; the raw value is never stored.
In: header
Path Parameters
Game slug. cs2 is the only populated title today; an un-onboarded game 404s cleanly.
Query Parameters
The trailing span of matches the figures cover: a whole number of months with an m suffix, such as 6m, up to 12m. Default 6m. Anything else is a 400 naming the parameter.
"6m"Which Counter-Strike era the matches come from. cs2 keeps only Counter-Strike 2 matches (a match with no recorded version counts as Counter-Strike 2 when it was played on or after 2023-10-16); all (the default) keeps every match.
"all"Value in
- "cs2"
- "all"
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/cs2/maps"{ "data": [ { "map_name": "de_dust2", "active_pool": true, "played": 2224, "avg_rounds": 21.5, "ct_rounds": 39377, "ct_round_wins": 20146, "t_rounds": 39377, "t_round_wins": 19231, "bans": 1681, "picks": 1459, "veto_matches": 3787 }, { "map_name": "de_mirage", "active_pool": true, "played": 1992, "avg_rounds": 21.5, "ct_rounds": 35971, "ct_round_wins": 19605, "t_rounds": 35971, "t_round_wins": 16366, "bans": 1860, "picks": 1196, "veto_matches": 3788 }, { "map_name": "de_ancient", "active_pool": true, "played": 1935, "avg_rounds": 21.4, "ct_rounds": 33913, "ct_round_wins": 17859, "t_rounds": 33913, "t_round_wins": 16054, "bans": 1973, "picks": 1166, "veto_matches": 3789 } ], "meta": { "count": 3, "next_cursor": null }}{ "error": { "code": "not_found", "message": "not found", "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578" }}{ "error": { "code": "not_found", "message": "not found", "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578" }}{ "error": { "code": "rate_limited", "message": "rate limit exceeded", "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578" }}How each team fares on one map GET
How each team fares on one map over the trailing `window`: maps played and won, the team's own picks and bans of the map, `veto_matches` (its matches with a recorded veto — the denominator for picks and bans) and `permaban` (the rule `/teams/{id}/vetoes` uses). A team is listed when it has at least 10 maps played on the map or at least 10 picks plus bans of it in the window, so a map a team never plays because it always bans it still lists that team. Most played first, then most chosen. The result is computed once per ten minutes per parameter set and shared across callers. `limit` default 100, maximum 200. Enveloped `{"data": [MapTeamStat, ...], "meta": {...}}`.
Per-player CS2 depth breakdowns for one match GET
The five CS2 depth breakdowns for one match, grouped into a single object: per-player `weapons`, `grenades`, `hitgroups` (body hit-group distribution), `duels` (the killer→victim kills matrix) and `flashes` (the flasher→flashed blind matrix). These are per-MATCH aggregates (not per map). Each group is a flat array whose elements carry their own `player_id` (and, for duels/flashes, the ordered pair of player ids), so a client groups by player itself. A match with no depth on record (older or lower-tier matches — roughly one in six lack it) returns every group as an empty array (never null); an unknown match id does the same. Single-resource envelope: `{"data": {weapons, grenades, hitgroups, duels, flashes}}`.