Map vetoes
The pick/ban sequence, including the decider that no team chose.
GET /v1/{game}/matches/{id}/vetoes returns the map pool negotiation in order, one row per step.
Vetoes are known before play starts, so this is often populated on a scheduled match while
every other sub-resource is still empty.
The steps
order is 1-based and rows come back in it. choice_type is one of:
| Value | Meaning | team_id |
|---|---|---|
ban | A team removed this map from the pool | The team that banned |
pick | A team chose this map to be played | The team that picked |
decider | The map left over once vetoing finished | null |
A decider has no acting team, so team_id is null there. Code that assumes every veto row has
a team will fail on the last step of most series.
Reading a sequence
vetoes = get(f"/v1/cs2/matches/{match_id}/vetoes")["data"]
for v in vetoes:
who = v["team_id"] or "—"
print(f"{v['order']}. {v['choice_type']:8} {v['map_name']:14} {who}")A typical bo3: ban, ban, pick, pick, ban, ban, decider.
What it tells you
The veto is a statement of preference under pressure: which maps a team is willing to spend a ban on, and which they'll pick when it counts. Cross-referenced with per-map records it shows whether a team's stated preferences match their actual results — the two diverge more often than you'd expect.
map_name uses the same Valve identifiers as map results, so the two join directly.