Skip to content

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 GET
matchzy_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.

Prefer an in-game flow? Admins can build the same config with the .matchsetup wizard.

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": 10,
  "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

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 true Play the first num_maps maps in order. Forced on when maplist has exactly num_maps maps. Set false to run a 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.
players_per_team integer 5 Team size. Also the number of bots on a bot team.
min_players_to_ready integer server setting Ready players needed to start.
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.
wingman bool false Wingman game mode, uses live_wingman.cfg.
cvars object - Cvars applied when the match loads, e.g. { "mp_overtime_enable": "1" }. Restored at series end when matchzy_reset_cvars_on_series_end is on.

Team fields

Field Type Default Description
name string required Team name, shown on the scoreboard.
id string "" Your own id for the team, echoed in events.
players object, array or "any" required Roster as { "<steamid64>": "<name>" } or ["<steamid64>", ...]. "any" opens the team to every human who is not on the other roster. Only one team can be "any".
coaches object or string[] - SteamID64s that coach this team. They may join, are not kicked by matchzy_kick_when_no_match_loaded, and become coach automatically. With a list, only those SteamIDs can .coach this team. 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 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_maps maps, or "skip_veto": true). Otherwise the load is refused.
  • A knife side 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. .warmupbots is disabled in these matches.

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

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.