Protocol reference

Types & Values

Values

TypeJSONDescription
AgentErrorCodestring enum

The code of a failed reply, one of the values of AGENT_ERRORS.

  • "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_id is behind cs2.latest_build_id. The node takes launches again once it has updated. A node whose auto_update is false never refuses with this.
  • "cs2_not_installed": CS2 is not installed on the node, so its cs2.build_id is null. The node takes launches once an update_cs2 has installed it.
  • "node_unavailable": The node reports unavailable for a reason other than maintenance.
  • "slots_held": An operation that needs every slot idle found one held: update_cs2, or a set_config that changes any key under controller.
  • "slot_held": A slot holds a server that is starting, running or stopping, and set_config would remove or re-port the slot or give its server's token to another slot, or reserve_slot asked for it. detail names the slots.
  • "unknown_slot": The node has no slot with that id.
  • "slot_token_required": set_config kept the token of a slot the node does not have yet. A new slot needs a new token.
  • "demo_header_value_required": set_config kept 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 unavailable shows it as maintenance.
  • "image_missing": The image is not on the node and the request asked for no pull. Asking again with pull fetches it.
  • "image_not_allowed": The image is not an official one, and the node's official_images_only is 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_match or restore_round within 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_round named for that server.
  • "command_blocked": console_command named a command of mp_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_stoprecord and alias while the server runs a match. A new launch restarts a match, and restore_round restores one.
  • "invalid_request": The request did not match its schema.
  • "allocation_in_use": start_server named an allocation this node is already launching or running. Its server exists or is on its way, as after a start_server sent again when its reply was slow.
  • "allocation_reused": start_server named 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.
AgentLogLevel"info" | "warn" | "error"

How serious an agent log line is.

AgentUpdateOutcomestring enum

How an update_agent ended.

  • "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.
AllocationIdstring

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.

BuildIdstring

A Steam build id, in decimal.

Must match ^\d{1,20}$

CfgNamestring ≤ 128 chars

A cfg the server runs, relative to game/csgo/cfg/ and without .cfg, such as node/<name> from the node's cfgs.

Must match ^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$

ChatColorstring enum

A chat colour name from SwiftlyS2's chat styling.

  • "white"
  • "darkred"
  • "lightpurple"
  • "green"
  • "olive"
  • "lime"
  • "red"
  • "gray"
  • "lightyellow"
  • "yellow"
  • "silver"
  • "bluegrey"
  • "lightblue"
  • "blue"
  • "darkblue"
  • "purple"
  • "magenta"
  • "lightred"
  • "gold"
  • "orange"
CommandRefusalstring enum

Why a plugin did not carry out a command, as an AgentErrorCode.

  • "no_match"
  • "not_in_warmup"
  • "team_empty"
  • "no_backup"
  • "not_live"
  • "at_halftime"
  • "command_blocked"
  • "unsupported_request"
ControllerHoststring

A host with an optional port and no scheme or path, such as cs.example.com, 192.168.0.10:3000 or [fd00::1].

Rejected when it contains whitespace, a control character, /, \, ? or #. It is also rejected unless http:// followed by the value parses as a URL that has a host, an optional port and nothing else, such as a user name.

ControllerPathstring ≤ 255 chars

A path on the controller's host. It starts with /, followed by URL path characters and percent escapes, without a query or fragment.

