WardenCoredocs
APIЭндпоинты

Команды

Выполнение админ-команд на игровом сервере, каталог доступных команд и история выполненного.

Выполняйте те же админ-команды, что и консоль в панели, из своих скриптов и ботов.

`commands:execute` — самый широкий скоуп в этом API

Ключ с ним может выполнить любую админ-команду, разрешённую на вашем сервере: кикнуть и забанить игрока, заспавнить предметы, телепортировать, сменить погоду, выключить сервер. Ограничивает его только ваш собственный чёрный список команд, средствами API сузить нельзя.

Выдавайте такой ключ редко, не смешивайте с ключами только для чтения и включайте IP-allowlist для ключа.

POST /v1/commands

Команда отправляется структурно: глагол и аргументы остаются отдельными полями, а не одной набранной строкой. Не приходится гадать с кавычками, а аргумент с пробелами просто работает.

Скоуп: commands:execute.

ПолеТипСмысл
verbстрокаИмя команды, один токен (например, Announce).
argsstring[]Позиционные аргументы в том порядке, в каком их объявляет команда. Необязательно.
subjectобъектК кому или куда применяется команда. Необязательно.

subject — либо игрок, либо точка, но не оба сразу:

  • { "player": "76561198000000000" } — Steam64 или реф вида discord:123456789012345678.
  • { "x": 1000, "y": 2000, "z": 300 } — координаты в мире.

Для команды по всему серверу не передавайте его вовсе.

Формы рефа ведут себя по-разному. Реф discord: обязан разрешиться: непривязанный идентификатор даёт 404, и команда не уходит. Корректный Steam64 принимается как есть — команда вправе целиться в того, кого ещё нет в ростере, — она выполнится в любом случае, а subject.discord_id вернётся как null, если записи не нашлось.

POST /v1/commands
Content-Type: application/json

{ "verb": "Announce", "args": ["Рестарт сервера через 10 минут"] }
{ "verb": "Announce", "success": true, "result": "OK|{}", "subject": null }

`success: false` — это всё ещё 200

200 означает, что команда дошла до игрового сервера. Принял ли её сервер — в поле success, а его собственное объяснение — в result, например "No online player to route the command through".

Проверяйте success, а не только статус. HTTP-ошибки здесь означают проблемы транспорта, авторизации или валидации, но не отказ игры выполнить команду.

GET /v1/commands/catalog

Все команды, которые отдаёт сервер, вместе с типами аргументов. По нему можно понять, что вообще можно выполнить, и проверить аргументы до отправки.

Скоуп: commands:read.

{
  "version": 1,
  "data": [
    {
      "verb": "ChangeCurrencyBalance",
      "level": 1,
      "target_mode": "arg_targeted",
      "output_mode": "silent",
      "requires_online": true,
      "direct_spawn_capable": false,
      "args": [
        {
          "name": "Currency Type",
          "type_name": "Currency Type Name",
          "description": "",
          "data_type": "String",
          "completion": "CurrencyType",
          "required": true,
          "repeating": false,
          "values": ["Normal", "Gold"]
        }
      ]
    }
  ]
}
  • requires_online — команде нужен хотя бы один подключённый игрок, через которого её передать.
  • values — допустимые значения аргумента с фиксированным выбором. Пусто, когда значения динамические (название предмета, игрок, транспорт) — их подставляйте сами.
  • level — ранг исполнителя, которого требует игра: 0 обычный, 1 админ, 2 супер-админ, 3 повышенный, 4 разработчик.

Команды приходят отсортированными по verb, поэтому одинаковые ответы совпадают побайтово. Эндпоинт поддерживает условные запросы: верните ETag в If-None-Match — пока каталог не изменился, придёт 304.

503 сразу после рестарта сервера

Каталог собирается один раз, когда игровой сервер закончил загрузку. До этого эндпоинт отвечает 503 server_unavailable с подсказкой о повторе. Подождите несколько секунд и вызовите снова.

GET /v1/commands/history

Выполненные команды, свежие сверху, независимо от того, кто их запустил: этот API, консоль панели, команда в Discord или задача по расписанию.

Скоуп: commands:read.

ПараметрСмысл
commandКоманды, содержащие этот текст.
start_date / end_dateГраницы окна, включительно. Формат — ниже.
limit, cursorРазмер страницы (1–100, по умолчанию 50) и непрозрачный курсор из next_cursor.

Границы принимают либо YYYY-MM-DD, либо YYYY-MM-DD HH:MM:SS[.mmm] по локальным часам игрового сервера — тем же, что показывает поле at. Голая start_date разворачивается в 00:00:00.000 этого дня, голая end_date — в 23:59:59.999, поэтому один день задаётся как start_date=end_date. Всё остальное отклоняется с 400.

{
  "data": [
    {
      "at": "2026-08-04 10:00:00",
      "command": "Announce Рестарт сервера через 10 минут",
      "result": "OK",
      "actor": { "steam_id": "76561198000000009", "discord_id": "123456789012345678" }
    }
  ],
  "has_more": true,
  "next_cursor": "eyJvZmZzZXQiOjUwfQ"
}

actor — оператор, выполнивший команду: steam_id, рядом с ним discord_id, если у оператора есть привязка. Оба равны null, когда запись не удалось связать с человеком, а сам actor равен null в записях, сделанных версией сервера старше этого поля.

IP-адреса вызывающих не отдаются и не фильтруются

Игровой сервер записывает сетевой адрес для непривязанных записей, и это может быть адрес браузера администратора. Ключи с commands:read его не видят, и фильтра ip тоже нет: сервер сопоставляет это поле по подстроке, поэтому фильтрация позволила бы восстанавливать адреса по октету. Владельцу сервера они по-прежнему видны в консоли панели.

История не кэшируется — в ней записано, кто и что делал на вашем сервере.

Ошибки

СтатусКодКогда
400validation_errorverb из нескольких токенов, управляющие символы в аргументе или subject сразу с игроком и координатами.
403insufficient_scopeУ ключа нет commands:execute или commands:read.
404not_foundРеф discord: в subject.player без привязанного игрока. На Steam64 этой ошибки не бывает.
503server_unavailableИгровой сервер не на связи либо его каталог команд ещё не собран.

Содержание