Tournaments

List tournaments for a game

Every tournament in the game, newest first by start date, cursor-paginated.

GET
/v1/{game}/tournaments

Every tournament in the game, newest first by start date, cursor-paginated. Filter by slug, q (a name search), tier, region, year or status; the filters combine with AND. Note status is derived from the event's dates rather than stored, so a tournament with no starts_at has a null status and is excluded by any status filter.

Authorization

AuthorizationBearer <token>

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

q?string

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.

Length2 <= length <= 100
status?string

upcoming, ongoing or finished (derived from the dates), or cancelled for events that were called off before any match was played. A cancelled event never matches the other three. An event that was called off part-way, with matches already played, keeps its date-based state.

Value in

  • "upcoming"
  • "ongoing"
  • "finished"
  • "cancelled"
tier?string

Filter to one prestige tier: S (highest) through C. Exact match, single value.

event_type?string

Filter to LAN or online events. Exactly lan or online; anything else is a 400. Tournaments whose type is unknown (null) match neither.

Value in

  • "lan"
  • "online"
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.

year?integer

Only tournaments starting in this calendar year, e.g. 2026. Accepts 2000–2100; anything else is a 400. Events with no known start date are excluded.

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

application/json

curl -X GET "https://example.com/v1/cs2/tournaments"
{  "data": [    {      "id": "019f23d2-5a32-7c61-9a4e-44229bd88e7f",      "game_id": "019f23d1-fb5b-7d24-935d-e4d68f6f565a",      "slug": "esl-pro-league-season-25",      "name": "ESL Pro League Season 25",      "tier": "S",      "city": null,      "country_code": "SA",      "region": "Asia",      "prize_pool": 1250000,      "prize_pool_currency": "USD",      "current_stage": null,      "status": "upcoming",      "winner_team_id": null,      "num_teams": null,      "starts_at": "2027-03-06T12:31:00Z",      "ends_at": "2027-03-14T12:32:00Z",      "created_at": "2026-07-02T17:13:36.058928Z",      "updated_at": "2026-07-25T23:06:56.921667Z"    },    {      "id": "019f23d2-5a32-71d4-8c59-df545efdd357",      "game_id": "019f23d1-fb5b-7d24-935d-e4d68f6f565a",      "slug": "pgl-major-singapore-2026",      "name": "PGL Major Singapore 2026",      "tier": "S",      "city": null,      "country_code": "SG",      "region": "Asia",      "prize_pool": 1250000,      "prize_pool_currency": "USD",      "current_stage": null,      "status": "upcoming",      "winner_team_id": null,      "num_teams": null,      "starts_at": "2026-11-25T07:00:00Z",      "ends_at": "2026-12-13T21:00:00Z",      "created_at": "2026-07-02T17:13:36.058928Z",      "updated_at": "2026-07-25T23:06:56.921667Z"    }  ],  "meta": {    "count": 2,    "next_cursor": "eyJ2IjoiMjAyNi0xMS0yNVQwNzowMDowMFoiLCJpZCI6IjAxOWYyM2QyLTVhMzItNzFkNC04YzU5LWRmNTQ1ZWZkZDM1NyJ9"  }}
{  "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"  }}

{  "error": {    "code": "rate_limited",    "message": "rate limit exceeded",    "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578"  }}