Must match ^\/(?:[A-Za-z0-9\-._~!$&'()*+,;=:@/]|%[0-9A-Fa-f]{2})*$

CountryCodestring

An ISO 3166-1 alpha-2 country code: DK, FR, or GB for the United Kingdom.

Must match ^[A-Z]{2}$

Cs2ImageUpdateOutcomestring enum

How an update_cs2_image ended.

  • "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.
Cs2UpdateModestring enum

How thoroughly a CS2 install or update runs.

  • "update": downloads what changed.
  • "verify": also re-hashes every file.
  • "reinstall": wipes the install volume first and downloads all of it.
Cs2UpdateOutcomestring 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 completed or failed by its exit code, or unobserved.

  • "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.
DamageCausestring enum

What caused damage or a death.

  • "player": another player dealt it, with a weapon or a grenade.
  • "bomb": the planted bomb exploded.
  • "fall": the victim fell.
  • "self": the victim's own grenade or fire.
  • "disconnect": the victim left the server, which kills a living player.
  • "other": anything else, such as a map's damage trigger or the plugin moving a player to the spectators.
DemoFileNamestring

A demo's file name, as it sits in its launch's directory, demos/<allocation_id>/ in its slot.

Must match ^[A-Za-z0-9._-]{1,156}\.dem$

DemoRemovedReasonstring enum

Why a demo is no longer on the node.

  • "uploaded": the target took it and the agent removed it.
  • "deleted": delete_demo or anything else removed it.
DemoUploadLimitinteger 1–10000

Whole megabits a second, from 1 to 10 Gbit/s.

DemoUploadUrlstring ≤ 255 chars, uri

The URL finished demos are posted to. A target that needs credentials takes them in the configured header, such as Authorization: Basic …, which the node reports only as a hash.

Rejected when the URL carries a user name or a password.

EventSeqinteger ≥ 0

An event's position among its server's events, from 0.

FireEndstring enum

How a fire ended.

  • "expired": the fire burned out, or the round closed on it.
  • "extinguished": a smoke put the fire out.
  • "smothered": the fire grenade landed inside a smoke.
GameModestring enum

The game mode a server runs, which sets the game's rules. The engine runs the mode's cfg, such as gamemode_competitive or gamemode_competitive2v2 for wingman, on every map load, and the plugin runs it again when a match goes live.

custom is Valve's mode for community content. Its cfg sets little, so the launch's exec and commands set the game.

A match plays only in casual, competitive or wingman. A server without a match runs in any mode.

  • "casual"
  • "competitive"
  • "wingman"
  • "rush"
  • "arms_race"
  • "demolition"
  • "deathmatch"
  • "custom"
GamePasswordstring ≤ 128 chars

The password players type. It is printable ASCII without spaces, " or ;, because the server would read those as separators.

Must match ^[!#-:<-~]*$

GrenadeIdinteger 0–1000000

The zero-based id of a grenade within its server, counted in throw order. A server throws far fewer than a million.

GrenadeKindstring enum

The engine class name of a grenade.

  • "flashbang"
  • "hegrenade"
  • "smokegrenade"
  • "molotov"
  • "incgrenade"
  • "decoy"
Gsltstring

A Game Server Login Token, which the servers of a slot log in to Steam with.

Must match ^[A-Za-z0-9]{10,64}$

GsltHintstring

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 ^[A-Za-z0-9]{10}$

GsltStatestring enum

Whether Steam accepts a slot's token.

  • "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.
HelloRefusedReason"invalid_hello"

Why the controller refused a hello: invalid_hello, the hello fails its schema. A controller refuses nothing else at hello: an agent on a version it does not support connects, so it can still be updated, and receives no launches.

ImageIdstring

The id Docker gives an image: sha256: and 64 hex digits.

Must match ^sha256:[0-9a-f]{64}$

ImageReferencestring

A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

ImageUpdateStepstring enum

Where an update_agent or update_cs2_image is.

  • "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.
Ipv4string

A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros.

MaintenanceOperationstring enum

The maintenance operation that runs on the node.

  • "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.
MapEndReasonstring enum

Why a map ended:

Only a played map has a winner. The controller decides what any other end means for the match.

  • "played": the map was played out.
  • "ready_timeout": ready_timeout_seconds passed in warmup, before the match started.
  • "abandoned": every rostered player left after the match began, in the knife round, the side choice or live play.
MatchIdstring

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.

MatchPhasestring enum

Where a match is.

  • "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 live once 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.
MemoryLimitinteger 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.

NodeUnavailableCodestring enum

Why a node cannot run servers, one of the values of NODE_UNAVAILABLE.

  • "maintenance": The MaintenanceOperation in operation runs. It clears when the operation ends.
  • "event_storage": The agent cannot use the local store that keeps gameplay events until the controller takes them. detail says 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.
PlayerNamestring ≤ 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 ^[^\p{Cc}]*$

PlayingSidestring enum

A playing side, for a field that never holds spec.

  • "t": terrorists.
  • "ct": counter-terrorists.
Portinteger 1–65535

A TCP or UDP port.

ReadyModestring enum

How warmup ends.

In every mode, start_match from the controller starts the match.

  • "auto": counts down once every rostered player is connected. Players have no ready commands.
  • "manual": also waits for each rostered player and each rostered spectator to type !ready, which !unready withdraws. With allow_force_ready, a captain's !forceready readies the captain's team with whichever of its players are connected, and any rostered spectator's !forceready readies the spectators.
  • "external": only start_match from the controller starts the match, and players have no commands for it.
ReplayIdstring 1–64 chars

Identifies one watcher's replay, so the frames answering it reach only that watcher.

RequestIdstring 1–64 chars

Chosen 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.

RequestTypestring enum

The type of each request the controller sends, which its reply repeats as request.

  • "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"
RoundEndReasonstring 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 unknown.

  • "unknown"
  • "target_bombed": The bomb exploded.
  • "terrorists_escaped"
  • "cts_prevent_escape"
  • "escaping_terrorists_neutralized"
  • "bomb_defused": The bomb was defused.
  • "cts_win": Every T was killed.
  • "terrorists_win": Every CT was killed.
  • "round_draw"
  • "all_hostages_rescued"
  • "target_saved": Time ran out without the bomb planted.
  • "hostages_not_rescued"
  • "terrorists_not_escaped"
  • "game_commencing"
  • "terrorists_surrender": The Ts voted to surrender. The map ends after this round.
  • "cts_surrender": The CTs voted to surrender. The map ends after this round.
  • "terrorists_planted"
  • "cts_reached_hostage"
  • "survival_win"
  • "survival_draw"
RoundNumberinteger 1–1000

A one-based round number. A map's history holds far fewer than the 1000 it allows.

ServerExitReasonstring enum

Why a server ended: one of the AgentStopReason values when the agent stopped it on its own, or one of these.

  • "idle_empty": the server stayed empty for its launch's idle_shutdown_seconds.
  • "config_rejected": the plugin refused its match config, as config_error says.
  • "start_timeout": the server was still starting 60 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.yml no longer has.
  • "requested": a stop_server from the controller stopped it.
  • "clean_exit": it ended on its own with exit code 0, as after its match or a console quit.
  • "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.
Sidestring enum

The side a player is on.

  • "t": terrorists, a playing side.
  • "ct": counter-terrorists, a playing side.
  • "spec": spectators and players on no team.
SidesModestring enum

How starting sides are decided.

  • "knife": a knife round decides them.
  • "team1_ct": team 1 starts as CT.
  • "team1_t": team 1 starts as T.
SlotIdstring

A slot's id, which is also part of the names of its containers.

Must match ^[A-Za-z0-9_-]{1,32}$

SlotLayoutReportedSlot[], ≤ 64 items

Up to 64 slots. Rejected when two slots share an id, or when two ports are equal. Every slot's port and tv_port count, so a slot's two ports differ too. It is also rejected when a port is 4500, where the agent listens for plugins.

SlotStatestring enum

What a slot is doing.

  • "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_status with ready. 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.
StartRefusalstring enum

The start_server refusals the agent sends before reserving a slot. Nothing started, so another node may take the launch.

  • "no_free_slot"
  • "maintenance_running"
  • "cs2_not_installed"
  • "cs2_outdated"
  • "node_unavailable"
  • "shutting_down"
SteamId64string

A SteamID64 as 17 decimal digits.

Must match ^\d{17}$

SteamWebApiKeystring

A Steam Web API key, which the server needs to download workshop maps.

Must match ^[A-Za-z0-9]{1,64}$

StockMapNamestring

The name of a stock map, such as de_mirage. A name of all digits would be a workshop id.

Must match ^(?!\d+$)[A-Za-z0-9_-]{1,64}$

UpdateIdstring

Chosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.

WorkshopIdstring

A Steam Workshop map's id.

Must match ^\d{1,20}$

Types

AgentError

Why a request failed. Branch on code. detail is for people.

  • codeAgentErrorCode

    What went wrong. Branch on it.

    AgentErrorCode

    The code of a failed reply, one of the values of AGENT_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_id is behind cs2.latest_build_id. The node takes launches again once it has updated. A node whose auto_update is false never refuses with this.

    • "cs2_not_installed"

      CS2 is not installed on the node, so its cs2.build_id is null. The node takes launches once an update_cs2 has installed it.

    • "node_unavailable"

      The node reports unavailable for a reason other than maintenance.

    • "slots_held"

      An operation that needs every slot idle found one held: update_cs2, or a set_config that changes any key under controller.

    • "slot_held"

      A slot holds a server that is starting, running or stopping, and set_config would remove or re-port the slot or give its server's token to another slot, or reserve_slot asked for it. detail names the slots.

    • "unknown_slot"

      The node has no slot with that id.

    • "slot_token_required"

      set_config kept the token of a slot the node does not have yet. A new slot needs a new token.

    • "demo_header_value_required"

      set_config kept 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 unavailable shows it as maintenance.

    • "image_missing"

      The image is not on the node and the request asked for no pull. Asking again with pull fetches it.

    • "image_not_allowed"

      The image is not an official one, and the node's official_images_only is 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_match or restore_round within 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_round named for that server.

    • "command_blocked"

      console_command named a command of mp_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_stoprecord and alias while the server runs a match. A new launch restarts a match, and restore_round restores one.

    • "invalid_request"

      The request did not match its schema.

    • "allocation_in_use"

      start_server named an allocation this node is already launching or running. Its server exists or is on its way, as after a start_server sent again when its reply was slow.

    • "allocation_reused"

      start_server named 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 chars

    The rest of the reason, such as Docker's message, up to 512 characters.

AgentInfo

The running agent.

  • versionstring 1–64 chars

    The agent package version.

  • imageImageReference

    The image this agent's container was created from.

    ImageReference

    A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

    string

    Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

  • image_idImageId

    The id Docker holds for that image. Two builds of one tag differ here.

    ImageId

    The 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_toRequestId

    The id of the request this answers.

    RequestId

    Chosen 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 | null

    The type of the request this answers. Null when the agent did not know it.

    RequestType

    The type of each request the controller sends, which its reply repeats as request.

    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"
  • okfalse

    The request failed.

  • errorAgentError

    Why it failed.

    AgentError

    Why a request failed. Branch on code. detail is for people.

    • codeAgentErrorCode

      What went wrong. Branch on it.

      AgentErrorCode

      The code of a failed reply, one of the values of AGENT_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_id is behind cs2.latest_build_id. The node takes launches again once it has updated. A node whose auto_update is false never refuses with this.

      • "cs2_not_installed"

        CS2 is not installed on the node, so its cs2.build_id is null. The node takes launches once an update_cs2 has installed it.

      • "node_unavailable"

        The node reports unavailable for a reason other than maintenance.

      • "slots_held"

        An operation that needs every slot idle found one held: update_cs2, or a set_config that changes any key under controller.

      • "slot_held"

        A slot holds a server that is starting, running or stopping, and set_config would remove or re-port the slot or give its server's token to another slot, or reserve_slot asked for it. detail names the slots.

      • "unknown_slot"

        The node has no slot with that id.

      • "slot_token_required"

        set_config kept the token of a slot the node does not have yet. A new slot needs a new token.

      • "demo_header_value_required"

        set_config kept 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 unavailable shows it as maintenance.

      • "image_missing"

        The image is not on the node and the request asked for no pull. Asking again with pull fetches it.

      • "image_not_allowed"

        The image is not an official one, and the node's official_images_only is 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_match or restore_round within 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_round named for that server.

      • "command_blocked"

        console_command named a command of mp_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_stoprecord and alias while the server runs a match. A new launch restarts a match, and restore_round restores one.

      • "invalid_request"

        The request did not match its schema.

      • "allocation_in_use"

        start_server named an allocation this node is already launching or running. Its server exists or is on its way, as after a start_server sent again when its reply was slow.

      • "allocation_reused"

        start_server named 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 chars

      The 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_toRequestId

    The id of the request this answers.

    RequestId

    Chosen 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"
  • oktrue

    The request succeeded.

  • dataStartServerReply

    StartServerReply

    The server that started, and the slot the agent picked for it.

    • allocation_idAllocationId

      The allocation the request launched.

      AllocationId

      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.

      string

    • slot_idSlotId

      The slot the server runs in.

      SlotId

      A slot's id, which is also part of the names of its containers.

      string

      Must match ^[A-Za-z0-9_-]{1,32}$

AgentUpdate

An agent update: the one in progress, one this agent saw end, or the last one to fail.

  • imageImageReference

    The agent image the update was to.

    ImageReference

    A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

    string

    Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

  • stepImageUpdateStep | null

    Where the update is while it runs, with the replacement still on trial in switching. Null once it ended.

    ImageUpdateStep

    Where an update_agent or update_cs2_image is.

    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 | null

    How the update ended. Null while it runs.

    AgentUpdateOutcome

    How an update_agent ended.

    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 | null

    Why 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 charsoptional

    The 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}]+$

  • coloranyoptional

    The tag's colour. When absent, blue.

ConsoleCommandReply

The server the command was handed to.

  • allocation_idAllocationId

    The allocation the command went to.

    AllocationId

    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.

    string

ControllerAddress

Where a node dials the controller: a host with an optional port, whether it encrypts, and the paths it reaches there.

  • hostControllerHost

    The controller's host with an optional port.

    ControllerHost

    A host with an optional port and no scheme or path, such as cs.example.com, 192.168.0.10:3000 or [fd00::1].

    Rejected when it contains whitespace, a control character, /, \, ? or #. It is also rejected unless http:// followed by the value parses as a URL that has a host, an optional port and nothing else, such as a user name.

    string

  • tlsboolean

    Whether the agent dials over TLS.

  • socket_pathControllerPath

    The path of the agent socket. It is /ws/agent unless agent.yml sets controller.socket_path.

    ControllerPath

    A 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_pathControllerPath

    The path event batches are posted to. It is /api/node/events unless agent.yml sets controller.events_path.

    ControllerPath

    A 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.

  • imageImageReference

    The image the switch is to.

    ImageReference

    A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

    string

    Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

  • stepImageUpdateStep | null

    Where the switch is while it runs. Null once it ended.

    ImageUpdateStep

    Where an update_agent or update_cs2_image is.

    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 | null

    How the switch ended. Null while it runs.

    Cs2ImageUpdateOutcome

    How an update_cs2_image ended.

    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 | null

    Why the switch failed, up to 512 characters. Null unless it failed.

Cs2State

The node's game install and image.

  • build_idBuildId | null

    The installed game build. Null before the first install.

    BuildId

    A Steam build id, in decimal.

    string

    Must match ^\d{1,20}$

  • latest_build_idBuildId | null

    The 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_update is false.

    BuildId

    A Steam build id, in decimal.

    string

    Must match ^\d{1,20}$

  • imageImageReference

    The cs2 image set in agent.yml, which future launches use.

    ImageReference

    A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

    string

    Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

  • image_idImageId | null

    The local id that image resolves to on the node. Null until the image is there.

    ImageId

    The id Docker gives an image: sha256: and 64 hex digits.

    string

    Must match ^sha256:[0-9a-f]{64}$

  • updateCs2Update | null

    The 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.

    Cs2Update

    A CS2 install or update on the node: one running, or the last one to end since the agent started.

    • idUpdateId

      Identifies the update and its output, the cs2_update LogSource with this update_id.

      UpdateId

      Chosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.

      string

    • modeCs2UpdateMode

      How the update runs.

      Cs2UpdateMode

      How 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.

    • automaticboolean

      Whether the agent started the update on its own, to reach the newest public build. When false, an update_cs2 started it.

    • outcomeCs2UpdateOutcome | null

      How the update ended. Null while it runs.

      Cs2UpdateOutcome

      How a CS2 install or update ended.

      An update container that an earlier agent process started reports progress again until it exits. It ends completed or failed by its exit code, or unobserved.

      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 | null

      Why the update failed, up to 512 characters. Null unless it failed.

  • image_updateCs2ImageUpdate | null

    The switch of image that runs now, or else the last one to end since the agent started. Null before any.

    Cs2ImageUpdate

    A switch of the cs2 image: the one running now, or the last one to end since the agent started.

    • imageImageReference

      The image the switch is to.

      ImageReference

      A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

      string

      Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

    • stepImageUpdateStep | null

      Where the switch is while it runs. Null once it ended.

      ImageUpdateStep

      Where an update_agent or update_cs2_image is.

      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 | null

      How the switch ended. Null while it runs.

      Cs2ImageUpdateOutcome

      How an update_cs2_image ended.

      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 | null

      Why 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.

  • idUpdateId

    Identifies the update and its output, the cs2_update LogSource with this update_id.

    UpdateId

    Chosen by the agent for each CS2 install or update it runs or finds running. A lowercase UUID.

    string

  • modeCs2UpdateMode

    How the update runs.

    Cs2UpdateMode

    How 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.

  • automaticboolean

    Whether the agent started the update on its own, to reach the newest public build. When false, an update_cs2 started it.

  • outcomeCs2UpdateOutcome | null

    How the update ended. Null while it runs.

    Cs2UpdateOutcome

    How a CS2 install or update ended.

    An update container that an earlier agent process started reports progress again until it exits. It ends completed or failed by its exit code, or unobserved.

    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 | null

    Why the update failed, up to 512 characters. Null unless it failed.

DeleteDemoReply

The demo that was removed.

  • slot_idSlotId

    The slot whose directory held it.

    SlotId

    A slot's id, which is also part of the names of its containers.

    string

    Must match ^[A-Za-z0-9_-]{1,32}$

  • file_nameDemoFileName

    The file removed.

    DemoFileName

    A 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_idSlotId

    The slot whose directory holds it.

    SlotId

    A slot's id, which is also part of the names of its containers.

    string

    Must match ^[A-Za-z0-9_-]{1,32}$

  • file_nameDemoFileName

    The file's name.

    DemoFileName

    A 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 ≥ 0

    Bytes in the file.

  • modified_atinteger

    Unix milliseconds when the file was last written.

  • recordingboolean

    Whether its server is still recording it. While it is, the demo grows with each report and is neither uploaded nor deleted.

  • uploadingboolean

    Whether it is uploading now. demo_progress reports how far, and a node uploads one demo at a time.

  • upload_errorstring 1–512 chars | null

    Why 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.

  • urlDemoUploadUrl

    The upload target.

    DemoUploadUrl

    The URL finished demos are posted to. A target that needs credentials takes them in the configured header, such as Authorization: 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 | null

    A 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 the demo_upload of a hello can be sent back unchanged.

    • namestring

      The header's name, up to 64 letters, digits and -. Rejected when it is, in any case, one of host, content-type, content-length, transfer-encoding, connection, keep-alive, upgrade, expect, te, trailer, ankor-protocol, ankor-file-name, ankor-match-id and ankor-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 charsoptional

      The header's value, sent verbatim, without line breaks.

      string ≤ 1024 chars

      Must match ^[^\r\n\u0000]*$

  • limit_mbitDemoUploadLimit | null

    Megabits a second an upload may send while a game server runs on the node. Null for no limit.

    DemoUploadLimit

    Whole 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 items

    The servers with the oldest stuck events, oldest first, up to 100.

    StuckServer

    A server whose events wait on the node.

    • allocation_idAllocationId

      The server whose plugin sent them.

      AllocationId

      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.

      string

    • pendinginteger ≥ 1

      Events of the server still queued on the node.

  • server_countinteger ≥ 0

    Servers with stuck events on the node, those past servers too.

  • event_countinteger ≥ 0

    Events that every stuck server holds together.

  • reasonstring 1–512 chars | null

    Why 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.

GetServerStatusReply

The server asked about, and its state as its plugin reports it now.

  • map_namestring ≤ 64 chars

    The map the server is on, up to 64 characters.

  • matchobject | null

    The loaded match and its team state. Null on a server without a match or after a refused config.

    • match_idMatchId | null

      The match_id the 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.

      MatchId

      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.

      string

    • phaseMatchPhase

      Where the match is.

      MatchPhase

      Where 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 live once 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_sidePlayingSide

      Team 1's current side.

      PlayingSide

      A playing side, for a field that never holds spec.

      string enum

      • "t"

        terrorists.

      • "ct"

        counter-terrorists.

    • team2_sidePlayingSide

      Team 2's current side, always the other side, sent so a reader shows each team without deriving it.

      PlayingSide

      A playing side, for a field that never holds spec.

      string enum

      • "t"

        terrorists.

      • "ct"

        counter-terrorists.

    • team1_scoreinteger ≥ 0

      Team 1's score.

    • team2_scoreinteger ≥ 0

      Team 2's score.

  • playersobject[], ≤ 64 items

    Everyone connected, up to 64.

    • steam_idSteamId64

      The player's SteamID64.

      SteamId64

      A SteamID64 as 17 decimal digits.

      string

      Must match ^\d{17}$

    • namePlayerName

      The player's name.

      PlayerName

      A 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}]*$

    • sideSide

      The player's side.

      Side

      The 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 | null

    Why 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.

  • readyboolean

    Whether 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 stays true once set.

    CS2 does not fall back to an anonymous logon when Steam refuses its token, so true also indicates that Steam accepted the GSLT and that its last use can be updated.

  • server_steam_idSteamId64 | null

    The 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_id without its dashes to sv_tags, which that list shows. Null until ready.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

  • allocation_idAllocationId

    The allocation the request asked about.

    AllocationId

    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.

    string

