Для AI-агентов: markdown этой страницы — /docs-content/infra/lifecycle/run-mode.md индекс документации — /llms.txt

Сменить режим работы сервера

PATCH /v1/infra/servers/:id/run-mode

Переводит BLACKHOLE-сервер в один из трёх режимов работы: засыпает, когда нет запросов, работает по расписанию или работает круглосуточно. Режим определяет счёт за сервер, поэтому запрос либо выполняется целиком, либо отклоняется, ничего не изменив.

Пока режимы работы не включены для портала, запрос отклоняется с 400 RUN_MODE_UNAVAILABLE. Текущий режим при этом читается всегда — поля runMode и workSchedule в GET /v1/infra/servers/:id.

Параметры

Параметр В Тип Обяз. Описание
id path string да ID сервера в режиме BLACKHOLE. Источник — список серверов

Поля запроса (body)

Тело — одна из трёх форм, выбранная полем mode. Поле, которое выбранная форма не принимает, отклоняется с VALIDATION_ERROR, а не отбрасывается.

Поле Тип Обяз. Описание
mode string да IDLE — засыпает, когда нет запросов. SCHEDULE — работает в окна расписания и спит вне их. ALWAYS — работает круглосуточно
idleMinutes number при IDLE Минут без запросов до засыпания: 15, 30, 60 или 240
scheduleId string при SCHEDULE ID расписания того же портала. Источник — библиотека расписаний

Примеры

curl — личный ключ

Terminal
curl -X PATCH https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/run-mode \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode": "SCHEDULE", "scheduleId": "WORK_SCHEDULE_ID"}'

curl — OAuth-приложение

Terminal
curl -X PATCH https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/run-mode \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "SCHEDULE", "scheduleId": "WORK_SCHEDULE_ID"}'

JavaScript — личный ключ

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/run-mode`,
  {
    method: 'PATCH',
    headers: {
      'X-Api-Key': 'YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ mode: 'SCHEDULE', scheduleId: workScheduleId }),
  }
)
const { data } = await res.json()
console.log(`Режим: ${data.runMode}, ближайшее пробуждение: ${data.nextScheduledWakeAt}`)

JavaScript — OAuth-приложение

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/run-mode`,
  {
    method: 'PATCH',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ mode: 'SCHEDULE', scheduleId: workScheduleId }),
  }
)
const { data } = await res.json()

Поля ответа

Ответ — поля режима, прочитанные после записи. Та же форма приходит в GET /v1/infra/servers/:id.

Поле Тип Описание
success boolean Всегда true при успехе
data.runMode string Режим после записи: IDLE, SCHEDULE или ALWAYS
data.sleepAfterMinutes number | null Сохранённый порог простоя в минутах. В режиме SCHEDULE это запомненное значение: оно не действует, пока назначено расписание, и не стирается им
data.workSchedule object | null Назначенное расписание или null
data.workSchedule.id string ID расписания
data.workSchedule.name string | null Название своего расписания. У готового расписания платформы null — оно опознаётся по presetKey
data.workSchedule.presetKey string | null Ключ готового расписания: weekdays-9-18, weekdays-8-20, daily-9-21. У своего — null
data.workSchedule.timezone string Часовой пояс IANA, в котором читаются окна
data.workSchedule.windows array Окна по дням недели: isoDay от 1 (понедельник) до 7, start и end — местное время ЧЧ:ММ. В одном дне бывает два окна
data.nextScheduledWakeAt string (ISO 8601) | null Ближайшее запланированное пробуждение с учётом опережения. null, если пробуждений не запланировано

Пример ответа

JSON
{
  "success": true,
  "data": {
    "runMode": "SCHEDULE",
    "sleepAfterMinutes": 30,
    "workSchedule": {
      "id": "cmfp4r0q2000a1ocg7h2k9x3d",
      "name": "Смены склада",
      "presetKey": null,
      "timezone": "Europe/Moscow",
      "windows": [
        { "isoDay": 1, "start": "09:00", "end": "18:00" },
        { "isoDay": 2, "start": "09:00", "end": "13:00" },
        { "isoDay": 2, "start": "14:00", "end": "24:00" }
      ]
    },
    "nextScheduledWakeAt": "2026-09-21T05:51:00.000Z"
  }
}

