RSM Web API RESTJSON

[ Base URL: http://your-server:3000/api ]

Everything the RSM Web dashboard does goes through a JSON API on your own server. Give a script an API key and it can do the same: restart the server, look up players, run a wipe, read a log.

Authorization Bearer rsm_…

An API key from Settings → Developers → API Keys, sent with every request.

Getting started

  1. In RSM Web, open Settings → Developers → API Keys and choose Create key. You need settings manage access to see it.
  2. Name the key after what will use it, pick when it expires, and give it access only to the modules it needs.
  3. Copy the key when it is shown. It starts with rsm_ and is shown once; RSM Web keeps only a fingerprint of it, so a lost key has to be replaced.

Send the key in the Authorization header. The base URL is the address you open RSM Web on, followed by /api — port 3000 unless you changed it in config.json. The curl examples read both from environment variables, so the key stays out of your shell history:

Shell
export RSM_URL=http://your-server:3000
export RSM_KEY=rsm_your_key_here

Then ask for the server’s status. Every example shows the request as raw HTTP, headers included, and as a curl command:

GET /api/server/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/server/status" \
  -H "Authorization: Bearer $RSM_KEY"
Response
200 OK

{
  "running": true,
  "pid": 4812,
  "startedAt": "2026-09-26T08:14:03.512Z",
  "rconConnected": true
}

Changing something works the same way, with a JSON body and a Content-Type header. This kicks a player:

POST /api/players/76561198000000001/kick
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "reason": "AFK" }
curl -X POST "$RSM_URL/api/players/76561198000000001/kick" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"AFK"}'
Response
200 OK

{ "ok": true, "response": "" }

When it fails, the status says so and the body says why. The same request with a key that only has players view:

Response
403 Forbidden

{ "error": "This API key needs manage access to players", "code": "FORBIDDEN" }

Treat a key like a password. Anyone who has it can do whatever it allows. Keep it out of source control and chat logs, and revoke it the moment it leaks.

The key travels with every request, so reach RSM Web over HTTPS (behind a reverse proxy) when calling it across the internet. Browsers block calls from other websites, so use the API from scripts, bots and servers rather than from a web page.

Keys and permissions

RSM Web groups what it can do into modules — server, players, wipes and so on — and a key has its own level on each:

LevelWhat the key can do
noneNothing in that module. The default for every module you don’t pick.
viewRead: status, lists, logs, settings.
manageRead and change: start and stop, kick and ban, save settings. Includes view.

Each endpoint below shows the module and level it needs. A few more rules:

Expiry and revoking

A key expires after 30, 90 or 365 days, or never, chosen when it is made. The Developers tab shows when each key was last used and lets you rename it, change its access, or revoke it. Changes apply to the next request; the key itself stays the same, so nothing has to be redeployed. A revoked or expired key is refused with API_KEY_INVALID.

Requests and errors

Send bodies as JSON with Content-Type: application/json, except the few upload endpoints, which take a multipart form. Replies are JSON. A failed request returns a message you can show to a person, and for the cases a script should handle, a code:

401 Unauthorized  { "error": "Invalid or expired API key", "code": "API_KEY_INVALID" }
403 Forbidden  { "error": "This API key needs manage access to players", "code": "FORBIDDEN" }
403 Forbidden  { "error": "This action is not available to API keys", "code": "SESSION_REQUIRED" }
503 Service Unavailable  { "error": "RCON not connected" }
StatusCodeMeaning
401API_KEY_INVALIDThe key is wrong, expired or revoked, or the person who made it was disabled or deleted.
401AUTH_INVALIDThere is no Authorization header, what it holds isn’t an API key (keys start with rsm_), or the endpoint only accepts a signed-in person.
403FORBIDDENThe key doesn’t have the level this endpoint needs. The message says which.
403SESSION_REQUIREDOnly a person signed in to RSM Web can do this.
403LICENSE_REQUIREDRSM Web isn’t linked to an active licence. Nothing works until it is.
400Something in the request is missing or invalid; the message says what. The /api/server actions also answer 400 while RCON is down.
404The thing you asked for doesn’t exist. A few endpoints add a code, such as NOT_GENERATED for a config file the server hasn’t written yet.
409It can’t happen right now — something is already running, or it changed since you read it.
429Too many file requests; wait a moment. See below.
503The action needs RCON, and RCON isn’t connected.

The file endpoints allow 300 reads and 120 changes a minute from each address, and answer 429 past that. Nothing else has a fixed limit, but the API runs on the same machine as your Rust server: polling status every few seconds is plenty.

Data formats

Recipes

Complete jobs, each one a few requests long, in the order a script would send them.

Restart with a warning, then wait until it’s back

Needs server manage.

  1. Note when the current server process started.

    GET /api/server/status
    Authorization: Bearer rsm_your_key_here
    curl "$RSM_URL/api/server/status" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    
    {
      "running": true,
      "pid": 4812,
      "startedAt": "2026-09-26T08:14:03.512Z",
      "rconConnected": true
    }
  2. Tell players why. Rust counts the restart down in chat by itself; this adds your reason.

    POST /api/server/command
    Authorization: Bearer rsm_your_key_here
    Content-Type: application/json
    
    { "command": "say Restarting for an update in 5 minutes" }
    curl -X POST "$RSM_URL/api/server/command" \
      -H "Authorization: Bearer $RSM_KEY" \
      -H "Content-Type: application/json" \
      -d '{"command":"say Restarting for an update in 5 minutes"}'
    Response
    200 OK
    
    { "response": "" }
  3. Restart after a five-minute countdown.

    POST /api/server/restart
    Authorization: Bearer rsm_your_key_here
    Content-Type: application/json
    
    { "countdown": 300 }
    curl -X POST "$RSM_URL/api/server/restart" \
      -H "Authorization: Bearer $RSM_KEY" \
      -H "Content-Type: application/json" \
      -d '{"countdown":300}'
    Response
    200 OK
    
    { "restarting": true, "countdown": 300 }
  4. Ask for the status every 10 seconds. The server is back once it is running, RCON is connected and startedAt has changed: a new process, not the old one shutting down.

    GET /api/server/status
    Authorization: Bearer rsm_your_key_here
    curl "$RSM_URL/api/server/status" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    
    {
      "running": true,
      "pid": 5190,
      "startedAt": "2026-09-26T14:08:37.904Z",
      "rconConnected": true
    }

Find a player by name and ban them

Needs players manage.

  1. Search for the name. Names aren’t unique, so go on only if exactly one player’s name matches.

    GET /api/players?search=Rook&limit=10
    Authorization: Bearer rsm_your_key_here
    curl "$RSM_URL/api/players?search=Rook&limit=10" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    
    {
      "total": 1,
      "players": [
        {
          "steamId": "76561198000000001",
          "name": "Rook",
          "ip": "203.0.113.24:51820",
          "isAdmin": false,
          "firstSeen": "2026-08-02T19:40:11.2718830+00:00",
          "lastSeen": "2026-09-26T14:02:11.4830000+00:00",
          "totalPlaySeconds": 183420,
          "isOnline": true,
          "countryCode": "DE",
          "countryName": "Germany",
          "os": "windows",
          "isp": "Example Telecom",
          "isVpn": false,
          "steamAvatarUrl": "https://avatars.steamstatic.com/…_full.jpg",
          "vacBanned": false,
          "vacBanCount": 0,
          "gameBanCount": 0,
          "communityBanned": false,
          "daysSinceLastBan": null,
          "rustPlaytimeHours": 1412
        }
      ]
    }
  2. Ban that player by Steam ID. duration is in minutes; leave it out for a permanent ban.

    POST /api/players/76561198000000001/ban
    Authorization: Bearer rsm_your_key_here
    Content-Type: application/json
    
    { "reason": "Cheating", "duration": 1440 }
    curl -X POST "$RSM_URL/api/players/76561198000000001/ban" \
      -H "Authorization: Bearer $RSM_KEY" \
      -H "Content-Type: application/json" \
      -d '{"reason":"Cheating","duration":1440}'
    Response
    200 OK
    
    { "ok": true, "response": "" }

Record a player and download the demo

Needs demos manage. The player has to be online; to catch someone the next time they join, put them on the auto-record list with PUT /api/demos/auto/{steamId} instead.

  1. Start recording. minutes is how long to record for; leave it out to record until they leave.

    POST /api/demos/start
    Authorization: Bearer rsm_your_key_here
    Content-Type: application/json
    
    { "steamId": "76561198000000003", "minutes": 30 }
    curl -X POST "$RSM_URL/api/demos/start" \
      -H "Authorization: Bearer $RSM_KEY" \
      -H "Content-Type: application/json" \
      -d '{"steamId":"76561198000000003","minutes":30}'
    Response
    200 OK
    
    { "ok": true }
  2. Once the time is up, list that player’s demos. A recording only appears here when it has finished; until then it is under sessions in /api/demos/status.

    GET /api/demos?steamId=76561198000000003&limit=1
    Authorization: Bearer rsm_your_key_here
    curl "$RSM_URL/api/demos?steamId=76561198000000003&limit=1" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    
    {
      "demos": [
        {
          "id": 7,
          "steamId": "76561198000000003",
          "name": "Hatch",
          "file": "demos/rsm/76561198000000003/2026-09-26_13-52-07Z.dem",
          "fileName": "2026-09-26_13-52-07Z.dem",
          "startedAt": "2026-09-26T13:52:07.000Z",
          "endedAt": "2026-09-26T14:22:07.000Z",
          "durationMs": 1800000,
          "sizeBytes": 148934656,
          "reason": "timed",
          "startedBy": "admin",
          "endReason": "expired",
          "stoppedBy": "",
          "parentId": null,
          "status": "saved",
          "error": "",
          "recovered": false,
          "pinned": false,
          "note": ""
        }
      ],
      "total": 3,
      "totalBytes": 402653184
    }
  3. Ask for a ticket for that demo’s id.

    POST /api/demos/download-ticket
    Authorization: Bearer rsm_your_key_here
    Content-Type: application/json
    
    { "ids": [7] }
    curl -X POST "$RSM_URL/api/demos/download-ticket" \
      -H "Authorization: Bearer $RSM_KEY" \
      -H "Content-Type: application/json" \
      -d '{"ids":[7]}'
    Response
    200 OK
    
    {
      "ticket": "e4a17c90d3b6…",
      "filename": "76561198000000003_2026-09-26_13-52-07Z.dem",
      "archive": false,
      "fileCount": 1
    }
  4. Fetch the file with the ticket within a minute. As with any download, the ticket is the permission, so this request has no Authorization header.

    GET /api/files/download?ticket=e4a17c90d3b6…
    curl -OJ "$RSM_URL/api/files/download?ticket=$TICKET"
    Response
    200 OK
    Content-Type: application/octet-stream
    Content-Disposition: attachment; filename="76561198000000003_2026-09-26_13-52-07Z.dem"
    
    The demo itself.

Post the player count to Discord

Needs players view and config view, plus a webhook from your Discord channel’s Integrations settings. RSM Web’s own Discord bot can also show this; a webhook suits a channel the bot isn’t in.

  1. Read the player limit once. The reply is the whole configuration; the limit is maxplayers.

    GET /api/config
    Authorization: Bearer rsm_your_key_here
    curl "$RSM_URL/api/config" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    
    The configuration, with "maxplayers": 100 among it.
  2. Every five minutes, list who is online and count them.

    GET /api/players/online
    Authorization: Bearer rsm_your_key_here
    curl "$RSM_URL/api/players/online" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    
    [
      {
        "steamId": "76561198000000001",
        "name": "Rook",
        "ip": "203.0.113.24:51820",
        "isAdmin": false,
        "joinedAt": "2026-09-26T12:20:05.9120000+00:00",
        "os": "windows",
        "countryCode": "DE",
        "countryName": "Germany",
        "isp": "Example Telecom",
        "isVpn": false,
        "steamAvatarUrl": "https://avatars.steamstatic.com/…_full.jpg",
        "vacBanned": false,
        "vacBanCount": 0,
        "gameBanCount": 0,
        "communityBanned": false,
        "daysSinceLastBan": null,
        "rustPlaytimeHours": 1412,
        "x": 1204.5,
        "z": -388.2,
        "ping": 38
      }
    ]
  3. Post the count to the webhook. This goes to Discord, not RSM Web, so it carries no API key.

    POST https://discord.com/api/webhooks/…
    Content-Type: application/json
    
    { "content": "37/100 players online" }
    curl -X POST "$DISCORD_WEBHOOK_URL" \
      -H "Content-Type: application/json" \
      -d '{"content":"37/100 players online"}'
    Response
    204 No Content

Download a file

