A team's per-map win/loss record
The team's aggregate record on each map it has a completed result on, best win rate first.
The team's aggregate record on each map it has a completed result on, best win rate first. Raw counts (played, wins); the win rate is wins / played. Only maps played out count: a forfeit, an abandoned map or an awarded walkover is not a performance.
By default the record covers the team's whole history. window, era and active narrow it to what is current: a trailing span of matches, Counter-Strike 2 only, and only the maps in the Active Duty pool today, so a retired map's old record does not read as present form. include=detail adds each map's last-played date, its pool membership, and the team's round record by side and in pistol rounds. Enveloped {"data": [TeamMapStat, ...], "meta": {...}} (not cursor-paginated).
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.
Resource identifier — either a UUID or the resource's human-readable slug, scoped to {game}. /v1/cs2/teams/natus-vincere and /v1/cs2/teams/019f23d1-fb5c-7987-b522-47c3a5e72111 address the same row, so you can go straight from a slug you already have without first looking up its id.
Slugs work on teams, players and tournaments. Matches have no slug, so a match id must be a UUID. Either way, an identifier that resolves to nothing returns 404 not_found.
A team or a player also answers to a slug it was renamed away from, as long as no current team or player holds that slug — so a link made before a rename keeps working. The row returned carries its current slug.
Query Parameters
The trailing span of matches the figures cover: a whole number of months with an m suffix, such as 6m, up to 60m, or all for the whole history. Default all: the whole history. Anything else is a 400 naming the parameter.
"all"Which Counter-Strike era the matches come from. cs2 keeps only Counter-Strike 2 matches (a match with no recorded version counts as Counter-Strike 2 when it was played on or after 2023-10-16); all (the default) keeps every match.
"all"Value in
- "cs2"
- "all"
When true, only maps that are in the Active Duty pool today. false (the default) keeps every map the team has played.
"false"Value in
- "true"
- "false"
Optional extras, comma-separated. detail adds last_played_at, active_pool and the round record by side and in pistol rounds to each map; it costs more to compute (about half a second for a long-lived team's whole history), so it is opt-in.
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/v1/cs2/teams/019f2858-e253-7f3d-bdff-bc7738bd1036/maps"{ "data": [ { "map_name": "de_anubis", "played": 60, "wins": 39 }, { "map_name": "de_mirage", "played": 133, "wins": 83 }, { "map_name": "de_cache", "played": 5, "wins": 3 } ], "meta": { "count": 10, "next_cursor": null }}{ "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" }}A team's recent completed results (form) GET
Recent completed matches, newest first, from the team's own perspective (won + series map score for/against).
A team's current players GET
Everyone who played for the team in its newest completed match with stats, usually five, with each player's own figures over the last 12 months (the same figures as their /players/{id}/performance)…