HostInfo

The machine the agent runs on.

  • cpu_countinteger ≥ 1

    Logical CPUs the agent can use.

  • os_namestring 1–256 chars | null

    The host's os-release PRETTY_NAME, up to 256 characters. Null when unreadable.

  • kernelstring 1–256 chars

    The 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–65535

    The engine's item definition index.

  • quantityinteger 1–20

    Items of this kind that the player holds, up to ten times the stock limit of 2 flashbangs.

  • unit_valueinteger 0–52000

    Dollars 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–240optional

    Rounds in regulation, as mp_maxrounds. When absent, 24.

  • overtimebooleanoptional

    Whether a tie after regulation goes to overtime, as mp_overtime_enable. When absent, true.

  • overtime_max_roundsinteger 1–60optional

    Rounds in one overtime, both halves together, as mp_overtime_maxrounds. When absent, 6.

  • friendly_firebooleanoptional

    Whether bullets and melee hurt teammates. Grenades always do. When absent, true.

LogLine

One log line.

  • atinteger ≥ 0

    Unix milliseconds when the agent logged or read the line.

  • levelAgentLogLevel | null

    How serious the agent rated the line. Null for server and CS2 update output.

    AgentLogLevel

    How serious an agent log line is.

    "info" | "warn" | "error"

  • linestring ≤ 2000 chars

    The 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 ;, then m. 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"

