A player's last-12-month figures with percentiles
One player's figures over their recorded maps in the last 12 months, each with its percentile among every player who has a player page. A recorded map is one played to a result on a competitive map, in a completed Counter-Strike 2 match that was not a walkover, where the player's line is complete and attributed to one of the two teams that played. Every rate is a ratio of sums over the maps that carry its inputs (ADR and KAST weighted by rounds), never an average of per-map figures; `n` is how many maps a figure uses. A figure from fewer than 10 maps is `null`, and so is its percentile. A percentile is the share of the population with a strictly lower value, floored to one decimal place, so it is never 100; `population.n` is the population's size. `level` is `established`, `listed` or `none`, by the rule in `population.level_definition`. `definition` carries the exact wording of every rule, so you can quote it rather than restate it. `nationality` and `role` are `null` when unknown; the response never carries a real name. Enveloped `{"data": PlayerPerformance}`.
One player's figures over their recorded maps in the last 12 months, each with its percentile among every player who has a player page. A recorded map is one played to a result on a competitive map, in a completed Counter-Strike 2 match that was not a walkover, where the player's line is complete and attributed to one of the two teams that played.
Every rate is a ratio of sums over the maps that carry its inputs (ADR and KAST weighted by rounds), never an average of per-map figures; n is how many maps a figure uses. A figure from fewer than 10 maps is null, and so is its percentile. A percentile is the share of the population with a strictly lower value, floored to one decimal place, so it is never 100; population.n is the population's size.
level is established, listed or none, by the rule in population.level_definition. definition carries the exact wording of every rule, so you can quote it rather than restate it. nationality and role are null when unknown; the response never carries a real name. Enveloped {"data": PlayerPerformance}.
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/players/019f2858-e253-7f3d-bdff-bc7738bd1036/performance"{ "data": { "player_id": "019f23d2-5a33-7c16-8db2-c71322597ec0", "slug": "example-player", "nickname": "ExamplePlayer", "nationality": "FR", "role": "AWP", "level": "established", "window": { "months": 12, "through": "2026-10-10T13:45:00Z" }, "definition": { "window": "The last 12 months of completed Counter-Strike 2 matches, up to the newest recorded map.", "counted_map": "A recorded map is one played to a result on a competitive map, in a completed Counter-Strike 2 match that was not a walkover, where the player's line is complete and attributed to one of the two teams that played.", "population": "Every player with a page, except any whose page was removed on request. A percentile is the share of that population with a strictly lower value. No figure is shown from fewer than 10 maps." }, "population": { "n": 1082, "level_definition": "A player has a page with at least 30 recorded maps at S, A or B-tier events, or at least 20 at S or A-tier events, in the last 12 months; the page is established with at least 20 recorded maps at S or A-tier events. A player keeps a level while at 24 (S/A/B) or 16 (S/A) recorded maps if they met its bar 14 days earlier." }, "metrics": [ { "key": "maps", "label": "Maps", "unit": "count", "value": 197, "n": 197, "percentile": 90.1 }, { "key": "matches", "label": "Matches", "unit": "count", "value": 82, "n": 197, "percentile": 86.8 }, { "key": "kd", "label": "Kills per death", "unit": "ratio", "value": 1.5, "n": 197, "percentile": 99.9 }, { "key": "adr", "label": "Damage per round", "unit": "per_round", "value": 86.8, "n": 197, "percentile": 99.1 }, { "key": "kast", "label": "KAST", "unit": "percent", "value": 78.3, "n": 197, "percentile": 99.7 }, { "key": "headshot_share", "label": "Headshot share of kills", "unit": "percent", "value": 41.7, "n": 197, "percentile": 19.4 }, { "key": "opening_success", "label": "Opening duels won", "unit": "percent", "value": 63, "n": 197, "percentile": 94.4 }, { "key": "multikill_round_share", "label": "Rounds with a multi-kill", "unit": "percent", "value": 22, "n": 197, "percentile": 99.5 }, { "key": "clutches_per_map", "label": "Clutches per map", "unit": "per_map", "value": 0.47, "n": 197, "percentile": 97.5 }, { "key": "trade_kill_share", "label": "Trade share of kills", "unit": "percent", "value": 18.5, "n": 197, "percentile": 28.1 } ] }}{ "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 player's all-time career aggregate GET
Derived career totals + averages over the player's whole-match stat rows (maps are not double-counted). Averages are null for a player with no rated maps. 404 for an unknown player. Enveloped `{"data": PlayerCareerStats}`.
A player's weapon and hit-group profile GET
The player's weapon and hit-group totals over their matches in the last 12 months. Weapon data is recorded per match, never per map. The eight weapons with the most kills are listed and the rest are folded into one `other` row. `matches` is how many matches carry weapon data, and `window.through` is the date of the newest of them. A player with none returns empty lists. Enveloped `{"data": PlayerWeapons}`.