Players

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}`.

GET
/v1/{game}/players/{id}/performance

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}.

Authorization

AuthorizationBearer <token>

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*string

Game slug. cs2 is the only populated title today; an un-onboarded game 404s cleanly.

id*string

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"  }}