Match config JSON
A match is described by a JSON file (Get5 style). Load it from the server console, RCON or a panel:
matchzy_loadmatch cfg/MatchZy/match.json # path relative to csgo/matchzy_loadmatch_url "https://example.com/match.json" # HTTP GETmatchzy_loadmatch_url "https://example.com/match.json" "Authorization" "Bearer <token>"get5_loadmatch_url is an alias of matchzy_loadmatch_url. A match loaded by URL is treated as a panel match (no automatic map change at series end). If the first map is not the current map, MatchZy changes map and loads the match again on the new map.
Ready-made BO1 to BO5 configs, a bot test and G5API notes: Match config examples.
Prefer a form? The match config builder writes a config for you. Prefer an in-game flow? Admins can build the same config with the .matchsetup wizard.
Full example
Section titled “Full example”{ "matchid": 1042, "num_maps": 3, "maplist": ["de_mirage", "de_inferno", "de_nuke", "de_ancient", "de_anubis", "de_dust2", "workshop/3070284539"], "skip_veto": false, "veto_mode": ["team1_ban", "team2_ban", "team1_pick", "team2_pick", "team1_ban", "team2_ban"], "map_sides": ["knife", "team1_ct", "knife"], "players_per_team": 5, "min_players_to_ready": 5, "clinch_series": true, "team1": { "id": "t1", "name": "Alpha", "players": { "76561198000000001": "alpha1", "76561198000000002": "alpha2", "76561198000000003": "alpha3", "76561198000000004": "alpha4", "76561198000000005": "alpha5" }, "coaches": { "76561198000000009": "alphacoach" } }, "team2": { "id": "t2", "name": "Bravo", "players": { "76561198000000011": "bravo1", "76561198000000012": "bravo2", "76561198000000013": "bravo3", "76561198000000014": "bravo4", "76561198000000015": "bravo5" }, "coaches": ["76561198000000019"] }, "spectators": { "players": { "76561198000000099": "caster" } }, "cvars": { "mp_overtime_enable": "1" }}Top-level fields
Section titled “Top-level fields”| Field | Type | Default | Description |
|---|---|---|---|
matchid |
integer | auto | Match id. If omitted (or 0), a new id is taken from the database. |
num_maps |
integer | required | Maps in the series (BO1, BO3, …). Must not exceed the length of maplist. |
maplist |
string[] | required | Map pool. See map formats. |
team1, team2 |
object | required | See team fields. |
skip_veto |
bool | false |
Play the first num_maps maps in order instead of a veto. Forced on when maplist has exactly num_maps maps. |
side_type |
string | standard |
standard (knife unless map_sides says otherwise; side pick in the veto), always_knife, never_knife (team1 starts CT), random. |
veto_first |
string | - | team1, team2 or random: who starts a generated veto. |
veto_mode |
string[] | generated | Veto order using team1_ban, team2_ban, team1_pick, team2_pick. Generated if omitted. |
map_sides |
string[] | knife |
Per map: team1_ct, team1_t, team2_ct, team2_t or knife. A fixed side means no knife round on that map. |
players_per_team |
integer | from rosters | Players per side at a time. Left out: the larger players roster of the two teams (coaches not counted), at most the mode’s default (5 competitive, 2 wingman, 3 rush, 1 1v1), so two rosters of 4 play as 4v4. Without rosters it is the mode’s default. Extra roster players (substitutes) wait on Spectator while their side is full. Also the number of bots on a bot team. A team whose players roster has fewer players readies up with that many: 4 players listed in a 5v5 means the team is ready once those 4 have typed .ready, no .forceready needed. |
min_players_to_ready |
integer | not set | Ready players that make a team ready, when lower than players_per_team (or the team’s roster size): 1 means one ready player on each team starts the match. Not set = every player must ready up. Also the players a team needs before .forceready can ready the whole team. Never fewer than players_per_team minus matchzy_forceready_max_missing (default: at most one player short, so 4 in a 5v5); a higher value here makes it stricter. In join ready mode, the players a team needs on its side (default: the team’s roster size, at most players_per_team). |
min_spectators_to_ready |
integer | 0 |
Ready spectators needed. |
spectators |
object | {} |
{ "players": { "<steamid64>": "<name>" } }. |
clinch_series |
bool | true |
End the series once a team has won the majority of maps. |
game_mode |
string | competitive |
competitive (live.cfg), wingman (live_wingman.cfg), rush (game_mode 6, live_rush.cfg) or 1v1 (wingman game mode, live_1v1.cfg). The server switches game_mode before the map loads. If omitted, a maplist with only rush maps (rush_001 and other rush_ maps, aim_rush) plays as rush. |
wingman |
bool | false |
Same as "game_mode": "wingman". game_mode wins when both are set. With "players_per_team": 1 and no game_mode, the match is played as 1v1. |
friendly_fire |
bool or string | mode cfg | true or false turns friendly fire on or off, like .ffire on / .ffire off. "grenades" keeps mp_friendlyfire 1 but only HE and molotov/incendiary damage teammates; bullets, knife and zeus do no team damage. Applied on every map of the series. |
cvars |
object | - | Cvars applied when the match loads and before each map goes live, e.g. { "mp_overtime_enable": "1" }. See below. |
Team fields
Section titled “Team fields”| Field | Type | Default | Description |
|---|---|---|---|
name |
string | required | Team name, shown on the scoreboard. |
tag |
string | "" |
Short team tag, shown as the players’ clan tag while live when matchzy_team_clantag_enabled is on. Letters, digits, space, _ and -. |
id |
string | "" |
Your own id for the team, echoed in events. |
players |
object, array or "any" |
required | Roster as { "<steamid64>": "<name>" } or ["<steamid64>", ...], or "any" (see below). |
coaches |
object or string[] | - | SteamID64s that coach this team. They become coach automatically. See Coaching. |
bots |
bool | false |
The team is played by bots, filled to players_per_team. |
bot_difficulty |
integer 0-3 | 2 |
Bot difficulty for a bot team. |
players:"any"opens the team to every human who is not on the other roster. Only one team can be"any".coaches: listed coaches may join and are not kicked bymatchzy_kick_when_no_match_loaded. With a list, only those SteamIDs can.coachthis team.
Players vs bots
Section titled “Players vs bots”{ "matchid": 0, "num_maps": 1, "maplist": ["de_dust2"], "players_per_team": 5, "team1": { "name": "Players", "players": "any" }, "team2": { "name": "Bots", "bots": true, "bot_difficulty": 2 }}- Bots cannot veto, knife or type commands, so a bot match needs a fixed map list (exactly
num_mapsmaps, or"skip_veto": true). Otherwise the load is refused. - A
knifeside is drawn at random instead of played. - The bot side always counts as ready and agrees to unpause, and autopause ignores it.
- Bots stay on their side through halftime, overtime and round restores. Humans cannot join the bot team.
- Bot stats are recorded automatically.
.warmupbotsis disabled in these matches.
Map formats
Section titled “Map formats”| Entry | Map change |
|---|---|
de_mirage |
changelevel de_mirage |
3070284539 |
Workshop map by id (host_workshop_map) |
workshop/3070284539 or workshop/3070284539/cs_alpine |
Workshop map by id |
ws/3070284539 |
Workshop map by id |
ws:cs_alpine |
Workshop map by name from the server’s hosted collection (ds_workshop_changelevel) |
Roster commands
Section titled “Roster commands”Run from the server console or RCON while a match is loaded:
| Command | Description |
|---|---|
matchzy_addplayer <steamid64> <team1|team2|spec> "<name>" |
Add a player to a roster. Alias get5_addplayer. |
matchzy_removeplayer <steamid64> |
Remove a player. Alias get5_removeplayer. |