Needs files view.

  1. Ask for a ticket. Several paths, or a folder, come back as one zip.

    POST /api/files/download-ticket
    Authorization: Bearer rsm_your_key_here
    Content-Type: application/json
    
    { "root": "server", "paths": ["server/rsm/cfg/server.cfg"] }
    curl -X POST "$RSM_URL/api/files/download-ticket" \
      -H "Authorization: Bearer $RSM_KEY" \
      -H "Content-Type: application/json" \
      -d '{"root":"server","paths":["server/rsm/cfg/server.cfg"]}'
    Response
    200 OK
    
    {
      "ticket": "c1f0e6a4b8d2…",
      "filename": "server.cfg",
      "archive": false,
      "fileCount": 1
    }
  2. Fetch the file with the ticket from step 1 within a minute. The ticket is the permission, so this request has no Authorization header, and it works once.

    GET /api/files/download?ticket=c1f0e6a4b8d2…
    curl -OJ "$RSM_URL/api/files/download?ticket=$TICKET"
    Response
    200 OK
    Content-Type: application/octet-stream
    Content-Disposition: attachment; filename="server.cfg"
    
    The file itself.

Follow a log as it grows

Needs files view. The reply is a stream that stays open, one JSON object per line: the end of the file first, then each new piece as it is written.

  1. Open the stream and keep reading. append carries new text, reset means the file was emptied or replaced, ping only keeps the connection open, and error ends it.

    GET /api/files/tail?root=server&path=oxide/logs/oxide_2026-09-26.txt
    Authorization: Bearer rsm_your_key_here
    curl -N "$RSM_URL/api/files/tail?root=server&path=oxide/logs/oxide_2026-09-26.txt" \
      -H "Authorization: Bearer $RSM_KEY"
    Response
    200 OK
    Content-Type: application/x-ndjson; charset=utf-8
    
    { "type": "append", "text": "14:02:11 [Info] Rook has connected\n" }
    { "type": "ping" }
    { "type": "append", "text": "14:02:40 [Info] Mira has disconnected\n" }

Not available to keys

Some parts of the API only work for a person signed in to RSM Web:

Endpoint reference

165 endpoints, grouped by what they work on. Open one to see its parameters, a request with its headers, and the reply. {steamId} and the like are placeholders for a value in the path; the values in the examples are made up.

ServerStart, stop and talk to the Rust server itself.

GET /api/server/status Whether the server process is running, its PID and start time, and whether RCON is connected. server · view

Whether the server process is running, its PID and start time, and whether RCON is connected.

Parameters

No parameters

Request

GET /api/server/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/server/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "running": true,
  "pid": 4812,
  "startedAt": "2026-09-26T08:14:03.512Z",
  "rconConnected": true
}
GET /api/server/history Player count and FPS for the last hour, one point every few seconds. server · view

Player count and FPS for the last hour, one point every few seconds.

Parameters

No parameters

Request

GET /api/server/history
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/server/history" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  { "t": 1790431320000, "players": 37, "fps": 61 },
  { "t": 1790431325000, "players": 38, "fps": 60 }
]

Shortened: the full reply holds every point from the last hour.

GET /api/server/metrics-history Host CPU, memory and disk, the server process’s own CPU and memory, and the game’s players, FPS, entities, queue and network traffic. Recorded once a minute and kept for 7 days; longer ranges are averaged down to at most 720 points. server · view

Host CPU, memory and disk, the server process’s own CPU and memory, and the game’s players, FPS, entities, queue and network traffic. Recorded once a minute and kept for 7 days; longer ranges are averaged down to at most 720 points.

Parameters

InDescription
queryrange — 1h, 6h, 24h (default) or 7d

Request

GET /api/server/metrics-history?range=6h
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/server/metrics-history?range=6h" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "diskLabel": "/",
  "points": [
    {
      "t": 1790431260000,
      "cpuPct": 14,
      "usedMB": 9120,
      "totalMB": 32000,
      "diskPct": 61,
      "procCpuPct": 9.5,
      "procMemMB": 6840,
      "players": 37,
      "fps": 61,
      "entities": 184220,
      "netIn": 48211,
      "netOut": 391840,
      "queued": 0
    },
    {
      "t": 1790431320000,
      "cpuPct": 3,
      "usedMB": 2410,
      "totalMB": 32000,
      "diskPct": 61,
      "procCpuPct": null,
      "procMemMB": null,
      "players": null,
      "fps": null,
      "entities": null,
      "netIn": null,
      "netOut": null,
      "queued": null
    }
  ]
}

netIn and netOut are bytes a second. The server’s own figures are null for minutes when it wasn’t running.

POST /api/server/start Starts the server with its saved configuration. server · manage

Starts the server with its saved configuration.

Parameters

No parameters

Request

POST /api/server/start
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/server/start" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "started": true }
POST /api/server/stop Shuts the server down over RCON. If RCON isn’t connected, use kill. server · manage

Shuts the server down over RCON. If RCON isn’t connected, use kill.

Parameters

No parameters

Request

POST /api/server/stop
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/server/stop" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "stopping": true }
POST /api/server/restart Restarts the server after an in-game countdown. server · manage

Restarts the server after an in-game countdown.

Parameters

InDescription
bodycountdown — seconds to warn players first (default 500)

Request

POST /api/server/restart
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "countdown": 300 }
curl -X POST "$RSM_URL/api/server/restart" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"countdown":300}'

Responses

CodeExample
200 OK
{ "restarting": true, "countdown": 300 }
POST /api/server/save Saves the world now. Returns the console’s reply as response. server · manage

Saves the world now. Returns the console’s reply as response.

Parameters

No parameters

Request

POST /api/server/save
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/server/save" \
  -H "Authorization: Bearer $RSM_KEY"
POST /api/server/kill Ends the server process immediately, without saving. Use only when stop does not work. server · manage

Ends the server process immediately, without saving. Use only when stop does not work.

Parameters

No parameters

Request

POST /api/server/kill
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/server/kill" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "killed": true }
POST /api/server/command Runs a console command over RCON and returns its reply as response. server · manage

Runs a console command over RCON and returns its reply as response.

Parameters

InDescription
bodycommand — the command line, e.g. "status"

Request

POST /api/server/command
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "command": "server.hostname" }
curl -X POST "$RSM_URL/api/server/command" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"command":"server.hostname"}'

Responses

CodeExample
200 OK
{ "response": "server.hostname: \"My Rust Server\"" }
POST /api/server/rendermap Renders a fresh map image for the live map. Takes up to 45 seconds; 409 while a render is already running. livemap · manage

Renders a fresh map image for the live map. Takes up to 45 seconds; 409 while a render is already running.

Parameters

No parameters

Request

POST /api/server/rendermap
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/server/rendermap" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }

Installer and settingsInstalling and updating the Rust server files, and the paths and keys RSM Web uses.

GET /api/installer/status Progress of the current or last install or update. installer · view

Progress of the current or last install or update.

Parameters

No parameters

Request

GET /api/installer/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/installer/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "status": "running",
  "progress": 42,
  "phase": "installing",
  "logs": [
    "[RSM] Installing to: /srv/rust",
    "[RSM] Branch: main",
    " Update state (0x61) downloading, progress: 42.18 (1406263842 / 3333697811)"
  ]
}

status is idle, running, done, error or stopped; phase is idle, downloading-tool, cleaning or installing.

GET /api/installer/version The installed Rust build and the latest one available. installer · view

The installed Rust build and the latest one available.

Parameters

InDescription
querybranch — main (default) or staging

Request

GET /api/installer/version?branch=main
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/installer/version?branch=main" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "installed": "25454815", "latest": "25461207" }
POST /api/installer/start Installs or updates the server files with SteamCMD. installer · manage

Installs or updates the server files with SteamCMD.

Parameters

InDescription
bodybranch — main or staging; clean — true to validate every file

Request

POST /api/installer/start
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "branch": "main", "clean": false }
curl -X POST "$RSM_URL/api/installer/start" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"branch":"main","clean":false}'

Responses

CodeExample
200 OK
{ "started": true }
POST /api/installer/stop Stops a running install. installer · manage

Stops a running install.

Parameters

No parameters

Request

POST /api/installer/stop
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/installer/stop" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "stopped": true }
POST /api/installer/reset Clears a finished or failed install so a new one can start. installer · manage

Clears a finished or failed install so a new one can start.

Parameters

No parameters

Request

POST /api/installer/reset
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/installer/reset" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "reset": true }
GET /api/installer/settings Server folder, refresh interval, CPU affinity and start-up options. The Steam and RustMaps API keys are only included for keys with settings manage. settings · view

Server folder, refresh interval, CPU affinity and start-up options. The Steam and RustMaps API keys are only included for keys with settings manage.

Parameters

No parameters

Request

GET /api/installer/settings
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/installer/settings" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "serverPath": "/srv/rust",
  "refreshInterval": 1,
  "steamApiKey": "",
  "rustMapsApiKey": "",
  "cpuAffinity": [],
  "cpuCount": 16,
  "startWithSystemSupported": true,
  "startWithSystem": true,
  "autoStartServer": true
}

The two API keys are blank here because this key only has settings view.

PUT /api/installer/settings Saves those settings. settings · manage

Saves those settings.

Parameters

InDescription
bodyserverPath (required), refreshInterval, steamApiKey, rustMapsApiKey, cpuAffinity (array of core numbers), startWithSystem, autoStartServer

Request

PUT /api/installer/settings
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "serverPath": "/srv/rust",
  "cpuAffinity": [2, 3, 4, 5],
  "autoStartServer": true
}
curl -X PUT "$RSM_URL/api/installer/settings" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"serverPath":"/srv/rust","cpuAffinity":[2,3,4,5],"autoStartServer":true}'

Responses

CodeExample
200 OK
{ "ok": true, "affinityWarning": null, "startWithSystemWarning": null }

Server configurationThe server.cfg-style settings RSM Web launches the server with.

GET /api/config Hostname, description, map, seed, world size, ports, max players and the rest. The RCON password is blank unless the key has config manage. config · view

Hostname, description, map, seed, world size, ports, max players and the rest. The RCON password is blank unless the key has config manage.

Parameters

No parameters

Request

GET /api/config
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/config" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "identity": "rsm",
  "hostname": "My Rust Server",
  "tags": "weekly,vanilla",
  "description": "Vanilla, weekly wipes.",
  "url": "https://example.com",
  "headerimage": "",
  "logoimage": "",
  "level": "Procedural Map",
  "customMapUrl": "",
  "worldsize": 4000,
  "seed": 1337,
  "maxplayers": 100,
  "gamemode": "vanilla",
  "censorplayerlist": false,
  "pve": false,
  "radiation": true,
  "idlekick": 30,
  "saveBackupCount": 2,
  "autoUploadMap": true,
  "autoUploadMapImages": true,
  "ip": "0.0.0.0",
  "port": 28015,
  "queryport": 28017,
  "rconip": "0.0.0.0",
  "rconport": 28016,
  "rconpassword": "",
  "appip": "",
  "appport": 28082,
  "apppublicip": "",
  "favoritesendpoint": "",
  "servercfg": ""
}

rconpassword is blank because this key only has config view.

PUT /api/config Changes any of those fields; send only the ones you want to change. Most take effect on the next restart. config · manage

Changes any of those fields; send only the ones you want to change. Most take effect on the next restart.

Parameters

No parameters

Request

PUT /api/config
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "hostname": "My Rust Server | Weekly", "maxplayers": 150 }
curl -X PUT "$RSM_URL/api/config" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"hostname":"My Rust Server | Weekly","maxplayers":150}'

Responses

CodeExample
200 OK
The whole configuration, as GET returns it.
GET /api/rustmaps/preview A RustMaps preview for a procedural map. Needs a RustMaps API key in settings. config · view

A RustMaps preview for a procedural map. Needs a RustMaps API key in settings.

Parameters

InDescription
queryseed, size

PlayersActions that reach the game need RCON to be connected; they return 503 or 400 when it is not.

GET /api/players/online Everyone connected right now. players · view

Everyone connected right now.

Parameters

No parameters

Request

GET /api/players/online
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/online" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "steamId": "76561198000000001",
    "name": "Rook",
    "ip": "203.0.113.24:51820",
    "isAdmin": false,
    "joinedAt": "2026-09-26T12:20:05.9120000+00:00",
    "os": "windows",
    "countryCode": "DE",
    "countryName": "Germany",
    "isp": "Example Telecom",
    "isVpn": false,
    "steamAvatarUrl": "https://avatars.steamstatic.com/…_full.jpg",
    "vacBanned": false,
    "vacBanCount": 0,
    "gameBanCount": 0,
    "communityBanned": false,
    "daysSinceLastBan": null,
    "rustPlaytimeHours": 1412,
    "x": 1204.5,
    "z": -388.2,
    "ping": 38
  }
]
GET /api/players Every player the server has seen, most recent first. Returns { total, players }. players · view