LogSourceSummary

One source the agent keeps.

  • sourceLogSource

    Which log.

    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"
  • line_countinteger ≥ 0

    Lines kept of it.

  • last_line_atinteger ≥ 0 | null

    Unix milliseconds of the newest line kept of it. Null for a source with no lines kept.

  • endedboolean

    Whether the source has ended, as a server whose slot went idle or a CS2 install or update that ended. Always false for 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 | nulloptional

    The match's id, which names its demos and which slot_status and get_server_status report. Null for none, and when absent.

    MatchId

    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.

    string

  • send_statisticsbooleanoptional

    Whether the plugin sends the match's gameplay events, its round_backup among them, which the agent uploads in an event_batch. When absent, false.

    Every match reports its phase_change and score. A match without statistics sends each round_backup in backup instead, and a match with statistics only in its events.

  • rosterRoster

    Who may join, and on which team.

    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.

    • team1RosterTeam

      Team 1, which events number 1.

      RosterTeam

      One team of a Roster.

      • namestring ≤ 30 chars

        The 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 \S

      • playersSteamId64[], ≥ 1 items

        The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

        SteamId64

        A SteamID64 as 17 decimal digits.

        string

        Must match ^\d{17}$

    • team2RosterTeam

      Team 2, which events number 2.

      RosterTeam

      One team of a Roster.

      • namestring ≤ 30 chars

        The 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 \S

      • playersSteamId64[], ≥ 1 items

        The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

        SteamId64

        A SteamID64 as 17 decimal digits.

        string

        Must match ^\d{17}$

    • spectatorsSteamId64[], ≤ 2 items

      Players allowed in as spectators, who watch with the game's free camera, up to 2. When ready_mode is manual, they ready up too.

      SteamId64

      A SteamID64 as 17 decimal digits.

      string

      Must match ^\d{17}$

  • sidesSidesMode

    How starting sides are decided.

    SidesMode

    How 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–300optional

    Seconds the knife winners' captain has to type !stay, !swap, !ct or !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_modeanyoptional

    How warmup ends. When absent, auto.

  • spectators_ready_upbooleanoptional

    Whether, 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_readybooleanoptional

    Whether, 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 | nulloptional

    Seconds 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 with external, where only the controller starts the match.

  • record_demoboolean

    Whether GOTV records the live match as a demo.

  • rulesanyoptional

    The rules the match is played under, applied over those of the game mode. When absent, every rule takes its default.

  • restoreRestoreFile | nulloptional

    A live round to play on from, taken from the round_backup that 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 sides says, and after warmup it loads the backup instead of going live. Team 1 takes the restore's team1_side, the round and the scores come from the file, and the restore's rules replace the match's rules. The agent writes file to the slot for mp_backup_restore_load_file.

    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_sidePlayingSide

      Team 1's side in that round. On a launch, the plugin seats players by it through warmup, before the load.

      PlayingSide

      A playing side, for a field that never holds spec.

      string enum

      • "t"

        terrorists.

      • "ct"

        counter-terrorists.

    • rulesMatchRules

      The rules that the map was played under. A restore plays on under these rules instead of the rules of its launch.

      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–240

        Rounds in regulation, as mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.

      • overtimeboolean

        Whether a tie after regulation goes to overtime, as mp_overtime_enable.

      • overtime_max_roundsinteger 1–60

        Rounds in one overtime, both halves together, as mp_overtime_maxrounds. The bound is 60, ten times the stock 6.

      • friendly_fireboolean

        Whether bullets and melee hurt teammates. Grenades always do.

    • filestring 1–524288 chars

      The 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_file reads 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–240

    Rounds in regulation, as mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.

  • overtimeboolean

    Whether a tie after regulation goes to overtime, as mp_overtime_enable.

  • overtime_max_roundsinteger 1–60

    Rounds in one overtime, both halves together, as mp_overtime_maxrounds. The bound is 60, ten times the stock 6.

  • friendly_fireboolean

    Whether bullets and melee hurt teammates. Grenades always do.

