A team's map pick and ban record
How a team chooses maps in the veto. For each map: how often the team picked it, banned it, banned it first, and how often it was left as the decider. Picks and bans count only the team's own choices, so the opponent's choices never read as the team's habits, and which side of the match the team was on does not matter. A choice attributed to a team that is not one of the match's two sides, or on a name that is not a competitive map, is dropped rather than counted. `matches` is the team's completed matches in the window and `veto_matches` the ones with a recorded veto. Vetoes are recorded for most matches but not all, so read every share against `veto_matches`, never against `matches`. `permaban` is true when the team bans the map in at least 90% of its `veto_matches` and `veto_matches` is at least 20 — one rule on every surface. It is deliberately conservative for a map added to the pool recently, whose bans can only exist since it joined while `veto_matches` counts every match. `active_pool` marks the maps in the Active Duty pool today. A map is listed when it featured in any recorded veto of the team's matches, most banned first. Enveloped `{"data": TeamVetoes}`.
How a team chooses maps in the veto. For each map: how often the team picked it, banned it, banned it first, and how often it was left as the decider.
Picks and bans count only the team's own choices, so the opponent's choices never read as the team's habits, and which side of the match the team was on does not matter. A choice attributed to a team that is not one of the match's two sides, or on a name that is not a competitive map, is dropped rather than counted.
matches is the team's completed matches in the window and veto_matches the ones with a recorded veto. Vetoes are recorded for most matches but not all, so read every share against veto_matches, never against matches. permaban is true when the team bans the map in at least 90% of its veto_matches and veto_matches is at least 20 — one rule on every surface. It is deliberately conservative for a map added to the pool recently, whose bans can only exist since it joined while veto_matches counts every match. active_pool marks the maps in the Active Duty pool today. A map is listed when it featured in any recorded veto of the team's matches, most banned first. Enveloped {"data": TeamVetoes}.
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.
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 6m. Anything else is a 400 naming the parameter.
"6m"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"
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/cs2/teams/019f2858-e253-7f3d-bdff-bc7738bd1036/vetoes"{ "data": { "window": "6m", "matches": 42, "veto_matches": 40, "maps": [ { "map_name": "de_ancient", "picks": 0, "bans": 39, "first_bans": 39, "deciders": 0, "active_pool": true, "permaban": true }, { "map_name": "de_mirage", "picks": 1, "bans": 14, "first_bans": 1, "deciders": 5, "active_pool": true, "permaban": false }, { "map_name": "de_anubis", "picks": 1, "bans": 12, "first_bans": 0, "deciders": 3, "active_pool": true, "permaban": false }, { "map_name": "de_nuke", "picks": 7, "bans": 7, "first_bans": 0, "deciders": 11, "active_pool": true, "permaban": false }, { "map_name": "de_cache", "picks": 3, "bans": 3, "first_bans": 0, "deciders": 3, "active_pool": true, "permaban": false }, { "map_name": "de_dust2", "picks": 16, "bans": 1, "first_bans": 0, "deciders": 9, "active_pool": true, "permaban": false }, { "map_name": "de_overpass", "picks": 8, "bans": 1, "first_bans": 0, "deciders": 2, "active_pool": false, "permaban": false }, { "map_name": "de_inferno", "picks": 6, "bans": 1, "first_bans": 0, "deciders": 7, "active_pool": true, "permaban": false } ] }}{ "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" }}A team's round-level playstyle profile GET
Aggregate round-level rates for the team (CT/T side win %, pistol %, opening-duel %, eco %, clutch %), derived over the team's recorded rounds. Each rate is a percentage in [0,100], or null when its denominator is empty. `window` limits it to rounds of matches inside a trailing span, which describes how the team plays now rather than across every roster it has had. Enveloped `{"data": TeamRoundStats}`.
A single team GET
One team by id. Adds `external_rank`, a separately-sourced world ranking where one is on file, and — only when you ask for it with `?rank=1` or `?include=rank` — `own_rank`, the team's position on our own leaderboard.