Every player the server has seen, most recent first. Returns { total, players }.

Parameters

InDescription
querysearch (name or Steam ID), online (true/false), limit (1–100, default 50), offset

Request

GET /api/players?search=rook&limit=2
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players?search=rook&limit=2" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "total": 1,
  "players": [
    {
      "steamId": "76561198000000001",
      "name": "Rook",
      "ip": "203.0.113.24:51820",
      "isAdmin": false,
      "firstSeen": "2026-08-02T19:40:11.2718830+00:00",
      "lastSeen": "2026-09-26T14:02:11.4830000+00:00",
      "totalPlaySeconds": 183420,
      "isOnline": true,
      "countryCode": "DE",
      "countryName": "Germany",
      "os": "windows",
      "isp": "Example Telecom",
      "isVpn": false,
      "steamAvatarUrl": "https://avatars.steamstatic.com/…_full.jpg",
      "vacBanned": false,
      "vacBanCount": 0,
      "gameBanCount": 0,
      "communityBanned": false,
      "daysSinceLastBan": null,
      "rustPlaytimeHours": 1412
    }
  ]
}
GET /api/players/events Joins, leaves, deaths, kills, wounds, respawns, chat, mutes, staff changes and admin commands, newest first. Each event’s data depends on its type, and id is only unique within one type. A kick is a player_leave with kicked set. players · view

Joins, leaves, deaths, kills, wounds, respawns, chat, mutes, staff changes and admin commands, newest first. Each event’s data depends on its type, and id is only unique within one type. A kick is a player_leave with kicked set.

Parameters

InDescription
queryfrom, to (ISO dates), steamId, types (comma-separated: player_join, player_leave, player_death, player_wounded, player_respawn, player_chat, pve_kill, player_muted, player_unmuted, player_authlevel, admin_command), limit (1–500, default 200)

Request

GET /api/players/events?steamId=76561198000000001&limit=3
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/events?steamId=76561198000000001&limit=3" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 918,
    "steamId": "76561198000000001",
    "playerName": "Rook",
    "type": "player_death",
    "timestamp": "2026-09-26T13:12:40.1180000+00:00",
    "data": {
      "killedBy": "Hatch",
      "killedBySteamId": "76561198000000003",
      "killedByType": "player",
      "weapon": "rifle.ak",
      "distance": 84.2,
      "isHeadshot": true,
      "hitArea": "head",
      "x": 1180.2,
      "z": -402.7,
      "combatLog": []
    }
  },
  {
    "id": 4410,
    "steamId": "76561198000000001",
    "playerName": "Rook",
    "type": "player_chat",
    "timestamp": "2026-09-26T12:31:02.0040000+00:00",
    "data": { "message": "anyone selling sulfur?", "channel": "global" }
  },
  {
    "id": 1203,
    "steamId": "76561198000000001",
    "playerName": "Rook",
    "type": "player_join",
    "timestamp": "2026-09-26T12:20:05.9120000+00:00",
    "data": { "ip": "203.0.113.24:51820", "isAdmin": false, "os": "windows" }
  }
]

player_leave carries sessionDurationSeconds, reason, kicked and kickedBy; player_respawn carries nothing.

GET /api/players/states Who is banned, muted, or a moderator or owner right now, in one call. players · view

Who is banned, muted, or a moderator or owner right now, in one call.

Parameters

No parameters

Request

GET /api/players/states
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/states" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "banned": ["76561198000000003"],
  "muted": { "76561198000000001": "2026-09-26T14:50:12.000Z" },
  "levels": { "76561198000000002": 1 }
}

muted gives when each mute ends, or null for one that lasts until unmuted. levels is 1 for a moderator and 2 for an owner.

GET /api/players/{steamId}/profile One player’s record and their moderation history, newest first: bans and unbans, kicks, mutes and unmutes, and staff level changes. players · view

One player’s record and their moderation history, newest first: bans and unbans, kicks, mutes and unmutes, and staff level changes.

Parameters

No parameters

Request

GET /api/players/76561198000000001/profile
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/76561198000000001/profile" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "player": {
    "steamId": "76561198000000001",
    "name": "Rook",
    "ip": "203.0.113.24:51820",
    "isAdmin": false,
    "firstSeen": "2026-08-02T19:40:11.2718830+00:00",
    "lastSeen": "2026-09-26T14:02:11.4830000+00:00",
    "totalPlaySeconds": 183420,
    "isOnline": true,
    "countryCode": "DE",
    "countryName": "Germany",
    "os": "windows",
    "isp": "Example Telecom",
    "isVpn": false,
    "steamAvatarUrl": "https://avatars.steamstatic.com/…_full.jpg",
    "vacBanned": false,
    "vacBanCount": 0,
    "gameBanCount": 0,
    "communityBanned": false,
    "daysSinceLastBan": null,
    "rustPlaytimeHours": 1412
  },
  "history": [
    {
      "type": "mute",
      "at": "2026-09-26T13:50:12.4410000+00:00",
      "by": "admin",
      "until": "2026-09-26T14:50:12.000Z"
    },
    {
      "type": "kick",
      "at": "2026-09-24T21:08:33.1090000+00:00",
      "by": "admin",
      "reason": "AFK"
    },
    {
      "type": "ban",
      "at": "2026-09-12T20:15:02.118Z",
      "by": "admin",
      "reason": "Toxic chat",
      "minutes": 1440,
      "until": "2026-09-13T20:15:02.118Z"
    }
  ]
}

history holds up to 100 entries of type ban, unban, kick, mute, unmute and level. player is null for a Steam ID the server has never seen.

GET /api/players/{steamId}/combat-stats Kills, deaths and headshot counts for one player. players · view

Kills, deaths and headshot counts for one player.

Parameters

No parameters

Request

GET /api/players/76561198000000001/combat-stats
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/76561198000000001/combat-stats" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "pvpKills": 212, "pvpDeaths": 180, "pveKills": 1044, "headshotRate": 0.31 }
POST /api/players/{steamId}/refresh-steam Fetches the player’s Steam profile and ban record again. players · manage

Fetches the player’s Steam profile and ban record again.

Parameters

No parameters

Request

POST /api/players/76561198000000001/refresh-steam
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/players/76561198000000001/refresh-steam" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
The player, as in GET /api/players, with fresh Steam fields.
POST /api/players/{steamId}/kick Kicks the player. players · manage

Kicks the player.

Parameters

InDescription
bodyreason (optional)

Request

POST /api/players/76561198000000001/kick
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "reason": "AFK" }
curl -X POST "$RSM_URL/api/players/76561198000000001/kick" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"AFK"}'

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }
POST /api/players/{steamId}/ban Bans the player and records it in the ban history. players · manage

Bans the player and records it in the ban history.

Parameters

InDescription
bodyreason (optional), duration — minutes; 0 or omitted for permanent

Request

POST /api/players/76561198000000001/ban
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "reason": "Cheating", "duration": 1440 }
curl -X POST "$RSM_URL/api/players/76561198000000001/ban" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Cheating","duration":1440}'

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }

duration is in minutes: 1440 is one day.

POST /api/players/{steamId}/unban Lifts the ban. players · manage

Lifts the ban.

Parameters

No parameters

Request

POST /api/players/76561198000000001/unban
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/players/76561198000000001/unban" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }
POST /api/players/{steamId}/mute Mutes an online player in chat, for a set time or until unmuted. 404 if they aren’t online. players · manage

Mutes an online player in chat, for a set time or until unmuted. 404 if they aren’t online.

Parameters

InDescription
bodyduration — minutes; 0 or omitted to mute until unmuted

Request

POST /api/players/76561198000000001/mute
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "duration": 60 }
curl -X POST "$RSM_URL/api/players/76561198000000001/mute" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"duration":60}'

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }

duration is in minutes: this mute lifts itself after an hour.

POST /api/players/{steamId}/unmute Unmutes an online player. 404 if they aren’t online. players · manage

Unmutes an online player. 404 if they aren’t online.

Parameters

No parameters

Request

POST /api/players/76561198000000001/unmute
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/players/76561198000000001/unmute" \
  -H "Authorization: Bearer $RSM_KEY"
POST /api/players/{steamId}/skipqueue Moves a queued player to the front of the queue. players · manage

Moves a queued player to the front of the queue.

Parameters

No parameters

Request

POST /api/players/76561198000000001/skipqueue
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/players/76561198000000001/skipqueue" \
  -H "Authorization: Bearer $RSM_KEY"
POST /api/players/{steamId}/teleport Teleports the player to another player. Both must be online and alive. players · manage

Teleports the player to another player. Both must be online and alive.

Parameters

InDescription
bodytoSteamId

Request

POST /api/players/76561198000000001/teleport
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "toSteamId": "76561198000000002" }
curl -X POST "$RSM_URL/api/players/76561198000000001/teleport" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"toSteamId":"76561198000000002"}'

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }
POST /api/players/{steamId}/authlevel Sets the player’s in-game auth level. players · manage

Sets the player’s in-game auth level.

Parameters

InDescription
bodylevel — 0 (none), 1 (moderator) or 2 (owner)

Request

POST /api/players/76561198000000001/authlevel
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "level": 1 }
curl -X POST "$RSM_URL/api/players/76561198000000001/authlevel" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"level":1}'

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }
GET /api/players/bans The ban history. players · view

The ban history.

Parameters

InDescription
queryactive — true for bans still in force

Request

GET /api/players/bans?active=true
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/bans?active=true" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 31,
    "steamId": "76561198000000003",
    "playerName": "Hatch",
    "reason": "Cheating",
    "durationMinutes": 0,
    "bannedAt": "2026-09-26T13:44:51.207Z",
    "expiresAt": null,
    "bannedBy": "admin",
    "unbannedAt": null,
    "unbannedBy": null
  }
]

durationMinutes 0 and expiresAt null mean a permanent ban.

GET /api/players/bans/live The server’s own ban list, read over RCON. While RCON is down, RSM Web’s ban records instead. players · view

The server’s own ban list, read over RCON. While RCON is down, RSM Web’s ban records instead.

Parameters

No parameters

Request

GET /api/players/bans/live
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/bans/live" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "source": "rcon",
  "bans": [
    {
      "steamId": "76561198000000003",
      "playerName": "Hatch",
      "reason": "Cheating",
      "expiresAt": null,
      "bannedAt": "2026-09-26T13:44:51.207Z",
      "bannedBy": "admin",
      "durationMinutes": 0
    }
  ]
}

source is rcon, or db or cfg when RCON is down.

GET /api/players/kicks The last 500 kicks, newest first, with the reason and who did it — an RSM Web user, or the console, RCON or the server itself. players · view

The last 500 kicks, newest first, with the reason and who did it — an RSM Web user, or the console, RCON or the server itself.

Parameters

No parameters

Request

GET /api/players/kicks
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/kicks" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 88,
    "steamId": "76561198000000001",
    "playerName": "Rook",
    "reason": "AFK",
    "kickedBy": "admin",
    "kickedAt": "2026-09-24T21:08:33.1090000+00:00"
  }
]
GET /api/players/mutes The last 500 mutes, newest first: who set each one, when it ends, and how it ended. players · view

The last 500 mutes, newest first: who set each one, when it ends, and how it ended.

Parameters

No parameters

Request

GET /api/players/mutes
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/mutes" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 12,
    "steamId": "76561198000000001",
    "playerName": "Rook",
    "mutedAt": "2026-09-26T13:50:12.4410000+00:00",
    "expiresAt": "2026-09-26T14:50:12.000Z",
    "mutedBy": "admin",
    "unmutedAt": null,
    "unmutedBy": "",
    "unmuteReason": ""
  }
]

A mute still in force has unmutedAt null. Once it ends, unmuteReason is unmuted or expired.

GET /api/players/auth-changes The last 500 owner and moderator grants and removals, newest first, with who made each one. players · view

The last 500 owner and moderator grants and removals, newest first, with who made each one.

Parameters

No parameters

Request

GET /api/players/auth-changes
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/auth-changes" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 4,
    "steamId": "76561198000000002",
    "playerName": "Mira",
    "level": 1,
    "previousLevel": 0,
    "changedBy": "admin",
    "changedAt": "2026-09-21T17:30:44.9020000+00:00"
  }
]

Levels are 0 (none), 1 (moderator) and 2 (owner).

GET /api/players/admin-commands The last 500 admin-only commands staff ran from their in-game console, newest first. players · view

The last 500 admin-only commands staff ran from their in-game console, newest first.

Parameters

No parameters

Request

GET /api/players/admin-commands
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/players/admin-commands" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 310,
    "steamId": "76561198000000002",
    "playerName": "Mira",
    "command": "teleport2me Hatch",
    "ranAt": "2026-09-26T13:47:02.3350000+00:00"
  }
]