NodeSettings

The part of agent.yml that the controller may edit, as hello reports it applied.

  • slotsSlotLayout

    The slots servers run in.

    SlotLayout

    Up to 64 slots. Rejected when two slots share an id, or when two ports are equal. Every slot's port and tv_port count, so a slot's two ports differ too. It is also rejected when a port is 4500, where the agent listens for plugins.

    ReportedSlot

    A slot as the agent reports it, with the last ten characters of its token in place of the token.

    • idSlotId

      The slot's id, 1 to 32 letters, digits, _ and -. It is unique on its node.

      SlotId

      A slot's id, which is also part of the names of its containers.

      string

      Must match ^[A-Za-z0-9_-]{1,32}$

    • portPort

      The game port, UDP. Every port and tv_port on a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.

      Port

      A TCP or UDP port.

      integer 1–65535

    • tv_portPort

      The GOTV port, UDP, under the same rules as port.

      Port

      A TCP or UDP port.

      integer 1–65535

    • gslt_hintGsltHint

      The last ten characters of the slot's token.

      GsltHint

      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.

      string

      Must match ^[A-Za-z0-9]{10}$

  • pinned_ipIpv4 | null

    The address players connect to. Null for the node's public_ip. Servers already running keep the address their launch announced.

    Ipv4

    A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros.

    string

  • controllerControllerAddress

    Where the agent dials the controller. It redials when any part of it changes.

    ControllerAddress

    Where a node dials the controller: a host with an optional port, whether it encrypts, and the paths it reaches there.

    • hostControllerHost

      The controller's host with an optional port.

      ControllerHost

      A host with an optional port and no scheme or path, such as cs.example.com, 192.168.0.10:3000 or [fd00::1].

      Rejected when it contains whitespace, a control character, /, \, ? or #. It is also rejected unless http:// followed by the value parses as a URL that has a host, an optional port and nothing else, such as a user name.

      string

    • tlsboolean

      Whether the agent dials over TLS.

    • socket_pathControllerPath

      The path of the agent socket. It is /ws/agent unless agent.yml sets controller.socket_path.

      ControllerPath

      A 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_pathControllerPath

      The path event batches are posted to. It is /api/node/events unless agent.yml sets controller.events_path.

      ControllerPath

      A 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_updateboolean

    Whether 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 on cs2.build_id until an update_cs2, and accepts launches while it is behind cs2.latest_build_id, so players on a newer client cannot join its servers. Its images then change only with update_agent and update_cs2_image.

  • demo_uploadReportedDemoUpload | null

    Where the agent uploads demos. Null for no uploads, which keeps demos on the node. The header's value is reported as its SHA-256.

    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.

    • urlDemoUploadUrl

      The upload target.

      DemoUploadUrl

      The URL finished demos are posted to. A target that needs credentials takes them in the configured header, such as Authorization: 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 | null

      The header sent with each upload. Null for none.

      • namestring

        The header's name, up to 64 letters, digits and -. Rejected when it is, in any case, one of host, content-type, content-length, transfer-encoding, connection, keep-alive, upgrade, expect, te, trailer, ankor-protocol, ankor-file-name, ankor-match-id and ankor-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_sha256string

        The 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 | null

      Megabits a second an upload may send while a game server runs on the node. Null for no limit.

      DemoUploadLimit

      Whole megabits a second, from 1 to 10 Gbit/s.

      integer 1–10000

  • memory_mbMemoryLimit | null

    MiB 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.

    MemoryLimit

    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.

    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 itemsoptional

    The slots servers run in. SlotEdit describes their tokens.

    Rejected when two slots share an id or a gslt, or when two ports are equal. Every slot's port and tv_port count, 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.

    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.

    • idSlotId

      The slot's id, 1 to 32 letters, digits, _ and -. It is unique on its node.

      SlotId

      A slot's id, which is also part of the names of its containers.

      string

      Must match ^[A-Za-z0-9_-]{1,32}$

    • portPort

      The game port, UDP. Every port and tv_port on a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.

      Port

      A TCP or UDP port.

      integer 1–65535

    • tv_portPort

      The GOTV port, UDP, under the same rules as port.

      Port

      A TCP or UDP port.

      integer 1–65535

    • gsltanyoptional

      The slot's new token. Without one, the slot keeps the token it has.

  • pinned_ipIpv4 | nulloptional

    The address players connect to. Null for the node's public_ip. Servers already running keep the address their launch announced.

    Ipv4

    A dotted IPv4 address. Rejected unless it is four numbers from 0 to 255 joined by dots, each without leading zeros.

    string

  • controlleranyoptional

    Where the agent dials the controller. It redials when any part of it changes.

  • auto_updatebooleanoptional

    Whether 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 on cs2.build_id until an update_cs2, and accepts launches while it is behind cs2.latest_build_id, so players on a newer client cannot join its servers. Its images then change only with update_agent and update_cs2_image.

  • demo_uploadDemoUploadEdit | nulloptional

    Where the agent uploads demos. Null for no uploads, which keeps demos on the node. DemoUploadEdit describes its header.

    DemoUploadEdit

    A demo upload as set_config sets it. A header without its value keeps the value the node has.

    • urlDemoUploadUrl

      The upload target.

      DemoUploadUrl

      The URL finished demos are posted to. A target that needs credentials takes them in the configured header, such as Authorization: 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 | null

      A 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 the demo_upload of a hello can be sent back unchanged.

      • namestring

        The header's name, up to 64 letters, digits and -. Rejected when it is, in any case, one of host, content-type, content-length, transfer-encoding, connection, keep-alive, upgrade, expect, te, trailer, ankor-protocol, ankor-file-name, ankor-match-id and ankor-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 charsoptional

        The header's value, sent verbatim, without line breaks.

        string ≤ 1024 chars

        Must match ^[^\r\n\u0000]*$

    • limit_mbitDemoUploadLimit | null

      Megabits a second an upload may send while a game server runs on the node. Null for no limit.

      DemoUploadLimit

      Whole megabits a second, from 1 to 10 Gbit/s.

      integer 1–10000

  • memory_mbMemoryLimit | nulloptional

    MiB 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.

    MemoryLimit

    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.

    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.

  • codeNodeUnavailableCode

    NodeUnavailableCode

    Why a node cannot run servers, one of the values of NODE_UNAVAILABLE.

    string enum

    • "maintenance"

      The MaintenanceOperation in operation runs. It clears when the operation ends.

    • "event_storage"

      The agent cannot use the local store that keeps gameplay events until the controller takes them. detail says 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 | null

    The maintenance operation that runs when code is maintenance. Null for any other code.

    MaintenanceOperation

    The 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 chars

    The 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_idSteamId64

    The player's SteamID64.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

  • namePlayerName

    The player's name when the event happened.

    PlayerName

    A 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}]*$

  • sideSide

    The side that the player was on.

    Side

    The 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 | null

    The roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.

    TeamNumber

    A team of the Roster, team 1 or team 2, whichever side it plays.

    One of 2:

    1

  • positionPlayerPosition

    Where the player stood and looked.

    PlayerPosition

    Where a player stood, as a WorldPos, and where the player looked.

    • xnumber -32768–32768

      Engine units along the map's x axis.

    • ynumber -32768–32768

      Engine units along the map's y axis.

    • znumber -32768–32768

      Engine units along the map's z axis, the height.

    • pitchnumber -90–90

      Degrees of eye pitch. A positive pitch looks down.

    • yawnumber -360–360

      Degrees of eye yaw, counter-clockwise from the +x axis.

