List players for a game
Every player in the game, alphabetically by nickname, cursor-paginated. Filter by `team`, `slug` or `role`, or fetch a specific batch with `?ids=` (1–500 comma-separated ids) — which is the efficient way to resolve the player ids you got back from a match's stats in a single request instead of one call per player.
Every player in the game, alphabetically by nickname, cursor-paginated. Filter by team, slug or role, or fetch a specific batch with ?ids= (1–500 comma-separated ids) — which is the efficient way to resolve the player ids you got back from a match's stats in a single request instead of one call per player.
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
Exact-match filter on the resource's URL slug (e.g. slug=natus-vincere), scoped to {game}. Returns the single matching row — or an empty page when nothing matches — in the standard list envelope, so it is a direct by-slug lookup that never depends on page size or the cursor position. Composes with the endpoint's other filters (AND).
Filter to one team's roster (UUID).
uuidFilter to one in-game role: AWP, IGL, Lurker, Rifler or Support. Exact match and case-sensitive. Only about 14% of players have a role on file, so this filter is far narrower than it looks — it excludes every player whose role is unknown rather than treating them as unmatched.
Batch lookup by player id: a comma-separated list of 1–500 UUIDs, composed with the other filters (a malformed or out-of-range value returns 400). Resolves many players in one call.
Ordering. nickname (default) or slug, each reversible with a - prefix (sort=-nickname). Performance metrics are not sortable here — they live on match stats, not the player row; use the rankings endpoint for a performance-ordered board. An unrecognised key returns 400. A cursor is bound to its sort.
Page size. The default and maximum vary per endpoint — this shared definition documents the common case (default 100, max 500); each operation that differs states its own numbers. cursor carries the page position, not limit.
A value above the endpoint's maximum is silently clamped, not rejected. A missing, zero, negative or non-numeric value silently falls back to the default — so ?limit=abc and ?limit=0 both return the default page size rather than a 400. Read meta.count if you need to know how many rows you actually got.
1 <= value100Opaque forward pagination cursor — pass the previous page's meta.next_cursor verbatim. Omit for the first page. Never construct one by hand.
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/cs2/players"{ "data": [ { "id": "019f2e16-d5d3-736f-85a2-c85e2f71d8ae", "game_id": "019f23d1-fb5b-7d24-935d-e4d68f6f565a", "slug": "levi_3r", "nickname": " Levi 3R", "real_name": "Elvis Deaconu", "nationality": "RO", "role": null, "team_id": "019f2e16-d5d3-7968-8b00-a1e6bf2a057f", "created_at": "2026-07-04T17:04:36.313963Z", "updated_at": "2026-07-25T23:06:56.921667Z" }, { "id": "019f50d7-cb2c-790e-a268-03a188248018", "game_id": "019f23d1-fb5b-7d24-935d-e4d68f6f565a", "slug": "nara999", "nickname": " nara999", "real_name": "", "nationality": "RU", "role": null, "team_id": "019f2858-e255-76de-b662-e1cdae4a9429", "created_at": "2026-07-11T11:02:42.37862Z", "updated_at": "2026-07-13T12:49:49.766649Z" } ], "meta": { "count": 2, "next_cursor": "eyJ2IjoiIG5hcmE5OTkiLCJpZCI6IjAxOWY1MGQ3LWNiMmMtNzkwZS1hMjY4LTAzYTE4ODI0ODAxOCJ9" }}{ "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": "not_found", "message": "not found", "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578" }}A single player GET
One player by id. Adds `own_rank` — the player's position on our own leaderboard — but only when you ask for it with `?rank=1` or `?include=rank`. Players carry no `external_rank`.
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. 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.