Команды
Выполнение админ-команд на игровом сервере, каталог доступных команд и история выполненного.
Выполняйте те же админ-команды, что и консоль в панели, из своих скриптов и ботов.
`commands:execute` — самый широкий скоуп в этом API
Ключ с ним может выполнить любую админ-команду, разрешённую на вашем сервере: кикнуть и забанить игрока, заспавнить предметы, телепортировать, сменить погоду, выключить сервер. Ограничивает его только ваш собственный чёрный список команд, средствами API сузить нельзя.
Выдавайте такой ключ редко, не смешивайте с ключами только для чтения и включайте IP-allowlist для ключа.
POST /v1/commands
Команда отправляется структурно: глагол и аргументы остаются отдельными полями, а не одной набранной строкой. Не приходится гадать с кавычками, а аргумент с пробелами просто работает.
Скоуп: commands:execute.
| Поле | Тип | Смысл |
|---|---|---|
verb | строка | Имя команды, один токен (например, Announce). |
args | string[] | Позиционные аргументы в том порядке, в каком их объявляет команда. Необязательно. |
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 тоже нет: сервер
сопоставляет это поле по подстроке, поэтому фильтрация позволила бы восстанавливать адреса по
октету. Владельцу сервера они по-прежнему видны в консоли панели.
История не кэшируется — в ней записано, кто и что делал на вашем сервере.
Ошибки
| Статус | Код | Когда |
|---|---|---|
400 | validation_error | verb из нескольких токенов, управляющие символы в аргументе или subject сразу с игроком и координатами. |
403 | insufficient_scope | У ключа нет commands:execute или commands:read. |
404 | not_found | Реф discord: в subject.player без привязанного игрока. На Steam64 этой ошибки не бывает. |
503 | server_unavailable | Игровой сервер не на связи либо его каталог команд ещё не собран. |