Пример ответа при ошибке

400 — сон по простою запрошен для сервера агента:

JSON
{
  "success": false,
  "error": {
    "code": "AGENT_IDLE_SLEEP_FORBIDDEN",
    "message": "idle sleep is not available for agents and bots: they must stay reachable"
  }
}

Ошибки

HTTP Код Описание
400 VALIDATION_ERROR Тело не подходит ни под одну из трёх форм: неизвестное поле, idleMinutes вне 15, 30, 60, 240, нет scheduleId
400 RUN_MODE_UNAVAILABLE Режимы работы ещё не включены для портала
400 BLACKHOLE_ONLY Сервер не в режиме BLACKHOLE
400 GALAXY_NOT_SUPPORTED Сервер — хост галактики. Своего режима у хоста нет: он работает, пока работает хоть одно его приложение, поэтому режим задаётся приложениям
400 AGENT_IDLE_SLEEP_FORBIDDEN Запрошен IDLE для сервера агента или бота — у таких серверов поле createdVia равно agent или bot. Доступны SCHEDULE и ALWAYS
400 WORK_SCHEDULE_EMPTY У расписания нет ни одного окна
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Ключ не опознан: такой строки на платформе нет
403 INFRA_SCOPE_REQUIRED У ключа нет скоупа vibe:infra
403 INFRA_FORBIDDEN_FOR_COWORK_KEY Вызов сделан ключом Cowork/Code — такой ключ работает только с данными, изменяющие операции ему закрыты. Что делать — Проектный ключ для деплоя
403 WRITE_BLOCKED_READONLY_KEY Ключ в режиме «только чтение» — запись режима ему закрыта
403 GALAXY_DISABLED Сервер — приложение галактики, а галактики выключены для портала
403 SERVER_ROLE_FORBIDDEN Вы состоите в команде разработки этого сервера с ролью «Разработчик», а операция открыта роли «Администратор». В error.hint придут ваша роль, требуемый порог и перечень открытых вам вызовов. Разбор ролей — Список серверов
404 NOT_FOUND Сервер не существует, удалён или привязан к другому API-ключу, и вы не состоите в его команде разработки
404 WORK_SCHEDULE_NOT_FOUND Расписания с таким scheduleId нет в портале ключа. Расписание другого портала отвечает так же — ответ не подтверждает, что оно существует
429 RATE_LIMITED Превышен лимит 20 запросов в минуту на ключ. Точное значение — в заголовке x-ratelimit-limit (потолок делится на реплики)

Полный список общих ошибок API — Ошибки.

Известные особенности

  • Расписание сильнее порога простоя. Пока серверу назначено расписание, он работает в его окна и засыпает после них, а сохранённый sleepAfterMinutes не действует. При переходе в SCHEDULE порог не стирается: если расписание потом удалят с согласием на перевод машин, приложение вернётся в IDLE именно с этим числом — см. Удалить расписание.
  • Окна расписания превращаются в пробуждения сервера. Платформа поднимает сервер к началу каждого окна с опережением, а после конца окна сервер засыпает по платформенному таймауту простоя. Эти пробуждения не видны в списке окон пробуждения и не правятся через него — их меняет само расписание. Окна, заведённые вручную, режим не затрагивает.
  • Запрос вне окна тоже будит сервер. Обращение к HTTPS-субдомену будит спящий сервер и вне окон расписания — на условиях автоматического пробуждения. Время такой работы оплачивается по ставке работающей машины.
  • Приложение галактики получает режим, как отдельный сервер. Галактика засыпает, только когда спят все её приложения. Расписание одному агенту из двух ничего не экономит, пока второй работает круглосуточно: режим задаётся всем приложениям, которые не должны держать галактику включённой.
  • Запись через /sleep снимает расписание. Число в sleepAfterMinutes переводит сервер в IDLE, null — в ALWAYS, и назначенное расписание в обоих случаях снимается.

Смотрите также