PlayerAt

A PlayerRef with the position of the player when the event happened.

  • steam_idSteamId64

    The player's SteamID64.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

  • namePlayerName

    The player's name when the event happened.

    PlayerName

    A 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}]*$

  • sideSide

    The side that the player was on.

    Side

    The 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 | null

    The roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.

    TeamNumber

    A team of the Roster, team 1 or team 2, whichever side it plays.

    One of 2:

    1

  • positionPlayerPosition | null

    Where the player stood and looked. Null when the player had no body in the world.

    PlayerPosition

    Where a player stood, as a WorldPos, and where the player looked.

    • xnumber -32768–32768

      Engine units along the map's x axis.

    • ynumber -32768–32768

      Engine units along the map's y axis.

    • znumber -32768–32768

      Engine units along the map's z axis, the height.

    • pitchnumber -90–90

      Degrees of eye pitch. A positive pitch looks down.

    • yawnumber -360–360

      Degrees 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 items

    Weapons, grenades and other items held, up to 64.

    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–65535

      The engine's item definition index.

    • quantityinteger 1–20

      Items of this kind that the player holds, up to ten times the stock limit of 2 flashbangs.

    • unit_valueinteger 0–52000

      Dollars that one item costs, up to ten times the dearest stock item, the M249 at 5,200.

  • armorinteger 0–1000

    Armor points, up to 1000, ten times the stock 100.

  • helmetboolean

    Whether the armor includes a helmet.

  • defuse_kitboolean

    Whether the player carries a defuse kit.

PlayerPosition

Where a player stood, as a WorldPos, and where the player looked.

  • xnumber -32768–32768

    Engine units along the map's x axis.

  • ynumber -32768–32768

    Engine units along the map's y axis.

  • znumber -32768–32768

    Engine units along the map's z axis, the height.

  • pitchnumber -90–90

    Degrees of eye pitch. A positive pitch looks down.

  • yawnumber -360–360

    Degrees of eye yaw, counter-clockwise from the +x axis.

PlayerRef

A player as the event saw them.

  • steam_idSteamId64

    The player's SteamID64.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

  • namePlayerName

    The player's name when the event happened.

    PlayerName

    A 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}]*$

  • sideSide

    The side that the player was on.

    Side

    The 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 | null

    The roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.

    TeamNumber

    A team of the Roster, team 1 or team 2, whichever side it plays.

    One of 2:

    1

PlayerShots

The shots that one player fired over a round.

  • playerPlayerRef

    The player.

    PlayerRef

    A player as the event saw them.

    • steam_idSteamId64

      The player's SteamID64.

      SteamId64

      A SteamID64 as 17 decimal digits.

      string

      Must match ^\d{17}$

    • namePlayerName

      The player's name when the event happened.

      PlayerName

      A 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}]*$

    • sideSide

      The side that the player was on.

      Side

      The 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 | null

      The roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.

      TeamNumber

      A team of the Roster, team 1 or team 2, whichever side it plays.

      One of 2:

      1

  • weaponsWeaponShots[], 1–4096 items

    Each weapon that the player fired, once each.

    WeaponShots

    The shots that a player fired with one weapon over a round. Rejected unless shots equals the number of ticks.

    • weaponWeapon

      The weapon fired.

      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 | null

        The item definition index, a 16-bit unsigned integer. Null when the item has none.

      • fallbackstring | null

        The engine class name of an item without an index. Null when id is set, or when the engine named no weapon either.

        string

        Must match ^[A-Za-z0-9_]{1,64}$

    • shotsinteger 1–4096

      Shots fired, which equals the number of ticks.

    • ticksnumber ≥ 0[], 1–4096 items

      The server tick of each shot.

PluginToControllerMessage

Any gameplay event.

ReadyTeam

A team's players when the ready deadline passed.

  • connectedinteger 0–64

    Rostered players of the team on the server.

  • readyboolean

    Whether 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.

  • urlDemoUploadUrl

    The upload target.

    DemoUploadUrl

    The URL finished demos are posted to. A target that needs credentials takes them in the configured header, such as Authorization: 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 | null

    The header sent with each upload. Null for none.

    • namestring

      The header's name, up to 64 letters, digits and -. Rejected when it is, in any case, one of host, content-type, content-length, transfer-encoding, connection, keep-alive, upgrade, expect, te, trailer, ankor-protocol, ankor-file-name, ankor-match-id and ankor-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_sha256string

      The 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 | null

    Megabits a second an upload may send while a game server runs on the node. Null for no limit.

    DemoUploadLimit

    Whole 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.

  • idSlotId

    The slot's id, 1 to 32 letters, digits, _ and -. It is unique on its node.

    SlotId

    A slot's id, which is also part of the names of its containers.

    string

    Must match ^[A-Za-z0-9_-]{1,32}$

  • portPort

    The game port, UDP. Every port and tv_port on a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.

    Port

    A TCP or UDP port.

    integer 1–65535

  • tv_portPort

    The GOTV port, UDP, under the same rules as port.

    Port

    A TCP or UDP port.

    integer 1–65535

  • gslt_hintGsltHint

    The last ten characters of the slot's token.

    GsltHint

    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.

    string

    Must match ^[A-Za-z0-9]{10}$

ReserveSlotReply

