Round-level figures for the top teams
The round-level figures of `/teams/{id}/round-stats` for the top teams of the board, in board order, each with its identity and board position — so one team's rates can be placed among its peers in a single request instead of one per peer. Every row is computed over the same trailing `window` (default 6 months, maximum 12) from the same definitions as the per-team endpoint. A cohort team with no recorded rounds in the window reports `rounds: 0` and null rates. `limit` (default 30, maximum 100) is the number of top teams. The result is computed once per ten minutes per parameter set and shared across callers. Enveloped `{"data": [TeamRoundStatsEntry, ...], "meta": {...}}`.
The round-level figures of /teams/{id}/round-stats for the top teams of the board, in board order, each with its identity and board position — so one team's rates can be placed among its peers in a single request instead of one per peer.
Every row is computed over the same trailing window (default 6 months, maximum 12) from the same definitions as the per-team endpoint. A cohort team with no recorded rounds in the window reports rounds: 0 and null rates. limit (default 30, maximum 100) is the number of top teams. The result is computed once per ten minutes per parameter set and shared across callers. Enveloped {"data": [TeamRoundStatsEntry, ...], "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"How many of the top teams to include. Default 30, maximum 100. Not paginated.
1 <= value <= 10030Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/cs2/rankings/round-stats"{ "data": [ { "team": { "id": "019f23d1-fb5c-7be8-b53d-f9801eb21ee6", "name": "Vitality", "slug": "vitality" }, "rank": 1, "rounds": 2116, "ct_win_pct": 61.72607879924953, "t_win_pct": 50.666666666666664, "pistol_win_pct": 57.5, "opening_win_pct": 77.7292576419214, "opening_duel_pct": 54.16272469252602, "eco_win_pct": 43.7037037037037, "clutch_pct": 13.146997929606625 }, { "team": { "id": "019f23d1-fb5c-7a98-97da-542fb409d0ad", "name": "Spirit", "slug": "spirit" }, "rank": 2, "rounds": 2283, "ct_win_pct": 58.86019590382903, "t_win_pct": 55.172413793103445, "pistol_win_pct": 50, "opening_win_pct": 77.22852512155592, "opening_duel_pct": 54.17032484635645, "eco_win_pct": 34.09090909090909, "clutch_pct": 14.215686274509803 }, { "team": { "id": "019f23d1-fb5c-738b-8ca9-2e78eaeb5b42", "name": "MOUZ", "slug": "mouz-cs2" }, "rank": 3, "rounds": 2275, "ct_win_pct": 58.88412017167382, "t_win_pct": 49.63963963963964, "pistol_win_pct": 48.598130841121495, "opening_win_pct": 76.27986348122867, "opening_duel_pct": 51.76678445229682, "eco_win_pct": 35.62091503267974, "clutch_pct": 12.248803827751196 } ], "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" }}The team board over time GET
The top of the team board at each of the last `weeks` weekly marks, oldest first, the newest being now. Always exactly `weeks` snapshots (default 13, maximum 52), each listing the top `top` teams (default 10, maximum 25). Each snapshot is the board `/rankings` would have served at that instant: every team's latest rating then, its deviation inflated for the idle time since, and the same activity floor (at least 5 rated matches in the three months ending then), so a team appears only if it was active at the time. A mark at which no team met the floor has an empty `entries` list. `value` is the board's own metric, `glicko2_conservative`. The result is computed once per ten minutes and shared across callers, so the newest snapshot's `as_of` can be up to ten minutes old. Enveloped `{"data": [RankingSnapshot, ...], "meta": {...}}`.
Team or player rankings (leaderboard) GET
Ranked leaderboard over a rolling **3-month** window. `?type=team` (default) or `?type=player` — the two are ranked on different metrics, reported in each row's `metric` field. **Teams** rank on `glicko2_conservative`: a Glicko-2 rating discounted by twice its rating deviation (`rating − 2·RD`), so a team with a volatile, thinly-evidenced rating sorts below an equally-rated team the model is confident about. **Players** rank on `rating`. Sorting rows by `value` reproduces `rank` exactly. Entities below the sample floor are omitted rather than ranked on noise: teams need at least 5 rated matches in the window, players at least 30 rated maps. A map counts once, from its own per-map rating, and only if it was played on a competitive map — the whole-match summary stored beside a player's maps is neither counted nor averaged. This is always our own rating, never a third party's — a team's separately-sourced `external_rank` is reported alongside for comparison, not used for ordering. Not cursor-paginated: `limit` truncates the computed board and `meta.next_cursor` is always null. Team rows carry `rank_delta`, the movement against seven days ago by default; `delta_days` sets how far back it looks. `include=trend` adds `trend`, the board metric at each of the last twelve weekly marks, and `include=rating` adds `rating` and `rd`, the Glicko-2 rating and deviation behind `value`. None of them changes the board itself, and without them the response is unchanged. For the board's top over a longer span use `/rankings/history`.