Protocol reference
Types & Values
Values
| Type | JSON | Description |
|---|---|---|
AgentErrorCode | string enum | The
|
AgentLogLevel | "info" | "warn" | "error" | How serious an agent log line is. |
AgentUpdateOutcome | string enum | How an
|
AllocationId | string | The id the controller picks for each server it launches. It identifies that server and its events from then on. The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive. |
BuildId | string | A Steam build id, in decimal. Must match |
CfgName | string ≤ 128 chars | A cfg the server runs, relative to Must match |
ChatColor | string enum | A chat colour name from SwiftlyS2's chat styling.
|
CommandRefusal | string enum | Why a plugin did not carry out a command, as an
|
ControllerHost | string | A host with an optional port and no scheme or path, such as Rejected when it contains whitespace, a control character, |
ControllerPath | string ≤ 255 chars | A path on the controller's host. It starts with Must match |
CountryCode | string | An ISO 3166-1 alpha-2 country code: Must match |
Cs2ImageUpdateOutcome | string enum | How an
|
Cs2UpdateMode | string enum | How thoroughly a CS2 install or update runs.
|
Cs2UpdateOutcome | string enum | How a CS2 install or update ended. An update container that an earlier agent process started reports progress again until it exits. It ends
|
DamageCause | string enum | What caused damage or a death.
|
DemoFileName | string | A demo's file name, as it sits in its launch's directory, Must match |
DemoRemovedReason | string enum | Why a demo is no longer on the node.
|
DemoUploadLimit | integer 1–10000 | Whole megabits a second, from 1 to 10 Gbit/s. |
DemoUploadUrl | string ≤ 255 chars, uri | The URL finished demos are posted to. A target that needs credentials takes them in the configured Rejected when the URL carries a user name or a password. |
EventSeq | integer ≥ 0 | An event's position among its server's events, from 0. |
FireEnd | string enum | How a fire ended.
|
GameMode | string enum | The game mode a server runs, which sets the game's rules. The engine runs the mode's cfg, such as
A match plays only in
|
GamePassword | string ≤ 128 chars | The password players type. It is printable ASCII without spaces, Must match |
GrenadeId | integer 0–1000000 | The zero-based id of a grenade within its server, counted in throw order. A server throws far fewer than a million. |
GrenadeKind | string enum | The engine class name of a grenade.
|
Gslt | string | A Game Server Login Token, which the servers of a slot log in to Steam with. Must match |
GsltHint | string | The last ten characters of a token, which the agent reports instead of the token. They are enough to tell apart every token on one Steam account. Must match |
GsltState | string enum | Whether Steam accepts a slot's token.
|
HelloRefusedReason | "invalid_hello" | Why the controller refused a |
ImageId | string | The id Docker gives an image: Must match |
ImageReference | string | A Docker image reference, as Must match |
ImageUpdateStep | string enum | Where an
|
Ipv4 | string | A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros. |
MaintenanceOperation | string enum | The maintenance operation that runs on the node.
|
MapEndReason | string enum | Why a map ended: Only a
|
MatchId | string | The id of one map's match, which the controller chooses. A series of maps is a grouping that the controller keeps. The id is a lowercase UUID, because demo file names carry it and case matters there. |
MatchPhase | string enum | Where a match is.
|
MemoryLimit | integer 1024–65536 | MiB of memory each game container may use. CS2 installs and updates are exempt. Rejected when it is not a whole number from 1024 to 65536. |
NodeUnavailableCode | string enum | Why a node cannot run servers, one of the values of
|
PlayerName | string ≤ 64 chars | A player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate. Must match |
PlayingSide | string enum | A playing side, for a field that never holds
|
Port | integer 1–65535 | A TCP or UDP port. |
ReadyMode | string enum | How warmup ends. In every mode,
|
ReplayId | string 1–64 chars | Identifies one watcher's replay, so the frames answering it reach only that watcher. |
RequestId | string 1–64 chars | Chosen by the controller. The reply repeats it as |
RequestType | string enum | The
|
RoundEndReason | string enum | Why a round ended, as the engine names it. When the engine gives a reason that this list does not name, the plugin sends
|
RoundNumber | integer 1–1000 | A one-based round number. A map's history holds far fewer than the 1000 it allows. |
ServerExitReason | string enum | Why a server ended: one of the
|
Side | string enum | The side a player is on.
|
SidesMode | string enum | How starting sides are decided.
|
SlotId | string | A slot's id, which is also part of the names of its containers. Must match |
SlotLayout | ReportedSlot[], ≤ 64 items | Up to 64 slots. Rejected when two slots share an |
SlotState | string enum | What a slot is doing.
|
StartRefusal | string enum | The
|
SteamId64 | string | A SteamID64 as 17 decimal digits. Must match |
SteamWebApiKey | string | A Steam Web API key, which the server needs to download workshop maps. Must match |
StockMapName | string | The name of a stock map, such as Must match |
UpdateId | string | Chosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID. |
WorkshopId | string | A Steam Workshop map's id. Must match |
Types
AgentError
Why a request failed. Branch on code. detail is for people.
codeAgentErrorCodeWhat went wrong. Branch on it.
AgentErrorCodeThe
codeof a failed reply, one of the values ofAGENT_ERRORS.string enum
"no_free_slot"No slot is idle, unreserved and on a token Steam has not refused.
"cs2_outdated"A newer public CS2 build is out and the node has not updated to it yet, so its
cs2.build_idis behindcs2.latest_build_id. The node takes launches again once it has updated. A node whoseauto_updateisfalsenever refuses with this."cs2_not_installed"CS2 is not installed on the node, so its
cs2.build_idisnull. The node takes launches once anupdate_cs2has installed it."node_unavailable"The node reports
unavailablefor a reason other thanmaintenance."slots_held"An operation that needs every slot idle found one held:
update_cs2, or aset_configthat changes any key undercontroller."slot_held"A slot holds a server that is
starting,runningorstopping, andset_configwould remove or re-port the slot or give its server's token to another slot, orreserve_slotasked for it.detailnames the slots."unknown_slot"The node has no slot with that id.
"slot_token_required"set_configkept the token of a slot the node does not have yet. A new slot needs a new token."demo_header_value_required"set_configkept the value of a demo upload header the node does not send. A new header needs its value."unknown_allocation"No server with that allocation id.
"maintenance_running"A maintenance operation runs on the node. That operation is unaffected, and
unavailableshows it asmaintenance."image_missing"The image is not on the node and the request asked for no pull. Asking again with
pullfetches it."image_not_allowed"The image is not an official one, and the node's
official_images_onlyis on. The node's operator decides which images it runs."demo_uploading"The demo is uploading. It can be deleted once the upload ends.
"unknown_demo"The slot has no demo of that name, such as one an upload or a delete has already removed.
"demo_recording"The demo is still being recorded. It can be deleted once its server ends the recording.
"plugin_offline"The server's plugin is not connected to the agent, or left before it answered.
"plugin_status_timeout"The plugin did not answer
get_server_status,console_command,start_matchorrestore_roundwithin 10 seconds."no_match"The server runs without a match.
"not_in_warmup"The match is past its warmup.
"team_empty"A team has no player connected.
"not_live"The match is not live, such as in warmup, during the knife round or after it ended.
"at_halftime"The match is in its halftime break, while the sides are about to swap. Ask again once the next round has started.
"no_backup"The node has no backup of the round that
restore_roundnamed for that server."command_blocked"console_commandnamed a command ofmp_restartgame,mp_warmup_start,mp_warmup_end,mp_warmup_pausetimer,mp_warmuptime,mp_swapteams,mp_switchteams,mp_scrambleteams,mp_backup_restore_load_file,mp_backup_round_file,mp_backup_round_auto,restart,changelevel,map,host_workshop_map,ds_workshop_changelevel,tv_record,tv_stoprecordandaliaswhile the server runs a match. A new launch restarts a match, andrestore_roundrestores one."invalid_request"The request did not match its schema.
"allocation_in_use"start_servernamed an allocation this node is already launching or running. Its server exists or is on its way, as after astart_serversent again when its reply was slow."allocation_reused"start_servernamed an allocation that this node launched before, among the last 100. The node files a server's events and demos under its allocation, so every launch needs a new one."unsupported_request"The agent does not know the request's
type, or the plugin the command's."shutting_down"The agent is stopping and started no work for the request, as after its
shutdown. Send the request again once the node reconnects."failed"Any failure that no other code names, such as a Docker failure.
detailstring ≤ 512 charsThe rest of the reason, such as Docker's message, up to 512 characters.
AgentInfo
The running agent.
versionstring 1–64 charsThe agent package version.
imageImageReferenceThe image this agent's container was created from.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$image_idImageIdThe id Docker holds for that image. Two builds of one tag differ here.
ImageIdThe id Docker gives an image:
sha256:and 64 hex digits.string
Must match
^sha256:[0-9a-f]{64}$
AgentReplyFailure
A request that failed.
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
requestRequestType| nullThe
typeof the request this answers. Null when the agent did not know it.RequestTypeThe
typeof each request the controller sends, which itsreplyrepeats asrequest.string enum
"start_server""stop_server""get_server_status""update_cs2""delete_demo""reserve_slot""set_config""update_agent""update_cs2_image""console_command""restore_round""start_match"
okfalseThe request failed.
errorAgentErrorWhy it failed.
AgentErrorWhy a request failed. Branch on
code.detailis for people.codeAgentErrorCodeWhat went wrong. Branch on it.
AgentErrorCodeThe
codeof a failed reply, one of the values ofAGENT_ERRORS.string enum
"no_free_slot"No slot is idle, unreserved and on a token Steam has not refused.
"cs2_outdated"A newer public CS2 build is out and the node has not updated to it yet, so its
cs2.build_idis behindcs2.latest_build_id. The node takes launches again once it has updated. A node whoseauto_updateisfalsenever refuses with this."cs2_not_installed"CS2 is not installed on the node, so its
cs2.build_idisnull. The node takes launches once anupdate_cs2has installed it."node_unavailable"The node reports
unavailablefor a reason other thanmaintenance."slots_held"An operation that needs every slot idle found one held:
update_cs2, or aset_configthat changes any key undercontroller."slot_held"A slot holds a server that is
starting,runningorstopping, andset_configwould remove or re-port the slot or give its server's token to another slot, orreserve_slotasked for it.detailnames the slots."unknown_slot"The node has no slot with that id.
"slot_token_required"set_configkept the token of a slot the node does not have yet. A new slot needs a new token."demo_header_value_required"set_configkept the value of a demo upload header the node does not send. A new header needs its value."unknown_allocation"No server with that allocation id.
"maintenance_running"A maintenance operation runs on the node. That operation is unaffected, and
unavailableshows it asmaintenance."image_missing"The image is not on the node and the request asked for no pull. Asking again with
pullfetches it."image_not_allowed"The image is not an official one, and the node's
official_images_onlyis on. The node's operator decides which images it runs."demo_uploading"The demo is uploading. It can be deleted once the upload ends.
"unknown_demo"The slot has no demo of that name, such as one an upload or a delete has already removed.
"demo_recording"The demo is still being recorded. It can be deleted once its server ends the recording.
"plugin_offline"The server's plugin is not connected to the agent, or left before it answered.
"plugin_status_timeout"The plugin did not answer
get_server_status,console_command,start_matchorrestore_roundwithin 10 seconds."no_match"The server runs without a match.
"not_in_warmup"The match is past its warmup.
"team_empty"A team has no player connected.
"not_live"The match is not live, such as in warmup, during the knife round or after it ended.
"at_halftime"The match is in its halftime break, while the sides are about to swap. Ask again once the next round has started.
"no_backup"The node has no backup of the round that
restore_roundnamed for that server."command_blocked"console_commandnamed a command ofmp_restartgame,mp_warmup_start,mp_warmup_end,mp_warmup_pausetimer,mp_warmuptime,mp_swapteams,mp_switchteams,mp_scrambleteams,mp_backup_restore_load_file,mp_backup_round_file,mp_backup_round_auto,restart,changelevel,map,host_workshop_map,ds_workshop_changelevel,tv_record,tv_stoprecordandaliaswhile the server runs a match. A new launch restarts a match, andrestore_roundrestores one."invalid_request"The request did not match its schema.
"allocation_in_use"start_servernamed an allocation this node is already launching or running. Its server exists or is on its way, as after astart_serversent again when its reply was slow."allocation_reused"start_servernamed an allocation that this node launched before, among the last 100. The node files a server's events and demos under its allocation, so every launch needs a new one."unsupported_request"The agent does not know the request's
type, or the plugin the command's."shutting_down"The agent is stopping and started no work for the request, as after its
shutdown. Send the request again once the node reconnects."failed"Any failure that no other code names, such as a Docker failure.
detailstring ≤ 512 charsThe rest of the reason, such as Docker's message, up to 512 characters.
AgentReplySuccess
A request that succeeded. request names the request, so data can be read without the request that reply_to answers. The settings in a set_config reply are the node's, whichever edit asked.
One of 12, told apart by request:
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"start_server"oktrueThe request succeeded.
dataStartServerReplyStartServerReplyThe server that started, and the slot the agent picked for it.
allocation_idAllocationIdThe allocation the request launched.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
slot_idSlotIdThe slot the server runs in.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"stop_server"oktrueThe request succeeded.
dataStopServerReplyStopServerReplyThe server that stopped.
allocation_idAllocationIdThe allocation the request stopped.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"get_server_status"oktrueThe request succeeded.
dataGetServerStatusReplyGetServerStatusReplyThe server asked about, and its state as its plugin reports it now.
map_namestring ≤ 64 charsThe map the server is on, up to 64 characters.
matchobject | nullThe loaded match and its team state. Null on a server without a match or after a refused config.
match_idMatchId| nullThe
match_idthe server was launched with. Null for a match without one. The launch's config is the controller's to keep, so it is not echoed.MatchIdThe id of one map's match, which the controller chooses. A series of maps is a grouping that the controller keeps. The id is a lowercase UUID, because demo file names carry it and case matters there.
string
phaseMatchPhaseWhere the match is.
MatchPhaseWhere a match is.
string enum
"loading"its map is loading.
"warmup"warmup.
"pending_restore"a launch with a restore went here from warmup while the engine loads the backup, and goes to
liveonce the restored round starts. A load that fails leaves the match here, where the plugin reports nothing, until a load is tried again or the server is stopped."knife"the knife round.
"side_choice"the side choice.
"live"live play.
"post_live"after the last round.
team1_sidePlayingSideTeam 1's current side.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
team2_sidePlayingSideTeam 2's current side, always the other side, sent so a reader shows each team without deriving it.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
team1_scoreinteger ≥ 0Team 1's score.
team2_scoreinteger ≥ 0Team 2's score.
playersobject[], ≤ 64 itemsEveryone connected, up to 64.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe player's side.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
config_errorstring ≤ 512 chars | nullWhy the plugin could not read or use the match config it was launched with, up to 512 characters. Null when the server has no match config or the plugin accepted it.
readybooleanWhether players can join. When
true, the server is logged on to Steam and has loaded the map that its launch asked for, the workshop map when it has one. It staystrueonce set.CS2 does not fall back to an anonymous logon when Steam refuses its token, so
truealso indicates that Steam accepted the GSLT and that its last use can be updated.server_steam_idSteamId64| nullThe SteamID64 that Steam gave the server when it logged on with its GSLT. Each token keeps one SteamID across logons, so a controller can look the server up in Steam's server list by it. The plugin also adds the
allocation_idwithout its dashes tosv_tags, which that list shows. Null untilready.allocation_idAllocationIdThe allocation the request asked about.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"update_cs2"oktrueThe request succeeded.
dataUpdateCs2ReplyUpdateCs2ReplyThe update an accepted
update_cs2started.update_idUpdateIdThe update's id, as
cs2.update.id,cs2_update_progressand its log source carry it.UpdateIdChosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.
string
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"delete_demo"oktrueThe request succeeded.
dataDeleteDemoReplyDeleteDemoReplyThe demo that was removed.
slot_idSlotIdThe slot whose directory held it.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$file_nameDemoFileNameThe file removed.
DemoFileNameA demo's file name, as it sits in its launch's directory,
demos/<allocation_id>/in its slot.string
Must match
^[A-Za-z0-9._-]{1,156}\.dem$
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"reserve_slot"oktrueThe request succeeded.
dataReserveSlotReplyReserveSlotReplyThe slot that is reserved.
slot_idSlotIdThe slot reserved.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"set_config"oktrueThe request succeeded.
dataNodeSettingsNodeSettingsThe part of
agent.ymlthat the controller may edit, ashelloreports it applied.slotsSlotLayoutThe slots servers run in.
SlotLayoutUp to 64 slots. Rejected when two slots share an
id, or when two ports are equal. Every slot'sportandtv_portcount, so a slot's two ports differ too. It is also rejected when a port is 4500, where the agent listens for plugins.ReportedSlotA slot as the agent reports it, with the last ten characters of its token in place of the token.
idSlotIdThe slot's id, 1 to 32 letters, digits,
_and-. It is unique on its node.SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$portPortThe game port, UDP. Every
portandtv_porton a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.PortA TCP or UDP port.
integer 1–65535
tv_portPortThe GOTV port, UDP, under the same rules as
port.PortA TCP or UDP port.
integer 1–65535
gslt_hintGsltHintThe last ten characters of the slot's token.
GsltHintThe last ten characters of a token, which the agent reports instead of the token. They are enough to tell apart every token on one Steam account.
string
Must match
^[A-Za-z0-9]{10}$
pinned_ipIpv4| nullThe address players connect to. Null for the node's
public_ip. Servers already running keep the address their launch announced.Ipv4A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros.
string
controllerControllerAddressWhere the agent dials the controller. It redials when any part of it changes.
ControllerAddressWhere a node dials the controller: a host with an optional port, whether it encrypts, and the paths it reaches there.
hostControllerHostThe controller's host with an optional port.
ControllerHostA host with an optional port and no scheme or path, such as
cs.example.com,192.168.0.10:3000or[fd00::1].Rejected when it contains whitespace, a control character,
/,\,?or#. It is also rejected unlesshttp://followed by the value parses as a URL that has a host, an optional port and nothing else, such as a user name.string
tlsbooleanWhether the agent dials over TLS.
socket_pathControllerPathThe path of the agent socket. It is
/ws/agentunlessagent.ymlsetscontroller.socket_path.ControllerPathA path on the controller's host. It starts with
/, followed by URL path characters and percent escapes, without a query or fragment.string ≤ 255 chars
Must match
^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$events_pathControllerPathThe path event batches are posted to. It is
/api/node/eventsunlessagent.ymlsetscontroller.events_path.ControllerPathA path on the controller's host. It starts with
/, followed by URL path characters and percent escapes, without a query or fragment.string ≤ 255 chars
Must match
^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$
auto_updatebooleanWhether the node keeps itself up to date: CS2 on
cs2.latest_build_id, and its agent and cs2 images on the newest release of their major. When false, the node stays oncs2.build_iduntil anupdate_cs2, and accepts launches while it is behindcs2.latest_build_id, so players on a newer client cannot join its servers. Its images then change only withupdate_agentandupdate_cs2_image.demo_uploadReportedDemoUpload| nullWhere the agent uploads demos. Null for no uploads, which keeps demos on the node. The header's value is reported as its SHA-256.
ReportedDemoUploadA demo upload as the node reports it, with the header's value replaced by its hash, because the value is a credential that the controller set.
urlDemoUploadUrlThe upload target.
DemoUploadUrlThe URL finished demos are posted to. A target that needs credentials takes them in the configured
header, such asAuthorization: Basic …, which the node reports only as a hash.Rejected when the URL carries a user name or a password.
string ≤ 255 chars, uri
headerobject | nullThe header sent with each upload. Null for none.
namestringThe header's name, up to 64 letters, digits and
-. Rejected when it is, in any case, one ofhost,content-type,content-length,transfer-encoding,connection,keep-alive,upgrade,expect,te,trailer,ankor-protocol,ankor-file-name,ankor-match-idandankor-allocation-id, which the agent sets itself or which change how the request is framed.string
Must match
^[A-Za-z0-9-]{1,64}$value_sha256stringThe lowercase hex SHA-256 of the value's UTF-8 bytes, to compare with the value the controller set.
string
Must match
^[0-9a-f]{64}$
limit_mbitDemoUploadLimit| nullMegabits a second an upload may send while a game server runs on the node. Null for no limit.
DemoUploadLimitWhole megabits a second, from 1 to 10 Gbit/s.
integer 1–10000
memory_mbMemoryLimit| nullMiB of memory each game container may use. Null for no cap. A change applies to servers launched afterwards, and CS2 installs and updates are exempt.
Rejected when it is not a whole number from 1024 to 65536.
MemoryLimitMiB of memory each game container may use. CS2 installs and updates are exempt.
Rejected when it is not a whole number from 1024 to 65536.
integer 1024–65536
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"update_agent"oktrueThe request succeeded.
dataUpdateAgentReplyUpdateAgentReplyWhat follows an accepted
update_agent: the update's firstImageUpdateStep, orunchangedwhen the node runs that image already, as the registry or the local image says, and nothing more happens.imageImageReferenceThe agent image the update is to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepstring enumThe next step.
string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
"unchanged"
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"update_cs2_image"oktrueThe request succeeded.
dataUpdateCs2ImageReplyUpdateCs2ImageReplyWhat follows an accepted
update_cs2_image: its firstImageUpdateStep.imageImageReferenceThe cs2 image the switch is to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepImageUpdateStepThe next step.
ImageUpdateStepWhere an
update_agentorupdate_cs2_imageis.string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"console_command"oktrueThe request succeeded.
dataConsoleCommandReplyConsoleCommandReplyThe server the command was handed to.
allocation_idAllocationIdThe allocation the command went to.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"restore_round"oktrueThe request succeeded.
dataRestoreRoundReplyRestoreRoundReplyThe server and round the restore was handed to.
allocation_idAllocationIdThe allocation the restore went to.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
roundRoundNumberThe round it loads.
RoundNumberA one-based round number. A map's history holds far fewer than the 1000 it allows.
integer 1–1000
type"reply"reply_toRequestIdThe
idof the request this answers.RequestIdChosen by the controller. The reply repeats it as
reply_to. While a request is running, the agent ignores another with the same id on that connection, because a reply could not tell the two apart.string 1–64 chars
request"start_match"oktrueThe request succeeded.
dataStartMatchReplyStartMatchReplyThe server the start was handed to.
allocation_idAllocationIdThe allocation the start went to.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
AgentUpdate
An agent update: the one in progress, one this agent saw end, or the last one to fail.
imageImageReferenceThe agent image the update was to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepImageUpdateStep| nullWhere the update is while it runs, with the replacement still on trial in
switching. Null once it ended.ImageUpdateStepWhere an
update_agentorupdate_cs2_imageis.string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
outcomeAgentUpdateOutcome| nullHow the update ended. Null while it runs.
AgentUpdateOutcomeHow an
update_agentended.string enum
"completed"the replacement agent stayed up and the old container is removed.
"unchanged"the node already ran that image, so nothing was swapped.
"pull_failed"the image could not be pulled, so the node never tried it.
"failed"the swap did not hold and the old agent was put back, or its helper did not start.
detailstring 1–512 chars | nullWhy the update failed, up to 512 characters. Null unless it failed.
ChatTag
The bracketed tag in front of every plugin chat line.
textstring 1–24 charsoptionalThe tag's text, without brackets or control characters. Brackets would end the tag early in SwiftlyS2's colour markup. When absent,
Ankor.string 1–24 chars
Must match
^[^[\]\p{Cc}]+$coloranyoptionalThe tag's colour. When absent,
blue.
ConsoleCommandReply
The server the command was handed to.
allocation_idAllocationIdThe allocation the command went to.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
ControllerAddress
Where a node dials the controller: a host with an optional port, whether it encrypts, and the paths it reaches there.
hostControllerHostThe controller's host with an optional port.
ControllerHostA host with an optional port and no scheme or path, such as
cs.example.com,192.168.0.10:3000or[fd00::1].Rejected when it contains whitespace, a control character,
/,\,?or#. It is also rejected unlesshttp://followed by the value parses as a URL that has a host, an optional port and nothing else, such as a user name.string
tlsbooleanWhether the agent dials over TLS.
socket_pathControllerPathThe path of the agent socket. It is
/ws/agentunlessagent.ymlsetscontroller.socket_path.ControllerPathA path on the controller's host. It starts with
/, followed by URL path characters and percent escapes, without a query or fragment.string ≤ 255 chars
Must match
^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$events_pathControllerPathThe path event batches are posted to. It is
/api/node/eventsunlessagent.ymlsetscontroller.events_path.ControllerPathA path on the controller's host. It starts with
/, followed by URL path characters and percent escapes, without a query or fragment.string ≤ 255 chars
Must match
^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$
Cs2ImageUpdate
A switch of the cs2 image: the one running now, or the last one to end since the agent started.
imageImageReferenceThe image the switch is to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepImageUpdateStep| nullWhere the switch is while it runs. Null once it ended.
ImageUpdateStepWhere an
update_agentorupdate_cs2_imageis.string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
outcomeCs2ImageUpdateOutcome| nullHow the switch ended. Null while it runs.
Cs2ImageUpdateOutcomeHow an
update_cs2_imageended.string enum
"completed"future launches use the image.
"pull_failed"the image could not be pulled.
"overlay_failed"its addon overlay could not be extracted.
"failed"anything else, such as the agent not saving the image setting.
detailstring 1–512 chars | nullWhy the switch failed, up to 512 characters. Null unless it failed.
Cs2State
The node's game install and image.
build_idBuildId| nullThe installed game build. Null before the first install.
latest_build_idBuildId| nullThe newest public CS2 build the agent read from Steam. Null until its first successful read. The agent updates an installed node to it on its own once every slot is idle, unless the node's
auto_updateisfalse.imageImageReferenceThe cs2 image set in
agent.yml, which future launches use.ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$image_idImageId| nullThe local id that
imageresolves to on the node. Null until the image is there.ImageIdThe id Docker gives an image:
sha256:and 64 hex digits.string
Must match
^sha256:[0-9a-f]{64}$updateCs2Update| nullThe install or update that runs now, or else the last one to end since the agent started. Null before any. An agent that starts while an update that it started earlier still runs reports that update.
Cs2UpdateA CS2 install or update on the node: one running, or the last one to end since the agent started.
modeCs2UpdateModeHow the update runs.
Cs2UpdateModeHow thoroughly a CS2 install or update runs.
string enum
"update"downloads what changed.
"verify"also re-hashes every file.
"reinstall"wipes the install volume first and downloads all of it.
automaticbooleanWhether the agent started the update on its own, to reach the newest public build. When false, an
update_cs2started it.outcomeCs2UpdateOutcome| nullHow the update ended. Null while it runs.
Cs2UpdateOutcomeHow a CS2 install or update ended.
An update container that an earlier agent process started reports progress again until it exits. It ends
completedorfailedby its exit code, orunobserved.string enum
"completed"the game files are installed.
"pull_failed"the cs2 image could not be pulled.
"overlay_failed"its addon overlay could not be extracted.
"failed"any other failure, such as the update container exiting with an error.
"unobserved"an update container that an earlier agent process started exited, and the agent did not see the exit.
detailstring 1–512 chars | nullWhy the update failed, up to 512 characters. Null unless it failed.
image_updateCs2ImageUpdate| nullThe switch of
imagethat runs now, or else the last one to end since the agent started. Null before any.Cs2ImageUpdateA switch of the cs2 image: the one running now, or the last one to end since the agent started.
imageImageReferenceThe image the switch is to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepImageUpdateStep| nullWhere the switch is while it runs. Null once it ended.
ImageUpdateStepWhere an
update_agentorupdate_cs2_imageis.string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
outcomeCs2ImageUpdateOutcome| nullHow the switch ended. Null while it runs.
Cs2ImageUpdateOutcomeHow an
update_cs2_imageended.string enum
"completed"future launches use the image.
"pull_failed"the image could not be pulled.
"overlay_failed"its addon overlay could not be extracted.
"failed"anything else, such as the agent not saving the image setting.
detailstring 1–512 chars | nullWhy the switch failed, up to 512 characters. Null unless it failed.
Cs2Update
A CS2 install or update on the node: one running, or the last one to end since the agent started.
modeCs2UpdateModeHow the update runs.
Cs2UpdateModeHow thoroughly a CS2 install or update runs.
string enum
"update"downloads what changed.
"verify"also re-hashes every file.
"reinstall"wipes the install volume first and downloads all of it.
automaticbooleanWhether the agent started the update on its own, to reach the newest public build. When false, an
update_cs2started it.outcomeCs2UpdateOutcome| nullHow the update ended. Null while it runs.
Cs2UpdateOutcomeHow a CS2 install or update ended.
An update container that an earlier agent process started reports progress again until it exits. It ends
completedorfailedby its exit code, orunobserved.string enum
"completed"the game files are installed.
"pull_failed"the cs2 image could not be pulled.
"overlay_failed"its addon overlay could not be extracted.
"failed"any other failure, such as the update container exiting with an error.
"unobserved"an update container that an earlier agent process started exited, and the agent did not see the exit.
detailstring 1–512 chars | nullWhy the update failed, up to 512 characters. Null unless it failed.
DeleteDemoReply
The demo that was removed.
slot_idSlotIdThe slot whose directory held it.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$file_nameDemoFileNameThe file removed.
DemoFileNameA demo's file name, as it sits in its launch's directory,
demos/<allocation_id>/in its slot.string
Must match
^[A-Za-z0-9._-]{1,156}\.dem$
DemoFile
A demo kept on the node.
slot_idSlotIdThe slot whose directory holds it.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$file_nameDemoFileNameThe file's name.
DemoFileNameA demo's file name, as it sits in its launch's directory,
demos/<allocation_id>/in its slot.string
Must match
^[A-Za-z0-9._-]{1,156}\.dem$size_bytesinteger ≥ 0Bytes in the file.
modified_atintegerUnix milliseconds when the file was last written.
recordingbooleanWhether its server is still recording it. While it is, the demo grows with each report and is neither uploaded nor deleted.
uploadingbooleanWhether it is uploading now.
demo_progressreports how far, and a node uploads one demo at a time.upload_errorstring 1–512 chars | nullWhy its upload failed or why it waits, up to 512 characters: a failure being retried, a refusal as invalid, or every demo held while the target refuses the node or has failed for a day. Null once an upload works again or the target changes.
DemoUploadEdit
A demo upload as set_config sets it. A header without its value keeps the value the node has.
urlDemoUploadUrlThe upload target.
DemoUploadUrlThe URL finished demos are posted to. A target that needs credentials takes them in the configured
header, such asAuthorization: Basic …, which the node reports only as a hash.Rejected when the URL carries a user name or a password.
string ≤ 255 chars, uri
headerobject | nullA header to send with each upload. Null for none. Without
value, the header keeps the value of the node's current header of that name, so thedemo_uploadof ahellocan be sent back unchanged.namestringThe header's name, up to 64 letters, digits and
-. Rejected when it is, in any case, one ofhost,content-type,content-length,transfer-encoding,connection,keep-alive,upgrade,expect,te,trailer,ankor-protocol,ankor-file-name,ankor-match-idandankor-allocation-id, which the agent sets itself or which change how the request is framed.string
Must match
^[A-Za-z0-9-]{1,64}$valuestring ≤ 1024 charsoptionalThe header's value, sent verbatim, without line breaks.
string ≤ 1024 chars
Must match
^[^\r\n\u0000]*$
limit_mbitDemoUploadLimit| nullMegabits a second an upload may send while a game server runs on the node. Null for no limit.
DemoUploadLimitWhole megabits a second, from 1 to 10 Gbit/s.
integer 1–10000
EventBacklog
The events that wait on the node because uploading them fails, as the agent read them. While uploads work, nothing is stuck, so servers is empty, the counts are zero and reason is null.
Rejected unless servers holds as many entries as server_count, or 100 when server_count is larger. It is also rejected when event_count is below the sum of pending over servers. A reason is rejected when server_count is zero, and a null reason when it is not.
serversStuckServer[], ≤ 100 itemsThe servers with the oldest stuck events, oldest first, up to 100.
StuckServerA server whose events wait on the node.
allocation_idAllocationIdThe server whose plugin sent them.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
pendinginteger ≥ 1Events of the server still queued on the node.
server_countinteger ≥ 0Servers with stuck events on the node, those past
serverstoo.event_countinteger ≥ 0Events that every stuck server holds together.
reasonstring 1–512 chars | nullWhy the last upload failed, up to 512 characters. Null when nothing is stuck, and only then.
EventBatchFrame
One frame of an event batch: an event and its position among the events of the server that the batch names. A node runs each allocation once and refuses to launch one it has run before, so the batch's allocation_id and the frame's seq identify the event. Parse each frame of a batch on its own with this schema.
seqEventSeqThe event's position among the events of its server.
EventSeqAn event's position among its server's events, from 0.
integer ≥ 0
eventPluginToControllerMessageThe gameplay event, one of
PluginToControllerMessage.PluginToControllerMessageAny gameplay event.
One of
map_start,player_connect,player_disconnect,knife_start,knife_end,side_choice,going_live,round_backup,match_restored,round_start,round_freeze_end,round_buy_end,round_end,round_complete,player_death,player_hurt,player_blind,grenade_throw,grenade_detonate,grenade_end,round_shots,bomb_begin_plant,bomb_abort_plant,bomb_planted,bomb_begin_defuse,bomb_abort_defuse,bomb_defused,bomb_exploded,round_mvp,map_end,log.
GetServerStatusReply
The server asked about, and its state as its plugin reports it now.
map_namestring ≤ 64 charsThe map the server is on, up to 64 characters.
matchobject | nullThe loaded match and its team state. Null on a server without a match or after a refused config.
match_idMatchId| nullThe
match_idthe server was launched with. Null for a match without one. The launch's config is the controller's to keep, so it is not echoed.MatchIdThe id of one map's match, which the controller chooses. A series of maps is a grouping that the controller keeps. The id is a lowercase UUID, because demo file names carry it and case matters there.
string
phaseMatchPhaseWhere the match is.
MatchPhaseWhere a match is.
string enum
"loading"its map is loading.
"warmup"warmup.
"pending_restore"a launch with a restore went here from warmup while the engine loads the backup, and goes to
liveonce the restored round starts. A load that fails leaves the match here, where the plugin reports nothing, until a load is tried again or the server is stopped."knife"the knife round.
"side_choice"the side choice.
"live"live play.
"post_live"after the last round.
team1_sidePlayingSideTeam 1's current side.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
team2_sidePlayingSideTeam 2's current side, always the other side, sent so a reader shows each team without deriving it.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
team1_scoreinteger ≥ 0Team 1's score.
team2_scoreinteger ≥ 0Team 2's score.
playersobject[], ≤ 64 itemsEveryone connected, up to 64.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe player's side.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
config_errorstring ≤ 512 chars | nullWhy the plugin could not read or use the match config it was launched with, up to 512 characters. Null when the server has no match config or the plugin accepted it.
readybooleanWhether players can join. When
true, the server is logged on to Steam and has loaded the map that its launch asked for, the workshop map when it has one. It staystrueonce set.CS2 does not fall back to an anonymous logon when Steam refuses its token, so
truealso indicates that Steam accepted the GSLT and that its last use can be updated.server_steam_idSteamId64| nullThe SteamID64 that Steam gave the server when it logged on with its GSLT. Each token keeps one SteamID across logons, so a controller can look the server up in Steam's server list by it. The plugin also adds the
allocation_idwithout its dashes tosv_tags, which that list shows. Null untilready.allocation_idAllocationIdThe allocation the request asked about.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
HostInfo
The machine the agent runs on.
cpu_countinteger ≥ 1Logical CPUs the agent can use.
os_namestring 1–256 chars | nullThe host's os-release
PRETTY_NAME, up to 256 characters. Null when unreadable.kernelstring 1–256 charsThe kernel release, which the agent's container shares with the host.
InventoryItem
One kind of item that a player holds: the engine's item definition index as weapon, a quantity, and the unit price in this game build.
weaponinteger 1–65535The engine's item definition index.
quantityinteger 1–20Items of this kind that the player holds, up to ten times the stock limit of 2 flashbangs.
unit_valueinteger 0–52000Dollars that one item costs, up to ten times the dearest stock item, the M249 at 5,200.
LaunchRules
MatchRules as a launch asks for them, where each rule left out takes the value of a typical competitive match. The reports of going_live and round_backup always carry every rule.
max_roundsinteger 1–240optionalRounds in regulation, as
mp_maxrounds. When absent, 24.overtimebooleanoptionalWhether a tie after regulation goes to overtime, as
mp_overtime_enable. When absent,true.overtime_max_roundsinteger 1–60optionalRounds in one overtime, both halves together, as
mp_overtime_maxrounds. When absent, 6.friendly_firebooleanoptionalWhether bullets and melee hurt teammates. Grenades always do. When absent,
true.
LogLine
One log line.
atinteger ≥ 0Unix milliseconds when the agent logged or read the line.
levelAgentLogLevel| nullHow serious the agent rated the line. Null for server and CS2 update output.
AgentLogLevelHow serious an agent log line is.
"info"|"warn"|"error"linestring ≤ 2000 charsThe line without its newline. The agent's lines carry the prefix of the component that logged them. A line keeps its ANSI colour escapes: SGR,
ESC[with digits and;, thenm. The agent removes every other escape, every control character but tab, and the Unicode characters that reorder text or break a line. The length limit may cut the last escape short.
LogSource
One log of a node: the agent's log, one CS2 install or update's output, or one server's output.
One of 3, told apart by kind:
kind"agent"
kind"cs2_update"update_idUpdateIdThe install or update that printed it, the
idof itscs2.update.UpdateIdChosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.
string
kind"server"allocation_idAllocationIdThe server that printed it.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
LogSourceSummary
One source the agent keeps.
sourceLogSourceWhich log.
LogSourceOne log of a node: the agent's log, one CS2 install or update's output, or one server's output.
One of 3, told apart by
kind:kind"agent"
kind"cs2_update"update_idUpdateIdThe install or update that printed it, the
idof itscs2.update.UpdateIdChosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.
string
kind"server"allocation_idAllocationIdThe server that printed it.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
line_countinteger ≥ 0Lines kept of it.
last_line_atinteger ≥ 0 | nullUnix milliseconds of the newest line kept of it. Null for a source with no lines kept.
endedbooleanWhether the source has ended, as a server whose slot went idle or a CS2 install or update that ended. Always
falsefor the agent's log.
MatchConfig
The match a server is launched with, which covers one map. Each server plays one match. A restore launches the same match_id again under a new allocation_id, from a round_backup that the first server sent.
match_idMatchId| nulloptionalThe match's id, which names its demos and which
slot_statusandget_server_statusreport. Null for none, and when absent.MatchIdThe id of one map's match, which the controller chooses. A series of maps is a grouping that the controller keeps. The id is a lowercase UUID, because demo file names carry it and case matters there.
string
send_statisticsbooleanoptionalWhether the plugin sends the match's gameplay events, its
round_backupamong them, which the agent uploads in anevent_batch. When absent,false.Every match reports its
phase_changeandscore. A match without statistics sends eachround_backupinbackupinstead, and a match with statistics only in its events.rosterRosterWho may join, and on which team.
RosterThe teams and spectators of a match. Each player holds one place on the server, whichever team or list the player is in.
Rejected when a SteamID appears twice across both teams and
spectators, or when they hold more than 64 together.team1RosterTeamTeam 1, which events number
1.RosterTeamOne team of a
Roster.namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
team2RosterTeamTeam 2, which events number
2.RosterTeamOne team of a
Roster.namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
spectatorsSteamId64[], ≤ 2 itemsPlayers allowed in as spectators, who watch with the game's free camera, up to 2. When
ready_modeismanual, they ready up too.
sidesSidesModeHow starting sides are decided.
SidesModeHow starting sides are decided.
string enum
"knife"a knife round decides them.
"team1_ct"team 1 starts as CT.
"team1_t"team 1 starts as T.
knife_decision_secondsinteger 5–300optionalSeconds the knife winners' captain has to type
!stay,!swap,!ctor!t, from 5 to 300. The server stays in warmup meanwhile, with its clock counting these seconds down. An answer starts the match immediately. Without one, the team stays on its side when the clock runs out. When absent, 60.ready_modeanyoptionalHow warmup ends. When absent,
auto.spectators_ready_upbooleanoptionalWhether, under
manual, the match also waits for every rostered spectator to connect and type!ready, and any of them can force-ready the spectators. When absent,false, so the match waits for the teams alone.allow_force_readybooleanoptionalWhether, under
manual, captains and rostered spectators may type!forceready. When absent,false, so the match waits for every rostered player's!ready.ready_timeout_secondsinteger 1–1800 | nulloptionalSeconds from warmup until both teams must be ready, up to 1800. Null for no time limit, and when absent.
When the time passes, the server kicks every player and the map ends with
map_end, which says who was connected and ready. The controller decides what that means for the match. Must be null withexternal, where only the controller starts the match.record_demobooleanWhether GOTV records the live match as a demo.
rulesanyoptionalThe rules the match is played under, applied over those of the game mode. When absent, every rule takes its default.
restoreRestoreFile| nulloptionalA live round to play on from, taken from the
round_backupthat reported it. Null for a match that plays the map from its start, and when absent.With a restore, the server skips the knife round and the side choice whatever
sidessays, and after warmup it loads the backup instead of going live. Team 1 takes the restore'steam1_side, the round and the scores come from the file, and the restore'srulesreplace the match'srules. The agent writesfileto the slot formp_backup_restore_load_file.RestoreFileWhat a server needs to play on from the backup of a live round. That is the engine's backup file, which holds the round, the scores and the money and equipment of every player, and the two things that the file does not hold.
A launch carries one as
match.restore.team1_sidePlayingSideTeam 1's side in that round. On a launch, the plugin seats players by it through warmup, before the load.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
rulesMatchRulesThe rules that the map was played under. A restore plays on under these rules instead of the rules of its launch.
MatchRulesThe rules of a match, as a launch asks for them and as
going_liveandround_backupreport the server playing them.The plugin reads the round settings off the server's cvars.
friendly_firecomes from the launch, and Ankor applies it through the damage reductions instead ofmp_friendlyfire.max_roundsinteger 1–240Rounds in regulation, as
mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.overtimebooleanWhether a tie after regulation goes to overtime, as
mp_overtime_enable.overtime_max_roundsinteger 1–60Rounds in one overtime, both halves together, as
mp_overtime_maxrounds. The bound is 60, ten times the stock 6.friendly_firebooleanWhether bullets and melee hurt teammates. Grenades always do.
filestring 1–524288 charsThe backup file as the engine wrote it, up to 524288 characters. The file holds the money and equipment of every player, keyed by account, and only
mp_backup_restore_load_filereads it.The file is text with tabs and line breaks, so a file at the length cap stays within the frame limits once JSON escapes it. Rejected when it holds a lone UTF-16 surrogate.
string 1–524288 chars
Must match
^[\t\n\r\P{Cc}]*$
MatchRules
The rules of a match, as a launch asks for them and as going_live and round_backup report the server playing them.
The plugin reads the round settings off the server's cvars. friendly_fire comes from the launch, and Ankor applies it through the damage reductions instead of mp_friendlyfire.
max_roundsinteger 1–240Rounds in regulation, as
mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.overtimebooleanWhether a tie after regulation goes to overtime, as
mp_overtime_enable.overtime_max_roundsinteger 1–60Rounds in one overtime, both halves together, as
mp_overtime_maxrounds. The bound is 60, ten times the stock 6.friendly_firebooleanWhether bullets and melee hurt teammates. Grenades always do.
NodeSettings
The part of agent.yml that the controller may edit, as hello reports it applied.
slotsSlotLayoutThe slots servers run in.
SlotLayoutUp to 64 slots. Rejected when two slots share an
id, or when two ports are equal. Every slot'sportandtv_portcount, so a slot's two ports differ too. It is also rejected when a port is 4500, where the agent listens for plugins.ReportedSlotA slot as the agent reports it, with the last ten characters of its token in place of the token.
idSlotIdThe slot's id, 1 to 32 letters, digits,
_and-. It is unique on its node.SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$portPortThe game port, UDP. Every
portandtv_porton a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.PortA TCP or UDP port.
integer 1–65535
tv_portPortThe GOTV port, UDP, under the same rules as
port.PortA TCP or UDP port.
integer 1–65535
gslt_hintGsltHintThe last ten characters of the slot's token.
GsltHintThe last ten characters of a token, which the agent reports instead of the token. They are enough to tell apart every token on one Steam account.
string
Must match
^[A-Za-z0-9]{10}$
pinned_ipIpv4| nullThe address players connect to. Null for the node's
public_ip. Servers already running keep the address their launch announced.Ipv4A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros.
string
controllerControllerAddressWhere the agent dials the controller. It redials when any part of it changes.
ControllerAddressWhere a node dials the controller: a host with an optional port, whether it encrypts, and the paths it reaches there.
hostControllerHostThe controller's host with an optional port.
ControllerHostA host with an optional port and no scheme or path, such as
cs.example.com,192.168.0.10:3000or[fd00::1].Rejected when it contains whitespace, a control character,
/,\,?or#. It is also rejected unlesshttp://followed by the value parses as a URL that has a host, an optional port and nothing else, such as a user name.string
tlsbooleanWhether the agent dials over TLS.
socket_pathControllerPathThe path of the agent socket. It is
/ws/agentunlessagent.ymlsetscontroller.socket_path.ControllerPathA path on the controller's host. It starts with
/, followed by URL path characters and percent escapes, without a query or fragment.string ≤ 255 chars
Must match
^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$events_pathControllerPathThe path event batches are posted to. It is
/api/node/eventsunlessagent.ymlsetscontroller.events_path.ControllerPathA path on the controller's host. It starts with
/, followed by URL path characters and percent escapes, without a query or fragment.string ≤ 255 chars
Must match
^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$
auto_updatebooleanWhether the node keeps itself up to date: CS2 on
cs2.latest_build_id, and its agent and cs2 images on the newest release of their major. When false, the node stays oncs2.build_iduntil anupdate_cs2, and accepts launches while it is behindcs2.latest_build_id, so players on a newer client cannot join its servers. Its images then change only withupdate_agentandupdate_cs2_image.demo_uploadReportedDemoUpload| nullWhere the agent uploads demos. Null for no uploads, which keeps demos on the node. The header's value is reported as its SHA-256.
ReportedDemoUploadA demo upload as the node reports it, with the header's value replaced by its hash, because the value is a credential that the controller set.
urlDemoUploadUrlThe upload target.
DemoUploadUrlThe URL finished demos are posted to. A target that needs credentials takes them in the configured
header, such asAuthorization: Basic …, which the node reports only as a hash.Rejected when the URL carries a user name or a password.
string ≤ 255 chars, uri
headerobject | nullThe header sent with each upload. Null for none.
namestringThe header's name, up to 64 letters, digits and
-. Rejected when it is, in any case, one ofhost,content-type,content-length,transfer-encoding,connection,keep-alive,upgrade,expect,te,trailer,ankor-protocol,ankor-file-name,ankor-match-idandankor-allocation-id, which the agent sets itself or which change how the request is framed.string
Must match
^[A-Za-z0-9-]{1,64}$value_sha256stringThe lowercase hex SHA-256 of the value's UTF-8 bytes, to compare with the value the controller set.
string
Must match
^[0-9a-f]{64}$
limit_mbitDemoUploadLimit| nullMegabits a second an upload may send while a game server runs on the node. Null for no limit.
DemoUploadLimitWhole megabits a second, from 1 to 10 Gbit/s.
integer 1–10000
memory_mbMemoryLimit| nullMiB of memory each game container may use. Null for no cap. A change applies to servers launched afterwards, and CS2 installs and updates are exempt.
Rejected when it is not a whole number from 1024 to 65536.
MemoryLimitMiB of memory each game container may use. CS2 installs and updates are exempt.
Rejected when it is not a whole number from 1024 to 65536.
integer 1024–65536
NodeSettingsEdit
NodeSettings as set_config asks for them. A missing field keeps the node's value. Null is a value, as NodeSettings describes. slots, when present, is the whole layout.
slotsSlotEdit[], ≤ 64 itemsoptionalThe slots servers run in.
SlotEditdescribes their tokens.Rejected when two slots share an
idor agslt, or when two ports are equal. Every slot'sportandtv_portcount, so a slot's two ports differ too. It is also rejected when a port is 4500, where the agent listens for plugins. The agent fills in the kept tokens and refuses a layout in which two slots then share one.SlotEditA slot as
set_configasks for it.gsltis a new token, which may replace the token of a slot that runs a server. That server keeps the token it started with, and no other slot may use that token until the server ends (slot_held). Withoutgsltthe slot keeps its current token, so a slot the node does not have yet needs one (slot_token_required), and a slot from ahellocan be sent back unchanged.idSlotIdThe slot's id, 1 to 32 letters, digits,
_and-. It is unique on its node.SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$portPortThe game port, UDP. Every
portandtv_porton a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.PortA TCP or UDP port.
integer 1–65535
tv_portPortThe GOTV port, UDP, under the same rules as
port.PortA TCP or UDP port.
integer 1–65535
gsltanyoptionalThe slot's new token. Without one, the slot keeps the token it has.
pinned_ipIpv4| nulloptionalThe address players connect to. Null for the node's
public_ip. Servers already running keep the address their launch announced.Ipv4A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros.
string
controlleranyoptionalWhere the agent dials the controller. It redials when any part of it changes.
auto_updatebooleanoptionalWhether the node keeps itself up to date: CS2 on
cs2.latest_build_id, and its agent and cs2 images on the newest release of their major. When false, the node stays oncs2.build_iduntil anupdate_cs2, and accepts launches while it is behindcs2.latest_build_id, so players on a newer client cannot join its servers. Its images then change only withupdate_agentandupdate_cs2_image.demo_uploadDemoUploadEdit| nulloptionalWhere the agent uploads demos. Null for no uploads, which keeps demos on the node.
DemoUploadEditdescribes its header.DemoUploadEditA demo upload as
set_configsets it. A header without its value keeps the value the node has.urlDemoUploadUrlThe upload target.
DemoUploadUrlThe URL finished demos are posted to. A target that needs credentials takes them in the configured
header, such asAuthorization: Basic …, which the node reports only as a hash.Rejected when the URL carries a user name or a password.
string ≤ 255 chars, uri
headerobject | nullA header to send with each upload. Null for none. Without
value, the header keeps the value of the node's current header of that name, so thedemo_uploadof ahellocan be sent back unchanged.namestringThe header's name, up to 64 letters, digits and
-. Rejected when it is, in any case, one ofhost,content-type,content-length,transfer-encoding,connection,keep-alive,upgrade,expect,te,trailer,ankor-protocol,ankor-file-name,ankor-match-idandankor-allocation-id, which the agent sets itself or which change how the request is framed.string
Must match
^[A-Za-z0-9-]{1,64}$valuestring ≤ 1024 charsoptionalThe header's value, sent verbatim, without line breaks.
string ≤ 1024 chars
Must match
^[^\r\n\u0000]*$
limit_mbitDemoUploadLimit| nullMegabits a second an upload may send while a game server runs on the node. Null for no limit.
DemoUploadLimitWhole megabits a second, from 1 to 10 Gbit/s.
integer 1–10000
memory_mbMemoryLimit| nulloptionalMiB of memory each game container may use. Null for no cap. A change applies to servers launched afterwards, and CS2 installs and updates are exempt.
Rejected when it is not a whole number from 1024 to 65536.
MemoryLimitMiB of memory each game container may use. CS2 installs and updates are exempt.
Rejected when it is not a whole number from 1024 to 65536.
integer 1024–65536
NodeUnavailable
Why the node cannot run servers now, with maintenance first while it lasts. Meanwhile start_server is refused with maintenance_running for maintenance and node_unavailable otherwise. Everything else works.
Rejected when operation is null while code is maintenance, or set while code is another value.
codeNodeUnavailableCodeNodeUnavailableCodeWhy a node cannot run servers, one of the values of
NODE_UNAVAILABLE.string enum
"maintenance"The
MaintenanceOperationinoperationruns. It clears when the operation ends."event_storage"The agent cannot use the local store that keeps gameplay events until the controller takes them.
detailsays why. - If a call to the store waits past its limit, as on a disk that hangs, the code clears once the store answers. Deleting the store or restarting the agent loses what waits to be written. - If the agent cannot open the store, such as one that a newer agent wrote, a corrupt file or one it cannot write, the code lasts until a restart. Update the agent, or delete the store on the host and restart the agent. Deleting it loses the events and server exits it keeps."disk_space"The disk under the agent's data directory has less than 1024 MiB free, too little for a match's events and demo. The agent asks the disk every 30 seconds and before each launch, so the code clears within 30 seconds of space being freed, and a launch that arrives sooner is taken if the disk has room by then.
operationMaintenanceOperation| nullThe maintenance operation that runs when
codeismaintenance. Null for any othercode.MaintenanceOperationThe maintenance operation that runs on the node.
string enum
"cs2_update"a CS2 install or update, also one an earlier agent started.
"agent_update"an
update_agent, until its replacement has proved it stays up."cs2_image_update"an
update_cs2_image."image_cleanup"the agent's removal of replaced images when it starts.
detailstring 1–512 charsThe agent's message, up to 512 characters.
PlacedPlayer
A PlayerRef with the position of the player, for a player who acted in the world when the event happened, so the position is always known.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name when the event happened.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe side that the player was on.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
teamTeamNumber| nullThe roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.
TeamNumberA team of the
Roster, team 1 or team 2, whichever side it plays.One of 2:
12positionPlayerPositionWhere the player stood and looked.
PlayerPositionWhere a player stood, as a
WorldPos, and where the player looked.xnumber -32768–32768Engine units along the map's x axis.
ynumber -32768–32768Engine units along the map's y axis.
znumber -32768–32768Engine units along the map's z axis, the height.
pitchnumber -90–90Degrees of eye pitch. A positive pitch looks down.
yawnumber -360–360Degrees of eye yaw, counter-clockwise from the +x axis.
PlayerAt
A PlayerRef with the position of the player when the event happened.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name when the event happened.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe side that the player was on.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
teamTeamNumber| nullThe roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.
TeamNumberA team of the
Roster, team 1 or team 2, whichever side it plays.One of 2:
12positionPlayerPosition| nullWhere the player stood and looked. Null when the player had no body in the world.
PlayerPositionWhere a player stood, as a
WorldPos, and where the player looked.xnumber -32768–32768Engine units along the map's x axis.
ynumber -32768–32768Engine units along the map's y axis.
znumber -32768–32768Engine units along the map's z axis, the height.
pitchnumber -90–90Degrees of eye pitch. A positive pitch looks down.
yawnumber -360–360Degrees of eye yaw, counter-clockwise from the +x axis.
PlayerInventory
What a player carries. A null inventory means that the plugin could not read the pawn.
itemsInventoryItem[], ≤ 64 itemsWeapons, grenades and other items held, up to 64.
InventoryItemOne kind of item that a player holds: the engine's item definition index as
weapon, a quantity, and the unit price in this game build.weaponinteger 1–65535The engine's item definition index.
quantityinteger 1–20Items of this kind that the player holds, up to ten times the stock limit of 2 flashbangs.
unit_valueinteger 0–52000Dollars that one item costs, up to ten times the dearest stock item, the M249 at 5,200.
armorinteger 0–1000Armor points, up to 1000, ten times the stock 100.
helmetbooleanWhether the armor includes a helmet.
defuse_kitbooleanWhether the player carries a defuse kit.
PlayerPosition
Where a player stood, as a WorldPos, and where the player looked.
xnumber -32768–32768Engine units along the map's x axis.
ynumber -32768–32768Engine units along the map's y axis.
znumber -32768–32768Engine units along the map's z axis, the height.
pitchnumber -90–90Degrees of eye pitch. A positive pitch looks down.
yawnumber -360–360Degrees of eye yaw, counter-clockwise from the +x axis.
PlayerRef
A player as the event saw them.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name when the event happened.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe side that the player was on.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
teamTeamNumber| nullThe roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.
TeamNumberA team of the
Roster, team 1 or team 2, whichever side it plays.One of 2:
12
PlayerShots
The shots that one player fired over a round.
playerPlayerRefThe player.
PlayerRefA player as the event saw them.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name when the event happened.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe side that the player was on.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
teamTeamNumber| nullThe roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.
TeamNumberA team of the
Roster, team 1 or team 2, whichever side it plays.One of 2:
12
weaponsWeaponShots[], 1–4096 itemsEach weapon that the player fired, once each.
WeaponShotsThe shots that a player fired with one weapon over a round. Rejected unless
shotsequals the number ofticks.weaponWeaponThe weapon fired.
WeaponA weapon, by the engine's item definition index or, for an item without one, the engine's class name. Rejected when
idis a number andfallbackis not null.idinteger 1–65535 | nullThe item definition index, a 16-bit unsigned integer. Null when the item has none.
fallbackstring | nullThe engine class name of an item without an index. Null when
idis set, or when the engine named no weapon either.string
Must match
^[A-Za-z0-9_]{1,64}$
shotsinteger 1–4096Shots fired, which equals the number of
ticks.ticksnumber ≥ 0[], 1–4096 itemsThe server tick of each shot.
PluginToControllerMessage
Any gameplay event.
One of map_start, player_connect, player_disconnect, knife_start, knife_end, side_choice, going_live, round_backup, match_restored, round_start, round_freeze_end, round_buy_end, round_end, round_complete, player_death, player_hurt, player_blind, grenade_throw, grenade_detonate, grenade_end, round_shots, bomb_begin_plant, bomb_abort_plant, bomb_planted, bomb_begin_defuse, bomb_abort_defuse, bomb_defused, bomb_exploded, round_mvp, map_end, log.
ReadyTeam
A team's players when the ready deadline passed.
connectedinteger 0–64Rostered players of the team on the server.
readybooleanWhether the team counted as ready, its captain's force-ready included.
ReportedDemoUpload
A demo upload as the node reports it, with the header's value replaced by its hash, because the value is a credential that the controller set.
urlDemoUploadUrlThe upload target.
DemoUploadUrlThe URL finished demos are posted to. A target that needs credentials takes them in the configured
header, such asAuthorization: Basic …, which the node reports only as a hash.Rejected when the URL carries a user name or a password.
string ≤ 255 chars, uri
headerobject | nullThe header sent with each upload. Null for none.
namestringThe header's name, up to 64 letters, digits and
-. Rejected when it is, in any case, one ofhost,content-type,content-length,transfer-encoding,connection,keep-alive,upgrade,expect,te,trailer,ankor-protocol,ankor-file-name,ankor-match-idandankor-allocation-id, which the agent sets itself or which change how the request is framed.string
Must match
^[A-Za-z0-9-]{1,64}$value_sha256stringThe lowercase hex SHA-256 of the value's UTF-8 bytes, to compare with the value the controller set.
string
Must match
^[0-9a-f]{64}$
limit_mbitDemoUploadLimit| nullMegabits a second an upload may send while a game server runs on the node. Null for no limit.
DemoUploadLimitWhole megabits a second, from 1 to 10 Gbit/s.
integer 1–10000
ReportedSlot
A slot as the agent reports it, with the last ten characters of its token in place of the token.
idSlotIdThe slot's id, 1 to 32 letters, digits,
_and-. It is unique on its node.SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$portPortThe game port, UDP. Every
portandtv_porton a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.PortA TCP or UDP port.
integer 1–65535
tv_portPortThe GOTV port, UDP, under the same rules as
port.PortA TCP or UDP port.
integer 1–65535
gslt_hintGsltHintThe last ten characters of the slot's token.
GsltHintThe last ten characters of a token, which the agent reports instead of the token. They are enough to tell apart every token on one Steam account.
string
Must match
^[A-Za-z0-9]{10}$
ReserveSlotReply
The slot that is reserved.
slot_idSlotIdThe slot reserved.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$
ResourceTick
One sample of the node's disk, memory and CPU, taken every 3 seconds.
atinteger ≥ 0Unix milliseconds when the tick was taken.
diskResourceUsage| nullThe filesystem holding the node's data directory, as
dfcounts it. Null when it could not be read.ResourceUsageA capacity and how much of it is in use, in bytes.
capinteger ≥ 0Bytes of capacity.
usedinteger ≥ 0Bytes in use.
memoryResourceUsageThe memory the node may use, and how much it uses. Cache the kernel can free counts as free.
ResourceUsageA capacity and how much of it is in use, in bytes.
capinteger ≥ 0Bytes of capacity.
usedinteger ≥ 0Bytes in use.
cpuobject | nullHow busy the node's CPUs are, in percent of all the CPUs it may use. Null in the first tick.
maxinteger 0–100Percent busy at the busiest moment of the tick.
averageinteger 0–100Percent busy on average over the tick.
ResourceUsage
A capacity and how much of it is in use, in bytes.
capinteger ≥ 0Bytes of capacity.
usedinteger ≥ 0Bytes in use.
RestoreFile
What a server needs to play on from the backup of a live round. That is the engine's backup file, which holds the round, the scores and the money and equipment of every player, and the two things that the file does not hold.
A launch carries one as match.restore.
team1_sidePlayingSideTeam 1's side in that round. On a launch, the plugin seats players by it through warmup, before the load.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
rulesMatchRulesThe rules that the map was played under. A restore plays on under these rules instead of the rules of its launch.
MatchRulesThe rules of a match, as a launch asks for them and as
going_liveandround_backupreport the server playing them.The plugin reads the round settings off the server's cvars.
friendly_firecomes from the launch, and Ankor applies it through the damage reductions instead ofmp_friendlyfire.max_roundsinteger 1–240Rounds in regulation, as
mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.overtimebooleanWhether a tie after regulation goes to overtime, as
mp_overtime_enable.overtime_max_roundsinteger 1–60Rounds in one overtime, both halves together, as
mp_overtime_maxrounds. The bound is 60, ten times the stock 6.friendly_firebooleanWhether bullets and melee hurt teammates. Grenades always do.
filestring 1–524288 charsThe backup file as the engine wrote it, up to 524288 characters. The file holds the money and equipment of every player, keyed by account, and only
mp_backup_restore_load_filereads it.The file is text with tabs and line breaks, so a file at the length cap stays within the frame limits once JSON escapes it. Rejected when it holds a lone UTF-16 surrogate.
string 1–524288 chars
Must match
^[\t\n\r\P{Cc}]*$
RestoreRoundReply
The server and round the restore was handed to.
allocation_idAllocationIdThe allocation the restore went to.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
roundRoundNumberThe round it loads.
RoundNumberA one-based round number. A map's history holds far fewer than the 1000 it allows.
integer 1–1000
Roster
The teams and spectators of a match. Each player holds one place on the server, whichever team or list the player is in.
Rejected when a SteamID appears twice across both teams and spectators, or when they hold more than 64 together.
team1RosterTeamTeam 1, which events number
1.RosterTeamOne team of a
Roster.namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
team2RosterTeamTeam 2, which events number
2.RosterTeamOne team of a
Roster.namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
spectatorsSteamId64[], ≤ 2 itemsPlayers allowed in as spectators, who watch with the game's free camera, up to 2. When
ready_modeismanual, they ready up too.
RosterTeam
One team of a Roster.
namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
RoundPlayer
The state and money of a player when the plugin sampled the round. Money is in dollars.
playerPlayerRefThe player sampled.
PlayerRefA player as the event saw them.
steam_idSteamId64The player's SteamID64.
namePlayerNameThe player's name when the event happened.
PlayerNameA player's name, cut to up to 64 characters, without control characters. Rejected when it holds a lone UTF-16 surrogate.
string ≤ 64 chars
Must match
^[^\p{Cc}]*$sideSideThe side that the player was on.
SideThe side a player is on.
string enum
"t"terrorists, a playing side.
"ct"counter-terrorists, a playing side.
"spec"spectators and players on no team.
teamTeamNumber| nullThe roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.
TeamNumberA team of the
Roster, team 1 or team 2, whichever side it plays.One of 2:
12
alivebooleanWhether the player was alive when sampled.
equipment_valueinteger 0–65535Dollars of equipment that the player carried, the engine's figure.
cashinteger 0–65535Dollars in hand when sampled.
start_cashinteger 0–65535Dollars in hand at the start of the round.
cash_spentinteger 0–131070Dollars spent this round by the time of the sample.
ServerExit
A server whose container is gone, and why.
slot_idSlotIdThe slot it ran in.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$allocation_idAllocationIdThe server that ended.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
reasonServerExitReasonWhy it ended.
ServerExitReasonWhy a server ended: one of the
AgentStopReasonvalues when the agent stopped it on its own, or one of these.string enum
"idle_empty"the server stayed empty for its launch's
idle_shutdown_seconds."config_rejected"the plugin refused its match config, as
config_errorsays."start_timeout"the server was still
starting60 seconds after its launch, or after a restarted agent took it over."quit_timeout"the server was still running 10 seconds after its plugin sent
quitting."slot_removed"a restarted agent found the server running on a slot that
agent.ymlno longer has."requested"a
stop_serverfrom the controller stopped it."clean_exit"it ended on its own with exit code
0, as after its match or a consolequit."crashed"it ended on its own with another exit code.
"launch_failed"its container never started.
"lost"it ended and the agent did not see how, such as a container removed by hand.
exit_codeinteger | nullThe container's exit code. Null when the agent did not see one.
detailstring 1–512 chars | nullWhat the reason does not say, up to 512 characters: the plugin's
config_errorforconfig_rejected, and Docker's message forlaunch_failed. Null for every other reason.
ServerLaunchConfig
What a game server is launched with: any CS2 server, and the match Ankor's plugin plays on it, if any.
Rejected when both workshop_id and map_name are null. With a match, it is also rejected:
- when
workshop_idis set, because a match plays a stock map. - when the roster's players and spectators together outnumber
max_players. - when
game_modeis notcasual,competitiveorwingman. - when
ready_modeisexternalandready_timeout_secondsis set.
hostnamestring | nulloptionalThe server's name, which players see in game, such as on the scoreboard. It is up to 128 characters. Null or empty leaves the game's own name, and null is the value when absent. Rejected when it holds an ASCII control character, such as a line break.
steam_web_api_keySteamWebApiKey|""| nulloptionalThe Steam Web API key that workshop downloads need. Null or empty skips them, and null is the value when absent. Whoever runs the node can read the key.
One of 2:
A Steam Web API key, which the server needs to download workshop maps.
string
Must match
^[A-Za-z0-9]{1,64}$""game_passwordGamePassword| nulloptionalThe password players type to join. Null or empty for none, and null when absent.
GamePasswordThe password players type. It is printable ASCII without spaces,
"or;, because the server would read those as separators.string ≤ 128 chars
Must match
^[!#-:<-~]*$chat_taganyoptionalThe tag in front of the plugin's chat lines. When absent, each of its fields takes its default.
game_modeanyoptionalThe game mode, which sets the game's rules. When absent,
competitive.max_playersinteger 1–64The player capacity of the server, as
-maxplayers. A match's roster, players and spectators together, must fit.workshop_idWorkshopId| nulloptionalA workshop map to play. Null for a stock map, and when absent. A match plays a stock map.
map_nameStockMapName| nullThe stock map to play, required without
workshop_id. With aworkshop_id, the server boots this map before it switches to the workshop map. Null forde_dust2in that case.StockMapNameThe name of a stock map, such as
de_mirage. A name of all digits would be a workshop id.string
Must match
^(?!\d+$)[A-Za-z0-9_-]{1,64}$gotvobject | nulloptionalGOTV that spectators can watch. Null for none, and null when absent. A match that records a demo still runs GOTV then, because demos are recorded through it. That GOTV runs with
tv_delay 0and a randomtv_passwordthat the agent sends nowhere, so no spectator can join.Whether GOTV runs is set on the command line, because GOTV starts with the map. The other settings apply on every map load and when a match goes live, never while a demo records.
passwordGamePassword| nulloptionalThe GOTV password, as
tv_password, apart fromgame_password. Null or empty for none, and null when absent.GamePasswordThe password players type. It is printable ASCII without spaces,
"or;, because the server would read those as separators.string ≤ 128 chars
Must match
^[!#-:<-~]*$delay_secondsinteger ≥ 0Seconds GOTV runs behind the game.
idle_shutdown_secondsinteger ≥ 1 | nullSeconds the server may stay empty once its slot is
runningbefore the agent stops it, reportingidle_emptyas itsServerExitReason. Null for a server that runs until stopped. Hibernation must stay off. See When the cfgs run.execCfgName[], ≤ 16 itemsCfgs the server runs in order, after the game mode's cfg and the match's
rules. A server without a match runs them 1 second after every map load, and a match server runs them at warmup and when the match goes live. Warmup and the knife round run Ankor's cfgs over them.CfgNameA cfg the server runs, relative to
game/csgo/cfg/and without.cfg, such asnode/<name>from the node's cfgs.string ≤ 128 chars
Must match
^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$commandsstring[], ≤ 128 itemsConsole lines that the server runs after
exec, in order and at the same moments, so they overrideexecandrules. A match server leaves out a line that names a command ofmp_restartgame,mp_warmup_start,mp_warmup_end,mp_warmup_pausetimer,mp_warmuptime,mp_swapteams,mp_switchteams,mp_scrambleteams,mp_backup_restore_load_file,mp_backup_round_file,mp_backup_round_auto,restart,changelevel,map,host_workshop_map,ds_workshop_changelevel,tv_record,tv_stoprecordandalias. Rejected when a line holds an ASCII control character, such as a line break, which would end the console line.matchMatchConfig| nulloptionalThe match Ankor's plugin plays. Null runs a plain CS2 server, and is the value when absent. The plugin then runs no match, and the map,
exec,commandsand the node's plugins set the game.MatchConfigThe match a server is launched with, which covers one map. Each server plays one match. A restore launches the same
match_idagain under a newallocation_id, from around_backupthat the first server sent.match_idMatchId| nulloptionalThe match's id, which names its demos and which
slot_statusandget_server_statusreport. Null for none, and when absent.MatchIdThe id of one map's match, which the controller chooses. A series of maps is a grouping that the controller keeps. The id is a lowercase UUID, because demo file names carry it and case matters there.
string
send_statisticsbooleanoptionalWhether the plugin sends the match's gameplay events, its
round_backupamong them, which the agent uploads in anevent_batch. When absent,false.Every match reports its
phase_changeandscore. A match without statistics sends eachround_backupinbackupinstead, and a match with statistics only in its events.rosterRosterWho may join, and on which team.
RosterThe teams and spectators of a match. Each player holds one place on the server, whichever team or list the player is in.
Rejected when a SteamID appears twice across both teams and
spectators, or when they hold more than 64 together.team1RosterTeamTeam 1, which events number
1.RosterTeamOne team of a
Roster.namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
team2RosterTeamTeam 2, which events number
2.RosterTeamOne team of a
Roster.namestring ≤ 30 charsThe team name that players see, up to 30 characters. Rejected when it is blank, or when it holds a NUL or a lone UTF-16 surrogate.
string ≤ 30 chars
Must match
\SplayersSteamId64[], ≥ 1 itemsThe players of the team, captain first. The captain may use
!forcereadyand picks the side after the knife round. A team has at least one player, so it always has a captain.
spectatorsSteamId64[], ≤ 2 itemsPlayers allowed in as spectators, who watch with the game's free camera, up to 2. When
ready_modeismanual, they ready up too.
sidesSidesModeHow starting sides are decided.
SidesModeHow starting sides are decided.
string enum
"knife"a knife round decides them.
"team1_ct"team 1 starts as CT.
"team1_t"team 1 starts as T.
knife_decision_secondsinteger 5–300optionalSeconds the knife winners' captain has to type
!stay,!swap,!ctor!t, from 5 to 300. The server stays in warmup meanwhile, with its clock counting these seconds down. An answer starts the match immediately. Without one, the team stays on its side when the clock runs out. When absent, 60.ready_modeanyoptionalHow warmup ends. When absent,
auto.spectators_ready_upbooleanoptionalWhether, under
manual, the match also waits for every rostered spectator to connect and type!ready, and any of them can force-ready the spectators. When absent,false, so the match waits for the teams alone.allow_force_readybooleanoptionalWhether, under
manual, captains and rostered spectators may type!forceready. When absent,false, so the match waits for every rostered player's!ready.ready_timeout_secondsinteger 1–1800 | nulloptionalSeconds from warmup until both teams must be ready, up to 1800. Null for no time limit, and when absent.
When the time passes, the server kicks every player and the map ends with
map_end, which says who was connected and ready. The controller decides what that means for the match. Must be null withexternal, where only the controller starts the match.record_demobooleanWhether GOTV records the live match as a demo.
rulesanyoptionalThe rules the match is played under, applied over those of the game mode. When absent, every rule takes its default.
restoreRestoreFile| nulloptionalA live round to play on from, taken from the
round_backupthat reported it. Null for a match that plays the map from its start, and when absent.With a restore, the server skips the knife round and the side choice whatever
sidessays, and after warmup it loads the backup instead of going live. Team 1 takes the restore'steam1_side, the round and the scores come from the file, and the restore'srulesreplace the match'srules. The agent writesfileto the slot formp_backup_restore_load_file.RestoreFileWhat a server needs to play on from the backup of a live round. That is the engine's backup file, which holds the round, the scores and the money and equipment of every player, and the two things that the file does not hold.
A launch carries one as
match.restore.team1_sidePlayingSideTeam 1's side in that round. On a launch, the plugin seats players by it through warmup, before the load.
PlayingSideA playing side, for a field that never holds
spec.string enum
"t"terrorists.
"ct"counter-terrorists.
rulesMatchRulesThe rules that the map was played under. A restore plays on under these rules instead of the rules of its launch.
MatchRulesThe rules of a match, as a launch asks for them and as
going_liveandround_backupreport the server playing them.The plugin reads the round settings off the server's cvars.
friendly_firecomes from the launch, and Ankor applies it through the damage reductions instead ofmp_friendlyfire.max_roundsinteger 1–240Rounds in regulation, as
mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.overtimebooleanWhether a tie after regulation goes to overtime, as
mp_overtime_enable.overtime_max_roundsinteger 1–60Rounds in one overtime, both halves together, as
mp_overtime_maxrounds. The bound is 60, ten times the stock 6.friendly_firebooleanWhether bullets and melee hurt teammates. Grenades always do.
filestring 1–524288 charsThe backup file as the engine wrote it, up to 524288 characters. The file holds the money and equipment of every player, keyed by account, and only
mp_backup_restore_load_filereads it.The file is text with tabs and line breaks, so a file at the length cap stays within the frame limits once JSON escapes it. Rejected when it holds a lone UTF-16 surrogate.
string 1–524288 chars
Must match
^[\t\n\r\P{Cc}]*$
SlotEdit
A slot as set_config asks for it.
gslt is a new token, which may replace the token of a slot that runs a server. That server keeps the token it started with, and no other slot may use that token until the server ends (slot_held). Without gslt the slot keeps its current token, so a slot the node does not have yet needs one (slot_token_required), and a slot from a hello can be sent back unchanged.
idSlotIdThe slot's id, 1 to 32 letters, digits,
_and-. It is unique on its node.SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$portPortThe game port, UDP. Every
portandtv_porton a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.PortA TCP or UDP port.
integer 1–65535
tv_portPortThe GOTV port, UDP, under the same rules as
port.PortA TCP or UDP port.
integer 1–65535
gsltanyoptionalThe slot's new token. Without one, the slot keeps the token it has.
SlotStatus
One slot as the agent sees it.
Rejected when an idle slot names an allocation_id, a match_id or a server_steam_id, or when a slot in any other state has no allocation_id. It is also rejected when a slot that is not idle is reserved.
slot_idSlotIdThe slot this describes.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$stateSlotStateWhat the slot is doing.
SlotStateWhat a slot is doing.
string enum
"idle"the slot has no server.
"starting"the slot holds a server that its plugin has not yet reported ready for players with a
server_statuswithready. A server that a restarted agent took over starts here too."running"the plugin has reported the server ready.
"stopping"the server is being stopped.
allocation_idAllocationId| nullThe server on the slot. Null when the slot is
idle.AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
match_idMatchId| nullThe server's match id. Null for a server without a match or a match launched without one.
MatchIdThe id of one map's match, which the controller chooses. A series of maps is a grouping that the controller keeps. The id is a lowercase UUID, because demo file names carry it and case matters there.
string
plugin_onlinebooleanWhether the server's plugin is connected to the agent.
get_server_status,console_command,restore_roundandstart_matchreach it only while it is.gslt_stateGsltStateWhether Steam accepts the slot's token.
start_servernever picks a slot whose token isinvalid.GsltStateWhether Steam accepts a slot's token.
string enum
"ok"a logon with the token succeeded, either the agent's own or that of a server that turned
ready."invalid"Steam refused the token.
"unchecked"the agent has seen neither since the token was set.
reservedbooleanWhether the idle slot is kept from launches, while the controller replaces its token with
reserve_slotor while the agent logs its token on to Steam.server_steam_idSteamId64| nullThe
server_steam_idthat the server's plugin reported. The agent sends aslot_statusas soon as it learns the ID. Null when the slot isidleor until the server isready.
StartMatchReply
The server the start was handed to.
allocation_idAllocationIdThe allocation the start went to.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
StartServerReply
The server that started, and the slot the agent picked for it.
allocation_idAllocationIdThe allocation the request launched.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
slot_idSlotIdThe slot the server runs in.
SlotIdA slot's id, which is also part of the names of its containers.
string
Must match
^[A-Za-z0-9_-]{1,32}$
StopServerReply
The server that stopped.
allocation_idAllocationIdThe allocation the request stopped.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
StuckServer
A server whose events wait on the node.
allocation_idAllocationIdThe server whose plugin sent them.
AllocationIdThe id the controller picks for each server it launches. It identifies that server and its events from then on.
The id is a lowercase UUID, new for every launch. UUIDv7 is recommended, because its time-ordered values keep a database index on it compact as events arrive.
string
pendinginteger ≥ 1Events of the server still queued on the node.
TeamNumber
A team of the Roster, team 1 or team 2, whichever side it plays.
One of 2:
1
2
UpdateAgentReply
What follows an accepted update_agent: the update's first ImageUpdateStep, or unchanged when the node runs that image already, as the registry or the local image says, and nothing more happens.
imageImageReferenceThe agent image the update is to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepstring enumThe next step.
string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
"unchanged"
UpdateCs2ImageReply
What follows an accepted update_cs2_image: its first ImageUpdateStep.
imageImageReferenceThe cs2 image the switch is to.
ImageReferenceA Docker image reference, as
cs2_imageandagent_imageinagent.ymlhold it.string
Must match
^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$stepImageUpdateStepThe next step.
ImageUpdateStepWhere an
update_agentorupdate_cs2_imageis.string enum
"pulling"the image is being pulled.
"switching"the image is on the node and is put into use. A switch of the agent replaces its container, so the node goes offline and comes back. A switch of the cs2 image extracts its plugin files for future launches.
UpdateCs2Reply
The update an accepted update_cs2 started.
update_idUpdateIdThe update's id, as
cs2.update.id,cs2_update_progressand its log source carry it.UpdateIdChosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.
string
Weapon
A weapon, by the engine's item definition index or, for an item without one, the engine's class name. Rejected when id is a number and fallback is not null.
idinteger 1–65535 | nullThe item definition index, a 16-bit unsigned integer. Null when the item has none.
fallbackstring | nullThe engine class name of an item without an index. Null when
idis set, or when the engine named no weapon either.string
Must match
^[A-Za-z0-9_]{1,64}$
WeaponShots
The shots that a player fired with one weapon over a round. Rejected unless shots equals the number of ticks.
weaponWeaponThe weapon fired.
WeaponA weapon, by the engine's item definition index or, for an item without one, the engine's class name. Rejected when
idis a number andfallbackis not null.idinteger 1–65535 | nullThe item definition index, a 16-bit unsigned integer. Null when the item has none.
fallbackstring | nullThe engine class name of an item without an index. Null when
idis set, or when the engine named no weapon either.string
Must match
^[A-Za-z0-9_]{1,64}$
shotsinteger 1–4096Shots fired, which equals the number of
ticks.ticksnumber ≥ 0[], 1–4096 itemsThe server tick of each shot.
WorldPos
A point in the world, in engine units.
xnumber -32768–32768Engine units along the map's x axis.
ynumber -32768–32768Engine units along the map's y axis.
znumber -32768–32768Engine units along the map's z axis, the height.