List teams for a game
Every team in the game, alphabetically by name, cursor-paginated. Use `?slug=` to resolve a known slug straight to its row — that is the intended way to turn a human-readable slug into the UUID the `/teams/{id}/…` routes need, and it never depends on where the team falls in the paging order. `logo_url` is always an empty string; see the field description.
Every team in the game, alphabetically by name, cursor-paginated. Use ?slug= to resolve a known slug straight to its row — that is the intended way to turn a human-readable slug into the UUID the /teams/{id}/… routes need, and it never depends on where the team falls in the paging order. logo_url is always an empty string; see the field description.
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 circuit region. Values are full names, not codes — Europe, North America, South America, Asia, CIS, Oceania, Africa. Exact match, so EU matches nothing.
Ordering. name (default) or slug, each reversible with a - prefix (sort=-name). An unrecognised key returns 400 rather than being ignored. A cursor is bound to the sort it was minted under, so change sort and start paging again from the first page.
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/teams"{ "data": [ { "id": "019f28e7-0555-75b7-a472-35d156063dbc", "game_id": "019f23d1-fb5b-7d24-935d-e4d68f6f565a", "slug": "-72c", "name": "-72c", "short_name": "-72C", "region": "CIS", "country_code": "RU", "logo_url": "", "created_at": "2026-07-03T16:54:16.666604Z", "updated_at": "2026-07-07T16:53:19.817583Z" }, { "id": "019f3d60-02f7-7c85-ab72-1f36d23ddea3", "game_id": "019f23d1-fb5b-7d24-935d-e4d68f6f565a", "slug": "00nation", "name": "00NATION", "short_name": "00N", "region": "South America", "country_code": "BR", "logo_url": "", "created_at": "2026-07-07T16:18:50.238724Z", "updated_at": "2026-07-07T17:05:12.869632Z" } ], "meta": { "count": 2, "next_cursor": "eyJ2IjoiMDBOQVRJT04iLCJpZCI6IjAxOWYzZDYwLTAyZjctN2M4NS1hYjcyLTFmMzZkMjNkZGVhMyJ9" }}{ "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 team's roster timeline (the five it actually fielded) GET
The five players a team actually fielded in each recent completed match, newest first, with the derived roster-change facts. `limit` default 20, max 100. Enveloped `{"data": [TeamRosterEntry, ...], "meta": {...}}` (not cursor-paginated). Read `continuity` BEFORE interpreting `changed_count`: `stable` (same five as last match), `changed` (1–4 players swapped — the only value for which `has_debutant` is asserted), `reset` (all five swapped, i.e. an organisation rename or full rebuild, NOT five stand-ins), `resumed` (previous match beyond a 60-day gap — a transfer window, not a stand-in), and `new` (no prior match, so `players_in`/`players_out` are empty because there is no baseline to diff against). A match where a team used more than five players across maps is omitted rather than guessed at.
A single tournament GET
One tournament by id. For the field list see the `Tournament` schema; for who is playing, use the participating-teams sub-resource.