The slot that is reserved.

  • slot_idSlotId

    The slot reserved.

    SlotId

    A 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 ≥ 0

    Unix milliseconds when the tick was taken.

  • diskResourceUsage | null

    The filesystem holding the node's data directory, as df counts it. Null when it could not be read.

    ResourceUsage

    A capacity and how much of it is in use, in bytes.

    • capinteger ≥ 0

      Bytes of capacity.

    • usedinteger ≥ 0

      Bytes in use.

  • memoryResourceUsage

    The memory the node may use, and how much it uses. Cache the kernel can free counts as free.

    ResourceUsage

    A capacity and how much of it is in use, in bytes.

    • capinteger ≥ 0

      Bytes of capacity.

    • usedinteger ≥ 0

      Bytes in use.

  • cpuobject | null

    How busy the node's CPUs are, in percent of all the CPUs it may use. Null in the first tick.

    • maxinteger 0–100

      Percent busy at the busiest moment of the tick.

    • averageinteger 0–100

      Percent busy on average over the tick.

ResourceUsage

A capacity and how much of it is in use, in bytes.

  • capinteger ≥ 0

    Bytes of capacity.

  • usedinteger ≥ 0

    Bytes 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_sidePlayingSide

    Team 1's side in that round. On a launch, the plugin seats players by it through warmup, before the load.

    PlayingSide

    A playing side, for a field that never holds spec.

    string enum

    • "t"

      terrorists.

    • "ct"

      counter-terrorists.

  • rulesMatchRules

    The rules that the map was played under. A restore plays on under these rules instead of the rules of its launch.

    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–240

      Rounds in regulation, as mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.

    • overtimeboolean

      Whether a tie after regulation goes to overtime, as mp_overtime_enable.

    • overtime_max_roundsinteger 1–60

      Rounds in one overtime, both halves together, as mp_overtime_maxrounds. The bound is 60, ten times the stock 6.

    • friendly_fireboolean

      Whether bullets and melee hurt teammates. Grenades always do.

  • filestring 1–524288 chars

    The 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_file reads 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_idAllocationId

    The allocation the restore went to.

    AllocationId

    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.

    string

  • roundRoundNumber

    The round it loads.

    RoundNumber

    A 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.

  • team1RosterTeam

    Team 1, which events number 1.

    RosterTeam

    One team of a Roster.

    • namestring ≤ 30 chars

      The 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 \S

    • playersSteamId64[], ≥ 1 items

      The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

      SteamId64

      A SteamID64 as 17 decimal digits.

      string

      Must match ^\d{17}$

  • team2RosterTeam

    Team 2, which events number 2.

    RosterTeam

    One team of a Roster.

    • namestring ≤ 30 chars

      The 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 \S

    • playersSteamId64[], ≥ 1 items

      The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

      SteamId64

      A SteamID64 as 17 decimal digits.

      string

      Must match ^\d{17}$

  • spectatorsSteamId64[], ≤ 2 items

    Players allowed in as spectators, who watch with the game's free camera, up to 2. When ready_mode is manual, they ready up too.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

RosterTeam

One team of a Roster.

  • namestring ≤ 30 chars

    The 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 \S

  • playersSteamId64[], ≥ 1 items

    The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

RoundPlayer

The state and money of a player when the plugin sampled the round. Money is in dollars.

  • playerPlayerRef

    The player sampled.

    PlayerRef

    A player as the event saw them.

    • steam_idSteamId64

      The player's SteamID64.

      SteamId64

      A SteamID64 as 17 decimal digits.

      string

      Must match ^\d{17}$

    • namePlayerName

      The player's name when the event happened.

      PlayerName

      A 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}]*$

    • sideSide

      The side that the player was on.

      Side

      The 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 | null

      The roster team of the player, which the plugin looks up in its roster. Null for spectators and unknown players.

      TeamNumber

      A team of the Roster, team 1 or team 2, whichever side it plays.

      One of 2:

      1

  • aliveboolean

    Whether the player was alive when sampled.

  • equipment_valueinteger 0–65535

    Dollars of equipment that the player carried, the engine's figure.

  • cashinteger 0–65535

    Dollars in hand when sampled.

  • start_cashinteger 0–65535

    Dollars in hand at the start of the round.

  • cash_spentinteger 0–131070

    Dollars spent this round by the time of the sample.

ServerExit

