Teams

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.

GET
/v1/{game}/teams

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.

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.

Query Parameters

slug?string

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

region?string

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.

sort?string

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.

limit?integer

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.

Range1 <= value
Default100
cursor?string

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