Items and loadoutsUses the players permission.

GET /api/inventory/items Searches the Rust item list. players · view

Searches the Rust item list.

Parameters

InDescription
querysearch, limit (default 50)

Request

GET /api/inventory/items?search=rifle.ak&limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/inventory/items?search=rifle.ak&limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "itemid": 1545779598,
    "shortname": "rifle.ak",
    "name": "Assault Rifle",
    "description": "A high damage, high recoil rifle.",
    "category": "Weapon",
    "stackable": 1,
    "hasSkins": true
  }
]
POST /api/inventory/give/{steamId} Gives an item to an online player. players · manage

Gives an item to an online player.

Parameters

InDescription
bodyitem — shortname such as rifle.ak; amount (default 1); skinId (default 0)

Request

POST /api/inventory/give/76561198000000001
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "item": "rifle.ak", "amount": 1, "skinId": 0 }
curl -X POST "$RSM_URL/api/inventory/give/76561198000000001" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"item":"rifle.ak","amount":1,"skinId":0}'

Responses

CodeExample
200 OK
{ "ok": true, "response": "" }
GET /api/inventory/loadouts Saved loadouts. players · view

Saved loadouts.

Parameters

No parameters

Request

GET /api/inventory/loadouts
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/inventory/loadouts" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 7,
    "name": "Starter kit",
    "items": [
      { "shortname": "pickaxe", "name": "Pickaxe", "amount": 1, "skinId": 0 },
      { "shortname": "wood", "name": "Wood", "amount": 1000, "skinId": 0 }
    ],
    "createdAt": "2026-09-10 12:00:00",
    "updatedAt": "2026-09-10 12:00:00"
  }
]
POST /api/inventory/loadouts Saves a loadout. players · manage

Saves a loadout.

Parameters

InDescription
bodyname, items — array of { shortname, name, amount, skinId }

Request

POST /api/inventory/loadouts
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "name": "Starter kit",
  "items": [
    { "shortname": "pickaxe", "name": "Pickaxe", "amount": 1, "skinId": 0 },
    { "shortname": "wood", "name": "Wood", "amount": 1000, "skinId": 0 }
  ]
}
curl -X POST "$RSM_URL/api/inventory/loadouts" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Starter kit","items":[{"shortname":"pickaxe","name":"Pickaxe","amount":1,"skinId":0},{"shortname":"wood","name":"Wood","amount":1000,"skinId":0}]}'

Responses

CodeExample
201 Created
{
  "id": 7,
  "name": "Starter kit",
  "items": [
    { "shortname": "pickaxe", "name": "Pickaxe", "amount": 1, "skinId": 0 },
    { "shortname": "wood", "name": "Wood", "amount": 1000, "skinId": 0 }
  ],
  "createdAt": "2026-09-10 12:00:00",
  "updatedAt": "2026-09-10 12:00:00"
}
PUT /api/inventory/loadouts/{id} Renames a loadout or replaces its items. players · manage

Renames a loadout or replaces its items.

Parameters

No parameters

DELETE /api/inventory/loadouts/{id} Deletes a loadout. players · manage

Deletes a loadout.

Parameters

No parameters

Request

DELETE /api/inventory/loadouts/7
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/inventory/loadouts/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/inventory/loadouts/{id}/give/{steamId} Gives every item in a loadout to an online player. players · manage

Gives every item in a loadout to an online player.

Parameters

No parameters

Request

POST /api/inventory/loadouts/7/give/76561198000000001
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/inventory/loadouts/7/give/76561198000000001" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true, "given": 2 }

DemosRecordings of what one player’s game saw, made by the RSM Harmony mod and played back in Rust. Demos have their own demos permission, separate from players. Recording needs RCON: 503 while it is down, and 409 when the mod on the server is too old to record.

GET /api/demos Finished demos, newest first. Returns { demos, total, totalBytes }. demos · view

Finished demos, newest first. Returns { demos, total, totalBytes }.

Parameters

InDescription
querysteamId, limit (1–500, default 100), offset

Request

GET /api/demos?steamId=76561198000000003&limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/demos?steamId=76561198000000003&limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "demos": [
    {
      "id": 7,
      "steamId": "76561198000000003",
      "name": "Hatch",
      "file": "demos/rsm/76561198000000003/2026-09-26_13-52-07Z.dem",
      "fileName": "2026-09-26_13-52-07Z.dem",
      "startedAt": "2026-09-26T13:52:07.000Z",
      "endedAt": "2026-09-26T14:22:07.000Z",
      "durationMs": 1800000,
      "sizeBytes": 148934656,
      "reason": "timed",
      "startedBy": "admin",
      "endReason": "expired",
      "stoppedBy": "",
      "parentId": null,
      "status": "saved",
      "error": "",
      "recovered": false,
      "pinned": false,
      "note": ""
    }
  ],
  "total": 3,
  "totalBytes": 402653184
}

reason is manual, timed, auto, plugin or found (a file RSM Web came across on disk). endReason is stopped, disconnect, expired, split, shutdown, interrupted or failed. status is saved or failed.

GET /api/demos/status Who is being recorded right now, who is on the auto-record list, and how much disk space is left. demos · view

Who is being recorded right now, who is on the auto-record list, and how much disk space is left.

Parameters

No parameters

Request

GET /api/demos/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/demos/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "state": "ok",
  "available": true,
  "error": "",
  "sessions": [
    {
      "steamId": "76561198000000003",
      "name": "Hatch",
      "file": "demos/rsm/76561198000000003/2026-09-26_14-31-40Z.dem",
      "startedAt": "2026-09-26T14:31:40.000Z",
      "elapsedMs": 412000,
      "bytes": 31457280,
      "reason": "auto",
      "by": "admin",
      "parentFile": ""
    }
  ],
  "rules": [
    {
      "steamId": "76561198000000003",
      "mode": "always",
      "until": "",
      "reason": "auto",
      "by": "admin"
    }
  ],
  "splitMinutes": 60,
  "splitMegabytes": 512,
  "freeBytes": 182536110080,
  "serverTime": "2026-09-26T14:38:32.000Z"
}

state is ok, offline (RCON is down), outdated (the mod is too old to record) or missing; anything but ok carries only state and error. A recording is split into a new file once it passes splitMinutes or splitMegabytes.

POST /api/demos/start Starts recording an online player. 400 if they aren’t online. demos · manage

Starts recording an online player. 400 if they aren’t online.

Parameters

InDescription
bodysteamId; minutes — 1 to 1440, or 0 or omitted to record until they leave

Request

POST /api/demos/start
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "steamId": "76561198000000003", "minutes": 30 }
curl -X POST "$RSM_URL/api/demos/start" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"steamId":"76561198000000003","minutes":30}'

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/demos/stop Stops a recording and saves it. 400 if the player isn’t being recorded. demos · manage

Stops a recording and saves it. 400 if the player isn’t being recorded.

Parameters

InDescription
bodysteamId

Request

POST /api/demos/stop
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "steamId": "76561198000000003" }
curl -X POST "$RSM_URL/api/demos/stop" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"steamId":"76561198000000003"}'

Responses

CodeExample
200 OK
{ "ok": true }
PUT /api/demos/auto/{steamId} Puts a player on the auto-record list, or takes them off. Everyone on it is recorded each time they join; they don’t have to be online when you add them. demos · manage

Puts a player on the auto-record list, or takes them off. Everyone on it is recorded each time they join; they don’t have to be online when you add them.

Parameters

InDescription
bodyenabled — true or false

Request

PUT /api/demos/auto/76561198000000001
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "enabled": true }
curl -X PUT "$RSM_URL/api/demos/auto/76561198000000001" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/demos/download-ticket Prepares a download and returns a ticket. Fetch GET /api/files/download?ticket=… within a minute to get the demo, or a zip when you asked for several. Each ticket works once. demos · view

Prepares a download and returns a ticket. Fetch GET /api/files/download?ticket=… within a minute to get the demo, or a zip when you asked for several. Each ticket works once.

Parameters

InDescription
bodyids — array of 1 to 100 demo ids

Request

POST /api/demos/download-ticket
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "ids": [7] }
curl -X POST "$RSM_URL/api/demos/download-ticket" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":[7]}'

Responses

CodeExample
200 OK
{
  "ticket": "e4a17c90d3b6…",
  "filename": "76561198000000003_2026-09-26_13-52-07Z.dem",
  "archive": false,
  "fileCount": 1
}
PATCH /api/demos/{id} Pins or unpins a demo, or changes its note. demos · manage

Pins or unpins a demo, or changes its note.

Parameters

InDescription
bodypinned — true or false; note — up to 500 characters

Request

PATCH /api/demos/7
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "pinned": true, "note": "Tracks Rook through the wall at 12:40." }
curl -X PATCH "$RSM_URL/api/demos/7" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pinned":true,"note":"Tracks Rook through the wall at 12:40."}'

Responses

CodeExample
200 OK
{
  "id": 7,
  "steamId": "76561198000000003",
  "name": "Hatch",
  "file": "demos/rsm/76561198000000003/2026-09-26_13-52-07Z.dem",
  "fileName": "2026-09-26_13-52-07Z.dem",
  "startedAt": "2026-09-26T13:52:07.000Z",
  "endedAt": "2026-09-26T14:22:07.000Z",
  "durationMs": 1800000,
  "sizeBytes": 148934656,
  "reason": "timed",
  "startedBy": "admin",
  "endReason": "expired",
  "stoppedBy": "",
  "parentId": null,
  "status": "saved",
  "error": "",
  "recovered": false,
  "pinned": true,
  "note": "Tracks Rook through the wall at 12:40."
}
DELETE /api/demos/{id} Deletes a demo and its file. 409 while it is still recording. demos · manage

Deletes a demo and its file. 409 while it is still recording.

Parameters

No parameters

Request

DELETE /api/demos/7
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/demos/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }

Teams and clans

GET /api/teams Every in-game team with its leader and members. teams · view

Every in-game team with its leader and members.

Parameters

No parameters

Request

GET /api/teams
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/teams" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "teamId": "4211",
    "teamName": null,
    "leaderId": "76561198000000001",
    "members": [
      { "steamId": "76561198000000001", "name": "Rook", "online": true },
      { "steamId": "76561198000000002", "name": "Mira", "online": false }
    ]
  }
]
POST /api/teams/{teamId}/kick Removes a member from a team. teams · manage

Removes a member from a team.

Parameters

InDescription
bodysteamId

Request

POST /api/teams/4211/kick
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "steamId": "76561198000000002" }
curl -X POST "$RSM_URL/api/teams/4211/kick" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"steamId":"76561198000000002"}'

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/teams/{teamId}/promote Makes a member the team leader. teams · manage

Makes a member the team leader.

Parameters

InDescription
bodysteamId
POST /api/teams/{teamId}/disband Disbands the team. teams · manage

Disbands the team.

Parameters

No parameters

Request

POST /api/teams/4211/disband
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/teams/4211/disband" \
  -H "Authorization: Bearer $RSM_KEY"
GET /api/clans Every clan with its roles, members and pending invites. clans · view

Every clan with its roles, members and pending invites.

Parameters

No parameters

Request

GET /api/clans
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/clans" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "clanId": "1024",
    "name": "Night Owls",
    "color": "#3c7bd6",
    "score": 1830,
    "motd": "Raid at 8",
    "maxMemberCount": 8,
    "ownerId": "76561198000000001",
    "roles": [
      { "roleId": 1, "rank": 0, "name": "Leader" },
      { "roleId": 2, "rank": 1, "name": "Member" }
    ],
    "members": [
      {
        "steamId": "76561198000000001",
        "name": "Rook",
        "roleId": 1,
        "online": true
      }
    ],
    "invites": [
      { "steamId": "76561198000000002", "name": "Mira", "recruiter": "Rook" }
    ]
  }
]
POST /api/clans/{clanId}/kick Removes a member from a clan. clans · manage

Removes a member from a clan.

Parameters

InDescription
bodysteamId
POST /api/clans/{clanId}/role Puts a member in one of the clan’s roles. clans · manage

Puts a member in one of the clan’s roles.

Parameters

InDescription
bodysteamId, roleId

Request

POST /api/clans/1024/role
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "steamId": "76561198000000001", "roleId": 2 }
curl -X POST "$RSM_URL/api/clans/1024/role" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"steamId":"76561198000000001","roleId":2}'

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/clans/{clanId}/cancel-invite Withdraws an invitation. clans · manage

Withdraws an invitation.

Parameters

InDescription
bodysteamId
POST /api/clans/{clanId}/disband Disbands the clan. clans · manage

Disbands the clan.

Parameters

No parameters

Request

