A team's current players
Everyone who played for the team in its newest completed match with stats, usually five, with each player's own figures over the last 12 months (the same figures as their `/players/{id}/performance`), whether they have a player page, and when their current run with the team began. `as_of` is that match's date. A team with no such match returns `as_of: null` and no players. Figures are `null` below 10 maps. Enveloped `{"data": TeamPlayers}`.
Everyone who played for the team in its newest completed match with stats, usually five, with each player's own figures over the last 12 months (the same figures as their /players/{id}/performance), whether they have a player page, and when their current run with the team began. as_of is that match's date. A team with no such match returns as_of: null and no players. Figures are null below 10 maps. Enveloped {"data": TeamPlayers}.
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.
Resource identifier — either a UUID or the resource's human-readable slug, scoped to {game}. /v1/cs2/teams/natus-vincere and /v1/cs2/teams/019f23d1-fb5c-7987-b522-47c3a5e72111 address the same row, so you can go straight from a slug you already have without first looking up its id.
Slugs work on teams, players and tournaments. Matches have no slug, so a match id must be a UUID. Either way, an identifier that resolves to nothing returns 404 not_found.
A team or a player also answers to a slug it was renamed away from, as long as no current team or player holds that slug — so a link made before a rename keeps working. The row returned carries its current slug.
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/cs2/teams/019f2858-e253-7f3d-bdff-bc7738bd1036/players"{ "data": { "as_of": "2026-10-10T13:47:56Z", "players": [ { "player_id": "019f23d2-5a33-7a93-a0c3-2eab96d6f283", "slug": "apex", "nickname": "apEX", "nationality": "FR", "role": "IGL", "maps": 197, "adr": 70.6, "kast": 72.6, "kd": 0.87, "has_page": true, "since": "2023-10-16T02:35:25.175Z" }, { "player_id": "019f23d2-5a33-732f-9db8-c15990e3de45", "slug": "flamez", "nickname": "flameZ", "nationality": "IL", "role": null, "maps": 197, "adr": 77.3, "kast": 75.7, "kd": 1.08, "has_page": true, "since": "2023-10-16T02:35:25.175Z" }, { "player_id": "019f23d2-5a33-7f05-ab6f-45e6ac0aa728", "slug": "mezil", "nickname": "mezii", "nationality": "GB", "role": "Rifler", "maps": 183, "adr": 68.8, "kast": 76.1, "kd": 1.03, "has_page": true, "since": "2023-11-22T14:35:06.404Z" }, { "player_id": "019f23d2-5a33-738c-84c5-79df2064f0db", "slug": "ropz", "nickname": "ropz", "nationality": "EE", "role": "Lurker", "maps": 197, "adr": 75.6, "kast": 76.6, "kd": 1.23, "has_page": true, "since": "2025-01-15T18:35:13.631Z" }, { "player_id": "019f23d2-5a33-7c16-8db2-c71322597ec0", "slug": "example-player", "nickname": "ExamplePlayer", "nationality": "FR", "role": "AWP", "maps": 197, "adr": 86.8, "kast": 78.3, "kd": 1.5, "has_page": true, "since": "2023-10-16T02:35:25.175Z" } ] }}{ "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" }}A team's per-map win/loss record GET
The team's aggregate record on each map it has a completed result on, best win rate first. Raw counts (`played`, `wins`); the win rate is `wins / played`. Only maps played out count: a forfeit, an abandoned map or an awarded walkover is not a performance. By default the record covers the team's whole history. `window`, `era` and `active` narrow it to what is current: a trailing span of matches, Counter-Strike 2 only, and only the maps in the Active Duty pool today, so a retired map's old record does not read as present form. `include=detail` adds each map's last-played date, its pool membership, and the team's round record by side and in pistol rounds. Enveloped `{"data": [TeamMapStat, ...], "meta": {...}}` (not cursor-paginated).
A team's Glicko-2 rating history GET
The team's own computed Glicko-2 rating over time (one point per played match), oldest→newest for a left-to-right chart. `limit` default 30, max 1000; naming a `window` returns that whole span (the default then rises to the maximum). Each point carries the `match_id` that moved it, so a chart can say what happened there and join it to `/teams/{id}/results`. Enveloped `{"data": [TeamRatingPoint, ...], "meta": {...}}` (not cursor-paginated).