List teams for a game
Every team in the game, alphabetically by name, cursor-paginated.
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. Use ?q= to find a team by name when you do not know its slug. logo_url is always an empty string; see the field description.
The primary way to authenticate: Authorization: Bearer <api-key>. When a request also carries ?apiKey=, the header wins. We store only a SHA-256 hash of a key, never the key itself. To try the API with no account, use the public sample key eo_sample_public: one published key, shared by everyone, that reads a fixed sample of past matches within daily limits. For evaluation; our Terms apply.
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). On /teams, a slug the team was renamed away from still finds it when no current team holds that slug; the row carries the current slug.
Search by name, for when you know what a team, player or tournament is called but not its slug or id (e.g. q=navi). Case-insensitive, and it matches anywhere in the text: 2 to 100 characters, with % and _ taken literally. Teams match on name, short name, slug and alternate names; players on nickname and slug (never the real name); tournaments on name and slug. Rows come back in the list's usual order, not best match first, in the standard list envelope, and the search combines with the endpoint's other filters (AND). A blank value is ignored; one character, or more than 100, is a 400.
2 <= length <= 100Filter 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": "rate_limited", "message": "rate limit exceeded", "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578" }}