POST /api/clans/1024/disband
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/clans/1024/disband" \
  -H "Authorization: Bearer $RSM_KEY"

Chat logs and leaderboard

GET /api/chat-logs Chat messages, newest first. chatlogs · view

Chat messages, newest first.

Parameters

InDescription
querysteamId, search, channel (global, team, local, clan), from, to, limit (1–200, default 100), offset

Request

GET /api/chat-logs?channel=global&limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/chat-logs?channel=global&limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "total": 5210,
  "messages": [
    {
      "id": 4410,
      "steamId": "76561198000000001",
      "playerName": "Rook",
      "message": "anyone selling sulfur?",
      "channel": "global",
      "createdAt": "2026-09-26T12:31:02.0040000+00:00"
    }
  ]
}
GET /api/chat-logs/players Everyone who has said something, with a message count. chatlogs · view

Everyone who has said something, with a message count.

Parameters

No parameters

Request

GET /api/chat-logs/players
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/chat-logs/players" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  { "steamId": "76561198000000001", "playerName": "Rook", "messageCount": 412 },
  { "steamId": "76561198000000002", "playerName": "Mira", "messageCount": 128 }
]
GET /api/leaderboard Kills, deaths, K/D and headshot percentage per player. leaderboard · view

Kills, deaths, K/D and headshot percentage per player.

Parameters

InDescription
queryfrom, to, sort (kd default, kills, deaths, headshotPct), limit (1–500, default 100)

Request

GET /api/leaderboard?sort=kills&limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/leaderboard?sort=kills&limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "entries": [
    {
      "steamId": "76561198000000001",
      "name": "Rook",
      "kills": 212,
      "deaths": 180,
      "headshots": 66,
      "avatarUrl": "https://avatars.steamstatic.com/…_full.jpg",
      "kd": 1.18,
      "headshotPct": 31.1
    }
  ],
  "total": 94
}

ReportsPlayer reports and feedback sent from inside the game.

GET /api/reports Reports, newest first. Returns { reports, total, open }. reports · view

Reports, newest first. Returns { reports, total, open }.

Parameters

InDescription
querystatus (open, in_progress, resolved, dismissed), kind (player, feedback), type (general, bug, cheat, abuse, idea, offensive, rules), targetId, limit, offset

Request

GET /api/reports?status=open&limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/reports?status=open&limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "reports": [
    {
      "id": 7,
      "receivedAt": "2026-09-26 13:41:09",
      "source": "mod",
      "kind": "player",
      "type": "cheat",
      "reporterId": "76561198000000002",
      "reporterName": "Mira",
      "targetId": "76561198000000003",
      "targetName": "Hatch",
      "subject": "Aimbot at outpost",
      "message": "Two headshots through a wall from 200 m.",
      "hasImage": true,
      "context": { "grid": "K14" },
      "status": "open",
      "note": ""
    }
  ],
  "total": 12,
  "open": 3
}
GET /api/reports/{id} One report. reports · view

One report.

Parameters

No parameters

Request

GET /api/reports/7
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/reports/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "id": 7,
  "receivedAt": "2026-09-26 13:41:09",
  "source": "mod",
  "kind": "player",
  "type": "cheat",
  "reporterId": "76561198000000002",
  "reporterName": "Mira",
  "targetId": "76561198000000003",
  "targetName": "Hatch",
  "subject": "Aimbot at outpost",
  "message": "Two headshots through a wall from 200 m.",
  "hasImage": true,
  "context": { "grid": "K14" },
  "status": "open",
  "note": ""
}
GET /api/reports/{id}/image The screenshot attached to a report, if it has one. reports · view

The screenshot attached to a report, if it has one.

Parameters

No parameters

Request

GET /api/reports/7/image
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/reports/7/image" \
  -H "Authorization: Bearer $RSM_KEY"
PATCH /api/reports/{id} Changes a report’s status or note. reports · manage

Changes a report’s status or note.

Parameters

InDescription
bodystatus, note

Request

PATCH /api/reports/7
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "status": "resolved", "note": "Banned Hatch." }
curl -X PATCH "$RSM_URL/api/reports/7" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"resolved","note":"Banned Hatch."}'

Responses

CodeExample
200 OK
{
  "id": 7,
  "receivedAt": "2026-09-26 13:41:09",
  "source": "mod",
  "kind": "player",
  "type": "cheat",
  "reporterId": "76561198000000002",
  "reporterName": "Mira",
  "targetId": "76561198000000003",
  "targetName": "Hatch",
  "subject": "Aimbot at outpost",
  "message": "Two headshots through a wall from 200 m.",
  "hasImage": true,
  "context": { "grid": "K14" },
  "status": "resolved",
  "note": "Banned Hatch."
}
DELETE /api/reports/{id} Deletes a report. reports · manage

Deletes a report.

Parameters

No parameters

Request

DELETE /api/reports/7
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/reports/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "deleted": true }

Mods and pluginsOxide and Carbon, and the plugins installed on top of them. Endpoints that take framework expect oxide or carbon.

GET /api/mods/status Which framework is installed and the state of any install in progress. mods · view

Which framework is installed and the state of any install in progress.

Parameters

No parameters

Request

GET /api/mods/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/mods/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "status": "idle",
  "phase": "idle",
  "logs": [],
  "detected": "oxide",
  "serverPath": "/srv/rust"
}
POST /api/mods/switch Installs a framework, or removes it. mods · manage

Installs a framework, or removes it.

Parameters

InDescription
bodyframework — oxide, carbon or none; branch

Request

POST /api/mods/switch
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "framework": "carbon", "branch": "main" }
curl -X POST "$RSM_URL/api/mods/switch" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"framework":"carbon","branch":"main"}'

Responses

CodeExample
200 OK
{ "started": true }
POST /api/mods/stop Stops a running framework install. mods · manage

Stops a running framework install.

Parameters

No parameters

Request

POST /api/mods/stop
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/mods/stop" \
  -H "Authorization: Bearer $RSM_KEY"
POST /api/mods/reset Clears a finished or failed framework install. mods · manage

Clears a finished or failed framework install.

Parameters

No parameters

Request

POST /api/mods/reset
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/mods/reset" \
  -H "Authorization: Bearer $RSM_KEY"
GET /api/mods/oxide/version The installed Oxide build and the latest release. mods · view

The installed Oxide build and the latest release.

Parameters

No parameters

Request

GET /api/mods/oxide/version
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/mods/oxide/version" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "installed": { "version": "2.0.7723", "publishedAt": "2026-09-17T09:19:51Z" },
  "latest": { "version": "2.0.7726", "publishedAt": "2026-09-22T10:55:31Z" }
}
GET /api/mods/oxide/config oxide.config.json. mods · view

oxide.config.json.

Parameters

No parameters

Request

GET /api/mods/oxide/config
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/mods/oxide/config" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
404 Not Found
{
  "error": "oxide.config.json has not been created yet — Oxide writes it the first time the server starts",
  "code": "NOT_GENERATED"
}

The reply until the server has started once with Oxide. Carbon’s modules answer the same way.

PUT /api/mods/oxide/config Replaces oxide.config.json with the body. mods · manage

Replaces oxide.config.json with the body.

Parameters

No parameters

Request

PUT /api/mods/oxide/config
Authorization: Bearer rsm_your_key_here
curl -X PUT "$RSM_URL/api/mods/oxide/config" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }
GET /api/mods/carbon/modules Carbon’s built-in modules. mods · view

Carbon’s built-in modules.

Parameters

No parameters

Request

GET /api/mods/carbon/modules
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/mods/carbon/modules" \
  -H "Authorization: Bearer $RSM_KEY"
GET /api/mods/carbon/modules/{name}/config One Carbon module’s config. mods · view

One Carbon module’s config.

Parameters

No parameters

Request

GET /api/mods/carbon/modules/Kits/config
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/mods/carbon/modules/Kits/config" \
  -H "Authorization: Bearer $RSM_KEY"
PUT /api/mods/carbon/modules/{name}/config Replaces that config with the body. mods · manage

Replaces that config with the body.

Parameters

No parameters

GET /api/plugins/installed Installed plugins. mods · view

Installed plugins.

Parameters

InDescription
queryframework

Request

GET /api/plugins/installed?framework=oxide
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/plugins/installed?framework=oxide" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "filename": "Kits.cs",
    "source": "umod",
    "id": "rust-kits",
    "version": "4.4.9",
    "installedAt": "2026-09-20T04:40:12.000Z",
    "hasConfig": true,
    "title": "Rust Kits",
    "description": "Item kits, autokits, kit cooldowns, and more",
    "url": "https://umod.org/plugins/rust-kits",
    "author": "k1lly0u"
  }
]
GET /api/plugins/check-updates Which installed plugins have a newer version. mods · view

Which installed plugins have a newer version.

Parameters

InDescription
queryframework

Request

GET /api/plugins/check-updates?framework=oxide
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/plugins/check-updates?framework=oxide" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "results": [
    {
      "filename": "Kits.cs",
      "currentVersion": "4.4.8",
      "latestVersion": "4.4.9",
      "hasUpdate": true
    }
  ]
}
GET /api/plugins/umod/tags The most common uMod tags. mods · view

The most common uMod tags.

Parameters

No parameters

Request

GET /api/plugins/umod/tags
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/plugins/umod/tags" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "tags": ["admin", "chat", "gui", "items", "moderation", "discord"] }
GET /api/plugins/umod/info/{id} One uMod plugin’s details. mods · view

One uMod plugin’s details.

Parameters

No parameters

Request

GET /api/plugins/umod/info/7
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/plugins/umod/info/7" \
  -H "Authorization: Bearer $RSM_KEY"
GET /api/plugins/codefling/purchased Codefling plugins the connected account owns. mods · view

Codefling plugins the connected account owns.

Parameters

InDescription
queryq, sortBy
GET /api/plugins/codefling/status Whether a Codefling account is connected. mods · view

Whether a Codefling account is connected.

Parameters

No parameters

Request

GET /api/plugins/codefling/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/plugins/codefling/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "loggedIn": false, "source": null, "user": null }
POST /api/plugins/install Installs a plugin from uMod or Codefling. mods · manage

Installs a plugin from uMod or Codefling.

Parameters

InDescription
bodyframework, source (umod or codefling), id, filename, version, and downloadUrl for uMod

Request

POST /api/plugins/install
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "framework": "oxide",
  "source": "umod",
  "id": "rust-kits",
  "filename": "Kits.cs",
  "version": "4.4.9",
  "downloadUrl": "https://umod.org/plugins/Kits.cs"
}
curl -X POST "$RSM_URL/api/plugins/install" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"framework":"oxide","source":"umod","id":"rust-kits","filename":"Kits.cs","version":"4.4.9","downloadUrl":"https://umod.org/plugins/Kits.cs"}'

Responses

CodeExample
200 OK
{ "ok": true, "filename": "Kits.cs" }
POST /api/plugins/update Updates an installed plugin to its latest version. mods · manage

Updates an installed plugin to its latest version.

Parameters

InDescription
bodyframework, filename

Request

POST /api/plugins/update
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "framework": "oxide", "filename": "Kits.cs" }
curl -X POST "$RSM_URL/api/plugins/update" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"framework":"oxide","filename":"Kits.cs"}'

Responses

CodeExample
200 OK
{ "ok": true, "filename": "Kits.cs", "version": "4.4.9" }
POST /api/plugins/upload Uploads a .cs plugin (multipart form, 10 MB max). mods · manage

Uploads a .cs plugin (multipart form, 10 MB max).

Parameters

InDescription
formfile, framework, source (umod, codefling or manual)

Request

POST /api/plugins/upload
Authorization: Bearer rsm_your_key_here
Content-Type: multipart/form-data; boundary=…

file=@Kits.cs
framework=oxide
source=manual
curl -X POST "$RSM_URL/api/plugins/upload" \
  -H "Authorization: Bearer $RSM_KEY" \
  -F "[email protected]" \
  -F "framework=oxide" \
  -F "source=manual"

Responses

CodeExample
200 OK
{ "ok": true, "filename": "Kits.cs" }
DELETE /api/plugins/{filename} Removes a plugin. mods · manage

Removes a plugin.

Parameters

InDescription
queryframework

Request

DELETE /api/plugins/Kits.cs?framework=oxide
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/plugins/Kits.cs?framework=oxide" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }
GET /api/plugins/{name}/config A plugin’s config file. mods · view

A plugin’s config file.

Parameters

InDescription
queryframework

Request

GET /api/plugins/Kits/config?framework=oxide
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/plugins/Kits/config?framework=oxide" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
The plugin’s config file, as JSON.
PUT /api/plugins/{name}/config Replaces a plugin’s config with the body. mods · manage

Replaces a plugin’s config with the body.

Parameters

InDescription
queryframework