A server whose container is gone, and why.

  • slot_idSlotId

    The slot it ran in.

    SlotId

    A slot's id, which is also part of the names of its containers.

    string

    Must match ^[A-Za-z0-9_-]{1,32}$

  • allocation_idAllocationId

    The server that ended.

    AllocationId

    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.

    string

  • reasonServerExitReason

    Why it ended.

    ServerExitReason

    Why a server ended: one of the AgentStopReason values 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_error says.

    • "start_timeout"

      the server was still starting 60 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.yml no longer has.

    • "requested"

      a stop_server from the controller stopped it.

    • "clean_exit"

      it ended on its own with exit code 0, as after its match or a console quit.

    • "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 | null

    The container's exit code. Null when the agent did not see one.

  • detailstring 1–512 chars | null

    What the reason does not say, up to 512 characters: the plugin's config_error for config_rejected, and Docker's message for launch_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_id is set, because a match plays a stock map.
  • when the roster's players and spectators together outnumber max_players.
  • when game_mode is not casual, competitive or wingman.
  • when ready_mode is external and ready_timeout_seconds is set.
  • hostnamestring | nulloptional

    The 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 | "" | nulloptional

    The 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:

    SteamWebApiKey

    A Steam Web API key, which the server needs to download workshop maps.

    string

    Must match ^[A-Za-z0-9]{1,64}$

  • game_passwordGamePassword | nulloptional

    The password players type to join. Null or empty for none, and null when absent.

    GamePassword

    The password players type. It is printable ASCII without spaces, " or ;, because the server would read those as separators.

    string ≤ 128 chars

    Must match ^[!#-:<-~]*$

  • chat_taganyoptional

    The tag in front of the plugin's chat lines. When absent, each of its fields takes its default.

  • game_modeanyoptional

    The game mode, which sets the game's rules. When absent, competitive.

  • max_playersinteger 1–64

    The player capacity of the server, as -maxplayers. A match's roster, players and spectators together, must fit.

  • workshop_idWorkshopId | nulloptional

    A workshop map to play. Null for a stock map, and when absent. A match plays a stock map.

    WorkshopId

    A Steam Workshop map's id.

    string

    Must match ^\d{1,20}$

  • map_nameStockMapName | null

    The stock map to play, required without workshop_id. With a workshop_id, the server boots this map before it switches to the workshop map. Null for de_dust2 in that case.

    StockMapName

    The 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 | nulloptional

    GOTV 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 0 and a random tv_password that 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 | nulloptional

      The GOTV password, as tv_password, apart from game_password. Null or empty for none, and null when absent.

      GamePassword

      The 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 ≥ 0

      Seconds GOTV runs behind the game.

  • idle_shutdown_secondsinteger ≥ 1 | null

    Seconds the server may stay empty once its slot is running before the agent stops it, reporting idle_empty as its ServerExitReason. Null for a server that runs until stopped. Hibernation must stay off. See When the cfgs run.

  • execCfgName[], ≤ 16 items

    Cfgs 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.

    CfgName

    A cfg the server runs, relative to game/csgo/cfg/ and without .cfg, such as node/<name> from the node's cfgs.

    string ≤ 128 chars

    Must match ^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$

  • commandsstring[], ≤ 128 items

    Console lines that the server runs after exec, in order and at the same moments, so they override exec and rules. A match server leaves out a line that names a command of mp_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_stoprecord and alias. Rejected when a line holds an ASCII control character, such as a line break, which would end the console line.

  • matchMatchConfig | nulloptional

    The 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, commands and the node's plugins set the game.

    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 | nulloptional

      The match's id, which names its demos and which slot_status and get_server_status report. Null for none, and when absent.

      MatchId

      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.

      string

    • send_statisticsbooleanoptional

      Whether the plugin sends the match's gameplay events, its round_backup among them, which the agent uploads in an event_batch. When absent, false.

      Every match reports its phase_change and score. A match without statistics sends each round_backup in backup instead, and a match with statistics only in its events.

    • rosterRoster

      Who may join, and on which team.

      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.

      • team1RosterTeam

        Team 1, which events number 1.

        RosterTeam

        One team of a Roster.

        • namestring ≤ 30 chars

          The 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 \S

        • playersSteamId64[], ≥ 1 items

          The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

          SteamId64

          A SteamID64 as 17 decimal digits.

          string

          Must match ^\d{17}$

      • team2RosterTeam

        Team 2, which events number 2.

        RosterTeam

        One team of a Roster.

        • namestring ≤ 30 chars

          The 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 \S

        • playersSteamId64[], ≥ 1 items

          The players of the team, captain first. The captain may use !forceready and picks the side after the knife round. A team has at least one player, so it always has a captain.

          SteamId64

          A SteamID64 as 17 decimal digits.

          string

          Must match ^\d{17}$

      • spectatorsSteamId64[], ≤ 2 items

        Players allowed in as spectators, who watch with the game's free camera, up to 2. When ready_mode is manual, they ready up too.

        SteamId64

        A SteamID64 as 17 decimal digits.

        string

        Must match ^\d{17}$

    • sidesSidesMode

      How starting sides are decided.

      SidesMode

      How 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–300optional

      Seconds the knife winners' captain has to type !stay, !swap, !ct or !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_modeanyoptional

      How warmup ends. When absent, auto.

    • spectators_ready_upbooleanoptional

      Whether, 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_readybooleanoptional

      Whether, 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 | nulloptional

      Seconds 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 with external, where only the controller starts the match.

    • record_demoboolean

      Whether GOTV records the live match as a demo.

    • rulesanyoptional

      The rules the match is played under, applied over those of the game mode. When absent, every rule takes its default.

    • restoreRestoreFile | nulloptional

      A live round to play on from, taken from the round_backup that 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 sides says, and after warmup it loads the backup instead of going live. Team 1 takes the restore's team1_side, the round and the scores come from the file, and the restore's rules replace the match's rules. The agent writes file to the slot for mp_backup_restore_load_file.

      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_sidePlayingSide

        Team 1's side in that round. On a launch, the plugin seats players by it through warmup, before the load.

        PlayingSide

        A playing side, for a field that never holds spec.

        string enum

        • "t"

          terrorists.

        • "ct"

          counter-terrorists.

      • rulesMatchRules

        The rules that the map was played under. A restore plays on under these rules instead of the rules of its launch.

        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–240

          Rounds in regulation, as mp_maxrounds, up to 240. MR12 is 24 and MR15 is 30.

        • overtimeboolean

          Whether a tie after regulation goes to overtime, as mp_overtime_enable.

        • overtime_max_roundsinteger 1–60

          Rounds in one overtime, both halves together, as mp_overtime_maxrounds. The bound is 60, ten times the stock 6.

        • friendly_fireboolean

          Whether bullets and melee hurt teammates. Grenades always do.

      • filestring 1–524288 chars

        The 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_file reads 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.

  • idSlotId

    The slot's id, 1 to 32 letters, digits, _ and -. It is unique on its node.

    SlotId

    A slot's id, which is also part of the names of its containers.

    string

    Must match ^[A-Za-z0-9_-]{1,32}$

  • portPort

    The game port, UDP. Every port and tv_port on a node is different, free on the host, and not 4500, the port the agent listens on for plugins. Host networking explains why.

    Port

    A TCP or UDP port.

    integer 1–65535

  • tv_portPort

    The GOTV port, UDP, under the same rules as port.

    Port

    A TCP or UDP port.

    integer 1–65535

  • gsltanyoptional

    The 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_idSlotId

    The slot this describes.

    SlotId

    A slot's id, which is also part of the names of its containers.

    string

    Must match ^[A-Za-z0-9_-]{1,32}$

  • stateSlotState

    What the slot is doing.

    SlotState

    What 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_status with ready. 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 | null

    The server on the slot. Null when the slot is idle.

    AllocationId

    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.

    string

  • match_idMatchId | null

    The server's match id. Null for a server without a match or a match launched without one.

    MatchId

    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.

    string

  • plugin_onlineboolean

    Whether the server's plugin is connected to the agent. get_server_status, console_command, restore_round and start_match reach it only while it is.

  • gslt_stateGsltState

    Whether Steam accepts the slot's token. start_server never picks a slot whose token is invalid.

    GsltState

    Whether 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.

  • reservedboolean

    Whether the idle slot is kept from launches, while the controller replaces its token with reserve_slot or while the agent logs its token on to Steam.

  • server_steam_idSteamId64 | null

    The server_steam_id that the server's plugin reported. The agent sends a slot_status as soon as it learns the ID. Null when the slot is idle or until the server is ready.

    SteamId64

    A SteamID64 as 17 decimal digits.

    string

    Must match ^\d{17}$

StartMatchReply

The server the start was handed to.

  • allocation_idAllocationId

    The allocation the start went to.

    AllocationId

    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.

    string

StartServerReply

The server that started, and the slot the agent picked for it.

  • allocation_idAllocationId

    The allocation the request launched.

    AllocationId

    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.

    string

  • slot_idSlotId

    The slot the server runs in.

    SlotId

    A 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_idAllocationId

    The allocation the request stopped.

    AllocationId

    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.

    string

StuckServer

A server whose events wait on the node.

  • allocation_idAllocationId

    The server whose plugin sent them.

    AllocationId

    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.

    string

  • pendinginteger ≥ 1

    Events 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

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.

  • imageImageReference

    The agent image the update is to.

    ImageReference

    A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

    string

    Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

  • stepstring enum

    The 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.

  • imageImageReference

    The cs2 image the switch is to.

    ImageReference

    A Docker image reference, as cs2_image and agent_image in agent.yml hold it.

    string

    Must match ^[A-Za-z0-9][A-Za-z0-9._\-/:@]{0,254}$

  • stepImageUpdateStep

    The next step.

    ImageUpdateStep

    Where an update_agent or update_cs2_image is.

    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_idUpdateId

    The update's id, as cs2.update.id, cs2_update_progress and its log source carry it.

    UpdateId

    Chosen 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 | null

    The item definition index, a 16-bit unsigned integer. Null when the item has none.

  • fallbackstring | null

    The engine class name of an item without an index. Null when id is 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.

  • weaponWeapon

    The weapon fired.

    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 | null

      The item definition index, a 16-bit unsigned integer. Null when the item has none.

    • fallbackstring | null

      The engine class name of an item without an index. Null when id is set, or when the engine named no weapon either.

      string

      Must match ^[A-Za-z0-9_]{1,64}$

  • shotsinteger 1–4096

    Shots fired, which equals the number of ticks.

  • ticksnumber ≥ 0[], 1–4096 items

    The server tick of each shot.

WorldPos

A point in the world, in engine units.

  • xnumber -32768–32768

    Engine units along the map's x axis.

  • ynumber -32768–32768

    Engine units along the map's y axis.

  • znumber -32768–32768

    Engine units along the map's z axis, the height.