Для 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 — личный ключ
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-приложение
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 — личный ключ
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-приложение
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, если пробуждений не запланировано |
Пример ответа
{
"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 — сон по простою запрошен для сервера агента:
{
"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, и назначенное расписание в обоих случаях снимается.