Request

PUT /api/plugins/Kits/config?framework=oxide
Authorization: Bearer rsm_your_key_here
curl -X PUT "$RSM_URL/api/plugins/Kits/config?framework=oxide" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }

Wipes and map lists

GET /api/wipes/schedule The scheduled wipe: when it runs and what it wipes. wipes · view

The scheduled wipe: when it runs and what it wipes.

Parameters

No parameters

Request

GET /api/wipes/schedule
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/wipes/schedule" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "enabled": true,
  "branch": "main",
  "updateServer": true,
  "updateFramework": true,
  "randomSeed": true,
  "randomRconPassword": false,
  "wipeBlueprints": false,
  "backupBeforeWipe": true,
  "backupPath": "",
  "backupRetentionCount": 5,
  "lastRunDate": "2026-09-18",
  "rule": "weekly",
  "dayOfWeek": 4,
  "anchorDate": null,
  "timeOfDay": "18:00",
  "customized": false,
  "automationId": 3,
  "defaultBackupPath": "/opt/rsm-web/data/wipe-backups"
}

dayOfWeek counts from Sunday (0). An empty backupPath means defaultBackupPath.

PUT /api/wipes/schedule Changes the schedule; send only the fields you want to change. wipes · manage

Changes the schedule; send only the fields you want to change.

Parameters

No parameters

Request

PUT /api/wipes/schedule
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "enabled": true, "dayOfWeek": 4, "timeOfDay": "19:00" }
curl -X PUT "$RSM_URL/api/wipes/schedule" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"dayOfWeek":4,"timeOfDay":"19:00"}'

Responses

CodeExample
200 OK
The whole schedule, as GET returns it.
POST /api/wipes/schedule/test-backup-path Checks that a backup folder can be written to. wipes · manage

Checks that a backup folder can be written to.

Parameters

InDescription
bodypath

Request

POST /api/wipes/schedule/test-backup-path
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "path": "/mnt/backups/rust" }
curl -X POST "$RSM_URL/api/wipes/schedule/test-backup-path" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"/mnt/backups/rust"}'

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/wipes/run Runs the scheduled wipe now. Returns the automation run id. wipes · manage

Runs the scheduled wipe now. Returns the automation run id.

Parameters

No parameters

Request

POST /api/wipes/run
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/wipes/run" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "started": true, "runId": 215 }
GET /api/wipes/history Past wipes. wipes · view

Past wipes.

Parameters

No parameters

Request

GET /api/wipes/history
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/wipes/history" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 14,
    "triggeredAt": "2026-09-18 18:00:02",
    "triggerType": "scheduled",
    "triggeredBy": "automation: Scheduled wipe",
    "newSeed": 88231,
    "rconPasswordChanged": false,
    "blueprintsWiped": false,
    "serverUpdated": true,
    "frameworkUpdated": true,
    "frameworkName": "oxide",
    "backupPath": "/opt/rsm-web/data/wipe-backups/2026-09-18_180002",
    "success": true,
    "error": ""
  }
]
GET /api/wipes/scheduled Every automation that includes a wipe. wipes · view

Every automation that includes a wipe.

Parameters

No parameters

Request

GET /api/wipes/scheduled
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/wipes/scheduled" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 2,
    "name": "Forced wipe",
    "enabled": true,
    "builtinKey": "forced_wipe",
    "nextRun": "2026-10-01T18:00:00.000Z"
  },
  {
    "id": 3,
    "name": "Scheduled wipe",
    "enabled": true,
    "builtinKey": "scheduled_wipe",
    "nextRun": "2026-10-01T18:00:00.000Z"
  }
]
GET /api/wipes/forced-schedule What happens on Facepunch’s monthly forced wipe. wipes · view

What happens on Facepunch’s monthly forced wipe.

Parameters

No parameters

Request

GET /api/wipes/forced-schedule
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/wipes/forced-schedule" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "enabled": true,
  "branch": "main",
  "updateServer": true,
  "updateFramework": true,
  "randomSeed": false,
  "randomRconPassword": false,
  "wipeBlueprints": false,
  "backupBeforeWipe": true,
  "backupPath": "",
  "backupRetentionCount": 5,
  "lastRunDate": "2026-09-18",
  "customized": false,
  "automationId": 2,
  "defaultBackupPath": "/opt/rsm-web/data/wipe-backups"
}
PUT /api/wipes/forced-schedule Changes the forced-wipe options. wipes · manage

Changes the forced-wipe options.

Parameters

No parameters

GET /api/map-lists Map lists that wipes can pick the next map from. wipes · view

Map lists that wipes can pick the next map from.

Parameters

No parameters

Request

GET /api/map-lists
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/map-lists" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 7,
    "name": "Monthly maps",
    "mode": "rotate",
    "nextIndex": 1,
    "entries": [
      {
        "kind": "procedural",
        "label": "4000 · 1337",
        "seed": 1337,
        "worldSize": 4000
      },
      {
        "kind": "custom",
        "label": "Hapis",
        "url": "https://maps.example.com/hapis.map"
      }
    ]
  }
]
POST /api/map-lists Creates a map list. wipes · manage

Creates a map list.

Parameters

InDescription
bodyname, mode (random or rotate), entries

Request

POST /api/map-lists
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "name": "Monthly maps",
  "mode": "rotate",
  "entries": [
    {
      "kind": "procedural",
      "label": "4000 · 1337",
      "seed": 1337,
      "worldSize": 4000
    },
    {
      "kind": "custom",
      "label": "Hapis",
      "url": "https://maps.example.com/hapis.map"
    }
  ]
}
curl -X POST "$RSM_URL/api/map-lists" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Monthly maps","mode":"rotate","entries":[{"kind":"procedural","label":"4000 · 1337","seed":1337,"worldSize":4000},{"kind":"custom","label":"Hapis","url":"https://maps.example.com/hapis.map"}]}'

Responses

CodeExample
201 Created
{
  "id": 7,
  "name": "Monthly maps",
  "mode": "rotate",
  "nextIndex": 0,
  "entries": [
    {
      "kind": "procedural",
      "label": "4000 · 1337",
      "seed": 1337,
      "worldSize": 4000
    },
    {
      "kind": "custom",
      "label": "Hapis",
      "url": "https://maps.example.com/hapis.map"
    }
  ]
}
PUT /api/map-lists/{id} Replaces a map list. wipes · manage

Replaces a map list.

Parameters

No parameters

DELETE /api/map-lists/{id} Deletes a map list. 409 while an automation still uses it. wipes · manage

Deletes a map list. 409 while an automation still uses it.

Parameters

No parameters

Request

DELETE /api/map-lists/7
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/map-lists/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "deleted": true }

AutomationsSaving, switching on or running an automation also needs manage on every module its actions touch — on the key, not just on the person who made it.

GET /api/automations Every automation, with its next run. automation · view

Every automation, with its next run.

Parameters

No parameters

Request

GET /api/automations
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 7,
    "name": "!pop command",
    "description": "Replies with how many players are online.",
    "enabled": true,
    "builtinKey": null,
    "definition": {
      "mode": "parallel",
      "max": 10,
      "triggers": [
        {
          "kind": "chat_command",
          "command": "pop",
          "channels": ["global", "team"],
          "allow": "everyone",
          "cooldownSeconds": 30
        }
      ],
      "conditions": [],
      "actions": [
        { "kind": "reply", "text": "{players}/{maxPlayers} players online." }
      ]
    },
    "version": 3,
    "createdBy": "admin",
    "updatedBy": "admin",
    "createdAt": "2026-09-20 06:31:47",
    "updatedAt": "2026-09-24 18:02:10",
    "lastFiredAt": "2026-09-26T13:58:40.112Z",
    "scheduleAnchor": "2026-09-24T18:02:10.448Z",
    "nextRun": null,
    "lastRun": {
      "id": 212,
      "status": "succeeded",
      "startedAt": "2026-09-26T13:58:40.112Z",
      "error": ""
    },
    "runningRunIds": [],
    "requiredPermissions": [],
    "customized": false
  }
]
GET /api/automations/{id} One automation. automation · view

One automation.

Parameters

No parameters

Request

GET /api/automations/7
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "id": 7,
  "name": "!pop command",
  "description": "Replies with how many players are online.",
  "enabled": true,
  "builtinKey": null,
  "definition": {
    "mode": "parallel",
    "max": 10,
    "triggers": [
      {
        "kind": "chat_command",
        "command": "pop",
        "channels": ["global", "team"],
        "allow": "everyone",
        "cooldownSeconds": 30
      }
    ],
    "conditions": [],
    "actions": [
      { "kind": "reply", "text": "{players}/{maxPlayers} players online." }
    ]
  },
  "version": 3,
  "createdBy": "admin",
  "updatedBy": "admin",
  "createdAt": "2026-09-20 06:31:47",
  "updatedAt": "2026-09-24 18:02:10",
  "lastFiredAt": "2026-09-26T13:58:40.112Z",
  "scheduleAnchor": "2026-09-24T18:02:10.448Z",
  "nextRun": null,
  "lastRun": {
    "id": 212,
    "status": "succeeded",
    "startedAt": "2026-09-26T13:58:40.112Z",
    "error": ""
  },
  "runningRunIds": [],
  "requiredPermissions": [],
  "customized": false
}
GET /api/automations/{id}/runs That automation’s recent runs. automation · view

That automation’s recent runs.

Parameters

No parameters

Request

GET /api/automations/7/runs
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations/7/runs" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 212,
    "automationId": 7,
    "automationName": "!pop command",
    "startedAt": "2026-09-26T13:58:40.112Z",
    "finishedAt": "2026-09-26T13:58:40.190Z",
    "status": "succeeded",
    "trigger": {
      "kind": "chat_command",
      "index": 0,
      "at": "2026-09-26T13:58:40.112Z",
      "event": {
        "type": "chat",
        "channel": "global",
        "steamId": "76561198000000002",
        "name": "Mira",
        "message": "!pop",
        "isAdmin": false,
        "at": 1790431120112
      }
    },
    "trace": [
      {
        "path": "actions[0]",
        "kind": "reply",
        "startedAt": "2026-09-26T13:58:40.115Z",
        "result": "ok",
        "finishedAt": "2026-09-26T13:58:40.189Z"
      }
    ],
    "error": "",
    "cancelledBy": ""
  }
]
GET /api/automations/next-runs Upcoming scheduled runs across all automations that are switched on. automation · view

Upcoming scheduled runs across all automations that are switched on.

Parameters

No parameters

Request

GET /api/automations/next-runs
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations/next-runs" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "automationId": 3,
    "name": "Scheduled wipe",
    "builtinKey": "scheduled_wipe",
    "at": "2026-10-01T18:00:00.000Z"
  }
]
GET /api/automations/catalog The triggers, conditions and actions available, and which actions this key may use. automation · view

The triggers, conditions and actions available, and which actions this key may use.

Parameters

No parameters

Request

GET /api/automations/catalog
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations/catalog" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "triggers": [
    "time",
    "server",
    "player_join",
    "player_leave",
    "player_count",
    "chat_command",
    "chat_message",
    "console",
    "update_available",
    "wipe",
    "report",
    "manual"
  ],
  "conditions": [
    "server_running",
    "player_count",
    "time",
    "forced_wipe_day",
    "framework",
    "variable",
    "cooldown",
    "trigger_id",
    "player_is_admin",
    "automation_enabled",
    "and",
    "or",
    "not"
  ],
  "actions": [
    { "kind": "say", "family": "talk", "permission": null, "allowed": true },
    {
      "kind": "server_restart",
      "family": "server",
      "permission": "server",
      "allowed": false
    }
  ],
  "chatPrefix": "!",
  "sayPrefix": "[RSM]"
}

Shortened. allowed is false for actions this key can’t use.

GET /api/automations/templates Ready-made automations. automation · view

Ready-made automations.

Parameters

No parameters

Request

GET /api/automations/templates
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations/templates" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "key": "daily_restart",
    "category": "restarts",
    "name": "Daily restart",
    "definition": {
      "mode": "single",
      "triggers": [
        {
          "kind": "time",
          "schedule": { "every": "day", "time": "05:00" },
          "catchUp": "short"
        }
      ],
      "conditions": [],
      "actions": [
        {
          "kind": "countdown",
          "seconds": 600,
          "marks": [600, 300, 60],
          "text": "Daily restart in {countdown}."
        },
        { "kind": "server_restart" }
      ]
    },
    "requiredPermissions": ["server"],
    "allowed": true,
    "blocked": null
  }
]
POST /api/automations Creates an automation. automation · manage

Creates an automation.

Parameters

InDescription
bodyname, description, enabled, definition — the easiest way to get a valid definition is to build one in RSM Web and read it back with GET

Request

POST /api/automations
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "name": "Daily restart",
  "description": "",
  "enabled": true,
  "definition": "(a template’s definition)"
}
curl -X POST "$RSM_URL/api/automations" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Daily restart","description":"","enabled":true,"definition":"(a template’s definition)"}'

Responses

CodeExample
201 Created
The new automation, as GET /api/automations/{id} returns it.
PUT /api/automations/{id} Changes an automation. Send back the version you read; 409 if someone changed it since. automation · manage

Changes an automation. Send back the version you read; 409 if someone changed it since.

Parameters

No parameters

Request

PUT /api/automations/7
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "version": 3,
  "name": "!pop command",
  "enabled": true,
  "definition": {
    "mode": "parallel",
    "max": 10,
    "triggers": [
      {
        "kind": "chat_command",
        "command": "pop",
        "channels": ["global", "team"],
        "allow": "everyone",
        "cooldownSeconds": 30
      }
    ],
    "conditions": [],
    "actions": [
      { "kind": "reply", "text": "{players}/{maxPlayers} players online." }
    ]
  }
}
curl -X PUT "$RSM_URL/api/automations/7" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"version":3,"name":"!pop command","enabled":true,"definition":{"mode":"parallel","max":10,"triggers":[{"kind":"chat_command","command":"pop","channels":["global","team"],"allow":"everyone","cooldownSeconds":30}],"conditions":[],"actions":[{"kind":"reply","text":"{players}/{maxPlayers} players online."}]}}'

Responses

CodeExample
200 OK
The automation with its new version.

A stale version gets 409 and nothing is saved.

POST /api/automations/{id}/enabled Switches an automation on or off. automation · manage

Switches an automation on or off.

Parameters

InDescription
bodyenabled — true or false

Request

POST /api/automations/7/enabled
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "enabled": false }
curl -X POST "$RSM_URL/api/automations/7/enabled" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'

Responses

CodeExample
200 OK
The automation, now switched off.
POST /api/automations/{id}/run Runs it now. automation · manage

Runs it now.

Parameters

No parameters

Request

POST /api/automations/7/run
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/automations/7/run" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true, "runId": 213, "queued": false }
POST /api/automations/{id}/reset Puts a built-in automation back to its defaults. automation · manage

Puts a built-in automation back to its defaults.

Parameters

No parameters

Request

POST /api/automations/7/reset
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/automations/7/reset" \
  -H "Authorization: Bearer $RSM_KEY"
DELETE /api/automations/{id} Deletes an automation you made. Built-ins can only be switched off or reset. automation · manage

Deletes an automation you made. Built-ins can only be switched off or reset.

Parameters

No parameters

Request

DELETE /api/automations/7
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/automations/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }
GET /api/automations/settings The chat-command prefix and the tag in front of every Say. automation · view

The chat-command prefix and the tag in front of every Say.

Parameters

No parameters

Request

GET /api/automations/settings
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automations/settings" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "chatPrefix": "!", "sayPrefix": "[RSM]" }
PUT /api/automations/settings Changes them. automation · manage

Changes them.

Parameters

InDescription
bodychatPrefix, sayPrefix

Request

PUT /api/automations/settings
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "chatPrefix": "/", "sayPrefix": "[Server]" }
curl -X PUT "$RSM_URL/api/automations/settings" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"chatPrefix":"/","sayPrefix":"[Server]"}'

Responses

CodeExample
200 OK
{ "chatPrefix": "/", "sayPrefix": "[Server]" }
GET /api/automation-runs Recent runs across every automation. automation · view

Recent runs across every automation.

Parameters

No parameters

Request

GET /api/automation-runs
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automation-runs" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 212,
    "automationId": 7,
    "automationName": "!pop command",
    "startedAt": "2026-09-26T13:58:40.112Z",
    "finishedAt": "2026-09-26T13:58:40.190Z",
    "status": "succeeded",
    "trigger": {
      "kind": "chat_command",
      "index": 0,
      "at": "2026-09-26T13:58:40.112Z",
      "event": {
        "type": "chat",
        "channel": "global",
        "steamId": "76561198000000002",
        "name": "Mira",
        "message": "!pop",
        "isAdmin": false,
        "at": 1790431120112
      }
    },
    "trace": [
      {
        "path": "actions[0]",
        "kind": "reply",
        "startedAt": "2026-09-26T13:58:40.115Z",
        "result": "ok",
        "finishedAt": "2026-09-26T13:58:40.189Z"
      }
    ],
    "error": "",
    "cancelledBy": ""
  }
]
GET /api/automation-runs/{id} One run, step by step. automation · view

One run, step by step.

Parameters

No parameters

Request

GET /api/automation-runs/7
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automation-runs/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "id": 212,
  "automationId": 7,
  "automationName": "!pop command",
  "startedAt": "2026-09-26T13:58:40.112Z",
  "finishedAt": "2026-09-26T13:58:40.190Z",
  "status": "succeeded",
  "trigger": {
    "kind": "chat_command",
    "index": 0,
    "at": "2026-09-26T13:58:40.112Z",
    "event": {
      "type": "chat",
      "channel": "global",
      "steamId": "76561198000000002",
      "name": "Mira",
      "message": "!pop",
      "isAdmin": false,
      "at": 1790431120112
    }
  },
  "trace": [
    {
      "path": "actions[0]",
      "kind": "reply",
      "startedAt": "2026-09-26T13:58:40.115Z",
      "result": "ok",
      "finishedAt": "2026-09-26T13:58:40.189Z"
    }
  ],
  "error": "",
  "cancelledBy": ""
}
POST /api/automation-runs/{id}/cancel Cancels a run in progress. automation · manage

Cancels a run in progress.

Parameters

No parameters

Request

POST /api/automation-runs/7/cancel
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/automation-runs/7/cancel" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true, "deferred": false }
GET /api/automation/config Auto-update and auto-restart settings. automation · view

Auto-update and auto-restart settings.

Parameters

No parameters

Request

GET /api/automation/config
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automation/config" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "autoUpdateEnabled": true,
  "branch": "main",
  "updateNoticeMinutes": 15,
  "waitForOxideUpdate": true,
  "oxideWaitCapMinutes": 120,
  "restartWarningMinutes": 10,
  "customized": false,
  "automationId": 1
}
PUT /api/automation/config Changes them; send only the fields you want to change. automation · manage

Changes them; send only the fields you want to change.

Parameters

No parameters

GET /api/automation/log Everything automation has done to the server. automation · view

Everything automation has done to the server.

Parameters

InDescription
querylimit

Request

GET /api/automation/log?limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/automation/log?limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "ts": "2026-09-26T05:26:49.833Z",
    "type": "update-available-manual",
    "message": "A server update is available. Automatic updates are off — apply it from the Server Installer.",
    "meta": { "kind": "server", "version": "25461207" }
  }
]

Discord

GET /api/discord/status Whether the bot is connected, and to which server. discord · view

Whether the bot is connected, and to which server.

Parameters

No parameters

Request

GET /api/discord/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/discord/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "status": "connected",
  "error": "",
  "guildName": "My Rust Community",
  "channelName": "server-status",
  "avatarUrl": "https://cdn.discordapp.com/avatars/….png"
}
GET /api/discord/config The bot’s settings. The bot token is blank unless the key has discord manage. discord · view

The bot’s settings. The bot token is blank unless the key has discord manage.

Parameters

No parameters

Request

GET /api/discord/config
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/discord/config" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "enabled": true,
  "botToken": "",
  "guildId": "300000000000000001",
  "displayName": "Rust Bot",
  "channelId": "300000000000000002",
  "messageId": "300000000000000003",
  "showPlayers": true,
  "showMap": true,
  "showFps": true,
  "showMemory": false,
  "showUptime": true,
  "buttonStart": true,
  "buttonStop": true,
  "buttonRestart": true,
  "buttonSave": true,
  "buttonWipeNow": false,
  "chatChannelId": "300000000000000004",
  "relayChat": true,
  "relayDiscordChat": false,
  "eventsChannelId": "",
  "relayJoins": true,
  "relayServerStatus": true,
  "showPresence": true
}

botToken is blank because this key only has discord view.

PUT /api/discord/config Changes the bot’s settings; send only the fields you want to change. discord · manage

Changes the bot’s settings; send only the fields you want to change.

Parameters

No parameters

POST /api/discord/test-connection Checks the bot token and connection. discord · manage

Checks the bot token and connection.

Parameters

No parameters

Request

POST /api/discord/test-connection
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/discord/test-connection" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }
POST /api/discord/avatar Sets the bot’s avatar (multipart form: PNG, JPEG, GIF or WEBP). discord · manage

Sets the bot’s avatar (multipart form: PNG, JPEG, GIF or WEBP).

Parameters

No parameters

GET /api/discord/channels Channels on the connected Discord server. discord · manage

Channels on the connected Discord server.

Parameters

No parameters

Request

GET /api/discord/channels
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/discord/channels" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  { "id": "300000000000000002", "name": "server-status" },
  { "id": "300000000000000004", "name": "game-chat" }
]
GET /api/discord/members Members of the Discord server and the RSM group each one is in. discord · manage

Members of the Discord server and the RSM group each one is in.

Parameters

No parameters

Request

GET /api/discord/members
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/discord/members" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": "310000000000000001",
    "username": "mira",
    "avatarUrl": "https://cdn.discordapp.com/avatars/….png",
    "groupId": 3,
    "groupName": "Moderators",
    "inGuild": true
  }
]
GET /api/discord/groups RSM groups a member can be put in. discord · manage

RSM groups a member can be put in.

Parameters

No parameters

Request

GET /api/discord/groups
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/discord/groups" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[{ "id": 1, "name": "Administrators" }, { "id": 3, "name": "Moderators" }]
PUT /api/discord/members/{discordId}/group Puts a Discord member in an RSM group, or takes them out. 403 for a group that holds access the key doesn’t. discord · manage

Puts a Discord member in an RSM group, or takes them out. 403 for a group that holds access the key doesn’t.

Parameters

InDescription
bodygroupId — a group id, or null

Request

PUT /api/discord/members/310000000000000001/group
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "groupId": 3 }
curl -X PUT "$RSM_URL/api/discord/members/310000000000000001/group" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"groupId":3}'

Responses

CodeExample
200 OK
{ "ok": true }

FilesTwo locations can be browsed: server (the Rust server folder) and rsmweb (RSM Web’s own folder). Every call takes a root and a path relative to it; nothing outside the two roots can be reached.

GET /api/files/roots The two locations and whether each is available. files · view

The two locations and whether each is available.

Parameters

No parameters

Request

GET /api/files/roots
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/files/roots" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "roots": [
    { "id": "server", "path": "/srv/rust", "available": true, "problem": null },
    {
      "id": "rsmweb",
      "path": "/opt/rsm-web",
      "available": true,
      "problem": null
    }
  ]
}
GET /api/files/list A folder’s contents. files · view

A folder’s contents.

Parameters

InDescription
queryroot, path

Request

GET /api/files/list?root=server&path=server/rsm/cfg
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/files/list?root=server&path=server/rsm/cfg" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "root": "server",
  "path": "server/rsm/cfg",
  "absolute": "/srv/rust/server/rsm/cfg",
  "entries": [
    {
      "name": "bans.cfg",
      "kind": "file",
      "size": 412,
      "modifiedAt": 1790430291517.5,
      "link": false,
      "external": false
    },
    {
      "name": "server.cfg",
      "kind": "file",
      "size": 1180,
      "modifiedAt": 1790412000312.2,
      "link": false,
      "external": false
    }
  ]
}
GET /api/files/read A text file’s content, with modifiedAt and lineEnding. Refuses binary and very large files. files · view

A text file’s content, with modifiedAt and lineEnding. Refuses binary and very large files.

Parameters

InDescription
queryroot, path

Request

GET /api/files/read?root=server&path=server/rsm/cfg/server.cfg
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/files/read?root=server&path=server/rsm/cfg/server.cfg" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "content": "server.hostname \"My Rust Server\"\nserver.maxplayers 100\n",
  "size": 1180,
  "modifiedAt": 1790412000312.2,
  "lineEnding": "lf"
}
GET /api/files/tail Follows a growing file (a log, say) as a stream of newline-delimited JSON: {"type":"append","text":"…"}, {"type":"reset"} when the file is truncated, and {"type":"ping"} to keep the connection open. files · view

Follows a growing file (a log, say) as a stream of newline-delimited JSON: {"type":"append","text":"…"}, {"type":"reset"} when the file is truncated, and {"type":"ping"} to keep the connection open.

Parameters

InDescription
queryroot, path

Request

GET /api/files/tail?root=server&path=oxide/logs/oxide_2026-09-26.txt
Authorization: Bearer rsm_your_key_here
curl -N "$RSM_URL/api/files/tail?root=server&path=oxide/logs/oxide_2026-09-26.txt" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{"type":"append","text":"14:02:11 [Info] Rook has connected\n"}
{"type":"ping"}
{"type":"append","text":"14:02:40 [Info] Mira has disconnected\n"}
POST /api/files/download-ticket Prepares a download and returns a ticket. Fetch GET /api/files/download?ticket=… within a minute to get the file, or a zip when you selected several items or a folder. Each ticket works once. files · view

Prepares a download and returns a ticket. Fetch GET /api/files/download?ticket=… within a minute to get the file, or a zip when you selected several items or a folder. Each ticket works once.

Parameters

InDescription
bodyroot, paths — array of paths

Request

POST /api/files/download-ticket
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "root": "server", "paths": ["server/rsm/cfg/server.cfg"] }
curl -X POST "$RSM_URL/api/files/download-ticket" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"root":"server","paths":["server/rsm/cfg/server.cfg"]}'

Responses

CodeExample
200 OK
{
  "ticket": "c1f0e6a4b8d2…",
  "filename": "server.cfg",
  "archive": false,
  "fileCount": 1
}
POST /api/files/write Saves a text file. files · manage

Saves a text file.

Parameters

InDescription
bodyroot, path, content, and optionally expectedModifiedAt (the modifiedAt you read — 409 if the file changed since) and lineEnding (lf or crlf)

Request

POST /api/files/write
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "root": "server",
  "path": "server/rsm/cfg/server.cfg",
  "content": "server.hostname \"My Rust Server\"\n",
  "expectedModifiedAt": 1790412000312.2
}
curl -X POST "$RSM_URL/api/files/write" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"root":"server","path":"server/rsm/cfg/server.cfg","content":"server.hostname \"My Rust Server\"\n","expectedModifiedAt":1790412000312.2}'

Responses

CodeExample
200 OK
{
  "ok": true,
  "size": 33,
  "modifiedAt": 1790431402113.9,
  "applied": "applied",
  "plugin": null
}

applied is applied when RSM Web told the running server to reload the file, offline when it will be read at the next start, and null when nothing needs reloading.

POST /api/files/upload Uploads files into a folder (multipart form). An existing file is only replaced with overwrite=1. files · manage

Uploads files into a folder (multipart form). An existing file is only replaced with overwrite=1.

Parameters

InDescription
queryroot, path, overwrite

Request

POST /api/files/upload?root=server&path=oxide/plugins
Authorization: Bearer rsm_your_key_here
Content-Type: multipart/form-data; boundary=…

file=@Kits.cs
file=@NTeleportation.cs
curl -X POST "$RSM_URL/api/files/upload?root=server&path=oxide/plugins" \
  -H "Authorization: Bearer $RSM_KEY" \
  -F "[email protected]" \
  -F "[email protected]"

Responses

CodeExample
200 OK
{
  "ok": true,
  "uploaded": ["Kits.cs"],
  "rejected": [
    {
      "name": "NTeleportation.cs",
      "reason": "Already exists",
      "code": "EXISTS"
    }
  ]
}
POST /api/files/create Creates an empty file. files · manage

Creates an empty file.

Parameters

InDescription
bodyroot, path (the folder), name
POST /api/files/mkdir Creates a folder. files · manage

Creates a folder.

Parameters

InDescription
bodyroot, path, name
POST /api/files/rename Renames a file or folder. files · manage

Renames a file or folder.

Parameters

InDescription
bodyroot, path, name (the new name)
POST /api/files/paste Copies or moves items into a folder, in either location. files · manage

Copies or moves items into a folder, in either location.

Parameters

InDescription
bodysourceRoot, paths, destRoot, destPath, mode (copy or move), overwrite

Request

POST /api/files/paste
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "sourceRoot": "server",
  "paths": ["oxide/config/Kits.json"],
  "destRoot": "server",
  "destPath": "backups",
  "mode": "copy",
  "overwrite": false
}
curl -X POST "$RSM_URL/api/files/paste" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"sourceRoot":"server","paths":["oxide/config/Kits.json"],"destRoot":"server","destPath":"backups","mode":"copy","overwrite":false}'

Responses

CodeExample
200 OK
{ "ok": true, "done": 1 }
POST /api/files/extract Extracts a .zip into a folder named after it. files · manage

Extracts a .zip into a folder named after it.

Parameters

InDescription
bodyroot, path, overwrite

Request

POST /api/files/extract
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "root": "server", "path": "maps.zip" }
curl -X POST "$RSM_URL/api/files/extract" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"root":"server","path":"maps.zip"}'

Responses

CodeExample
200 OK
{ "ok": true, "folder": "maps", "extracted": 12, "skipped": 0 }
POST /api/files/delete Deletes files and folders. files · manage

Deletes files and folders.

Parameters

InDescription
bodyroot, paths

Request

POST /api/files/delete
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "root": "server", "paths": ["oxide/logs/old.txt"] }
curl -X POST "$RSM_URL/api/files/delete" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"root":"server","paths":["oxide/logs/old.txt"]}'

Responses

CodeExample
200 OK
{ "ok": true, "deleted": 1 }

Notes and dashboards

GET /api/notes Every note page. notes · view

Every note page.

Parameters

No parameters

Request

GET /api/notes
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/notes" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 3,
    "slug": "rules",
    "title": "Rules",
    "category": "Server",
    "content": "# Rules\n\n1. No cheating.\n2. Max group size 4.",
    "source": "manual",
    "createdBy": "admin",
    "createdAt": "2026-09-01 10:12:40",
    "updatedAt": "2026-09-21 16:05:02"
  }
]
POST /api/notes Creates a note. notes · manage

Creates a note.

Parameters

InDescription
bodytitle, category, content (Markdown)

Request

POST /api/notes
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{
  "title": "Rules",
  "category": "Server",
  "content": "# Rules\n\n1. No cheating.\n2. Max group size 4."
}
curl -X POST "$RSM_URL/api/notes" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Rules","category":"Server","content":"# Rules\n\n1. No cheating.\n2. Max group size 4."}'

Responses

CodeExample
201 Created
{
  "id": 3,
  "slug": "rules",
  "title": "Rules",
  "category": "Server",
  "content": "# Rules\n\n1. No cheating.\n2. Max group size 4.",
  "source": "manual",
  "createdBy": "admin",
  "createdAt": "2026-09-01 10:12:40",
  "updatedAt": "2026-09-21 16:05:02"
}
PUT /api/notes/{slug} Changes a note; send only the fields you want to change. notes · manage

Changes a note; send only the fields you want to change.

Parameters

No parameters

DELETE /api/notes/{slug} Deletes a note. notes · manage

Deletes a note.

Parameters

No parameters

Request

DELETE /api/notes/rules
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/notes/rules" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true }
GET /api/dashboards Dashboard views: the key creator’s own, plus public ones. dashboard · view

Dashboard views: the key creator’s own, plus public ones.

Parameters

No parameters

Request

GET /api/dashboards
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/dashboards" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 7,
    "name": "Wipe day",
    "visibility": "public",
    "sortOrder": 0,
    "layout": [
      {
        "i": "5f0c9a1e7b3d42c8a6e1f4b2d9c07a35",
        "cardType": "players",
        "x": 0,
        "y": 0,
        "w": 6,
        "h": 8,
        "options": {}
      },
      {
        "i": "b81d3e6f20a94c57931c8e5a7f2d604b",
        "cardType": "metric",
        "x": 6,
        "y": 0,
        "w": 3,
        "h": 4,
        "title": "Server FPS",
        "options": {
          "metric": "fps",
          "range": "1h",
          "display": "value",
          "showStats": true
        }
      }
    ],
    "createdBy": 1,
    "updatedBy": 1,
    "createdAt": "2026-09-12 09:30:00",
    "updatedAt": "2026-09-12 09:30:00"
  }
]
GET /api/dashboards/{id} One view and its layout. dashboard · view

One view and its layout.

Parameters

No parameters

Request

GET /api/dashboards/7
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/dashboards/7" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "id": 7,
  "name": "Wipe day",
  "visibility": "public",
  "sortOrder": 0,
  "layout": [
    {
      "i": "5f0c9a1e7b3d42c8a6e1f4b2d9c07a35",
      "cardType": "players",
      "x": 0,
      "y": 0,
      "w": 6,
      "h": 8,
      "options": {}
    },
    {
      "i": "b81d3e6f20a94c57931c8e5a7f2d604b",
      "cardType": "metric",
      "x": 6,
      "y": 0,
      "w": 3,
      "h": 4,
      "title": "Server FPS",
      "options": {
        "metric": "fps",
        "range": "1h",
        "display": "value",
        "showStats": true
      }
    }
  ],
  "createdBy": 1,
  "updatedBy": 1,
  "createdAt": "2026-09-12 09:30:00",
  "updatedAt": "2026-09-12 09:30:00"
}

cardType is console, controls, quickcmds, notes, status, serverinfo, metric, metrics, health, livemap, players or activity.

POST /api/dashboards Creates a view owned by the key’s creator. dashboard · manage

Creates a view owned by the key’s creator.

Parameters

InDescription
bodyname, visibility (private or public), and optionally layout — the easiest way to get a valid layout is to arrange a view in RSM Web and read it back with GET

Request

POST /api/dashboards
Authorization: Bearer rsm_your_key_here
Content-Type: application/json

{ "name": "Wipe day", "visibility": "public" }
curl -X POST "$RSM_URL/api/dashboards" \
  -H "Authorization: Bearer $RSM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Wipe day","visibility":"public"}'

Responses

CodeExample
201 Created
{
  "id": 7,
  "name": "Wipe day",
  "visibility": "public",
  "sortOrder": 0,
  "layout": [],
  "createdBy": 1,
  "updatedBy": 1,
  "createdAt": "2026-09-12 09:30:00",
  "updatedAt": "2026-09-12 09:30:00"
}
PUT /api/dashboards/{id} Changes a view. dashboard · manage

Changes a view.

Parameters

InDescription
bodyname, visibility, layout, sortOrder
DELETE /api/dashboards/{id} Deletes a view. dashboard · manage

Deletes a view.

Parameters

No parameters

Request

DELETE /api/dashboards/7
Authorization: Bearer rsm_your_key_here
curl -X DELETE "$RSM_URL/api/dashboards/7" \
  -H "Authorization: Bearer $RSM_KEY"

RSM Web updates

GET /api/app-update/status The installed RSM Web version, the latest release, the state of any update in progress, and whether the Rust server is running. appupdate · view

The installed RSM Web version, the latest release, the state of any update in progress, and whether the Rust server is running.

Parameters

No parameters

Request

GET /api/app-update/status
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/app-update/status" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{
  "installedVersion": "2026.09.21.1183",
  "latestVersion": "2026.09.26.713",
  "changelogHtml": "<h2>Security</h2>\n<ul>…</ul>",
  "checkedAt": "2026-09-26T15:13:55.865Z",
  "updateAvailable": true,
  "update": {
    "status": "idle",
    "progress": 0,
    "logs": [],
    "targetVersion": null,
    "error": null
  },
  "serverRunning": false
}
GET /api/app-update/log The last lines of the most recent update’s log. appupdate · view

The last lines of the most recent update’s log.

Parameters

InDescription
querylimit (1–50, default 20)

Request

GET /api/app-update/log?limit=1
Authorization: Bearer rsm_your_key_here
curl "$RSM_URL/api/app-update/log?limit=1" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
[
  {
    "id": 3,
    "at": "2026-09-26T15:14:24.863Z",
    "user_id": 1,
    "from_version": "2026.09.21.1183",
    "to_version": "2026.09.26.713",
    "outcome": "completed",
    "detail": "Confirmed healthy after restart"
  }
]
POST /api/app-update/check Checks for an update now. appupdate · manage

Checks for an update now.

Parameters

No parameters

Request

POST /api/app-update/check
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/app-update/check" \
  -H "Authorization: Bearer $RSM_KEY"
POST /api/app-update/start Installs the update and restarts RSM Web. The Rust server must be stopped first (409 SERVER_RUNNING). appupdate · manage

Installs the update and restarts RSM Web. The Rust server must be stopped first (409 SERVER_RUNNING).

Parameters

No parameters

Request

POST /api/app-update/start
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/app-update/start" \
  -H "Authorization: Bearer $RSM_KEY"

Responses

CodeExample
200 OK
{ "ok": true, "restarting": true }
POST /api/app-update/restore Goes back to the version before the last update. appupdate · manage

Goes back to the version before the last update.

Parameters

No parameters

Request

POST /api/app-update/restore
Authorization: Bearer rsm_your_key_here
curl -X POST "$RSM_URL/api/app-update/restore" \
  -H "Authorization: Bearer $RSM_KEY"