Для AI-агентов: markdown этой страницы — /docs-content/infra/wake-schedules/create.md индекс документации — /llms.txt
Создать окно пробуждения
POST /v1/infra/servers/:id/wake-schedules
Объявляет новое повторяющееся окно пробуждения для сервера в режиме BLACKHOLE. Тело передаётся плоским объектом, без обёртки fields.
Параметры
| Параметр | В | Тип | Обяз. | Описание |
|---|---|---|---|---|
Параметрid |
Вpath | Типstring (UUID) | Обяз.да | ОписаниеID BLACKHOLE-сервера |
Поля запроса (body)
| Поле | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
ПолеcronExpr |
Типstring | Обяз.да | По умолч.— | Описание5-польное cron-выражение (минута час день-месяца месяц день-недели), от 9 до 120 символов |
Полеtimezone |
Типstring | Обяз.да | По умолч.— | Описаниечасовой пояс окна в формате IANA, например Europe/Moscow. Проверяется по списку Intl.supportedValuesOf('timeZone') — незнакомое значение отклоняется на этапе валидации |
Полеlabel |
Типstring | Обяз.нет | По умолч.— | ОписаниеМетка окна для отображения, до 80 символов |
Полеlead |
Типnumber | Обяз.нет | По умолч.запас сервера, иначе запас платформы | ОписаниеЗапас в секундах перед моментом cronExpr, на который сервер должен быть уже поднят — покрывает время старта виртуальной машины. От 0 до 3600. Значение меньше платформенного запаса поднимается до него |
Полеenabled |
Типboolean | Обяз.нет | По умолч.true |
ОписаниеАктивно ли окно. Отключённое окно не участвует в пробуждении, но остаётся в списке |
Запас lead разрешает три уровня: значение самого окна, иначе запас сервера, заданный отдельно от этого раздела CRUD, иначе запас платформы. Запас платформы служит и нижней границей: меньшее значение сохраняется в окне как передано, но подъём всё равно начинается не позже, чем за платформенный запас до момента cronExpr. У сервера kind: "GALAXY_APP" запас платформы больше, чем у отдельной машины: пробуждение проходит два этапа — подъём хоста и старт контейнера.
Включённое окно влияет и на авто-сон. На вытесняемом тарифе при сохранённом sleepAfterMinutes: null («Никогда») после расчёта следующего пробуждения фактическим таймаутом становится платформенный запас после окна — по умолчанию 15 минут простоя. На невытесняемом тарифе создание или обновление окна при null отклоняется даже с enabled: false. Платформенный таймаут после окна там возможен только для уже существующей комбинации настроек. Явно заданное число остаётся фактическим таймаутом и расписанием не сокращается. Отключённое окно эту политику не меняет. Отказ при null на невытесняемом тарифе к приложению в галактике не относится: тариф оно не выбирает, а наследует от галактики. Не относится он и к серверу в режиме работы SCHEDULE: сон у него объявлен расписанием.
Примеры
curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/wake-schedules" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"cronExpr": "0 9 * * 1-5",
"timezone": "Europe/Moscow",
"label": "daily report",
"enabled": true
}'
curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/wake-schedules" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"cronExpr": "0 9 * * 1-5",
"timezone": "Europe/Moscow",
"label": "daily report",
"enabled": true
}'
JavaScript — личный ключ
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/wake-schedules`,
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
cronExpr: '0 9 * * 1-5',
timezone: 'Europe/Moscow',
label: 'daily report',
enabled: true,
}),
}
)
const body = await res.json()
if (body.tzWarningCode === 'MULTI_ZONE') {
console.warn('Окна расходятся по часовым поясам — TZ в деплое не проставляется')
}
JavaScript — OAuth-приложение
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/wake-schedules`,
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
cronExpr: '0 9 * * 1-5',
timezone: 'Europe/Moscow',
label: 'daily report',
enabled: true,
}),
}
)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | ОписаниеВсегда true при успехе |
Полеdata.id |
Типstring | ОписаниеID окна для последующего обновления и удаления |
Полеdata.serverId |
Типstring (UUID) | ОписаниеID сервера-владельца |
Полеdata.cronExpr |
Типstring | ОписаниеСохранённое cron-выражение |
Полеdata.timezone |
Типstring | ОписаниеСохранённый часовой пояс |
Полеdata.label |
Типstring | null | ОписаниеМетка окна |
Полеdata.lead |
Типnumber | null | ОписаниеЗапас в секундах. null, если не задан на уровне окна |
Полеdata.enabled |
Типboolean | ОписаниеАктивно ли окно |
Полеdata.source |
Типstring | ОписаниеКак создано окно. Всегда "MANUAL" для окон, созданных через этот CRUD |
Полеdata.lastFiredAt |
Типstring (ISO 8601) | null | ОписаниеМомент последнего подтверждённого срабатывания. null для только что созданного окна |
Полеdata.wakeAttemptStartedAt |
Типstring (ISO 8601) | null | ОписаниеСлужебная метка планировщика — непусто только в течение короткого окна, пока идёт пробуждение. В норме null |
Полеdata.lastWakeLateAt |
Типstring (ISO 8601) | null | ОписаниеМомент последнего пробуждения, сработавшего позже расчётного окна. null, если опозданий не было |
Полеdata.createdAt |
Типstring (ISO 8601) | ОписаниеДата создания записи |
Полеdata.updatedAt |
Типstring (ISO 8601) | ОписаниеДата последнего обновления записи |
ПолеtzWarning |
Типstring | null | ОписаниеПредупреждение о расхождении часового пояса — текстом. null, если у сервера не осталось активных окон после этой мутации |
ПолеtzWarningCode |
Типstring | null | ОписаниеМашиночитаемый код того же предупреждения: "SINGLE_ZONE", "MULTI_ZONE" или null |
ПолеpreemptibleAdvisoryCode |
Типstring | null | Описание"PREEMPTIBLE_BEST_EFFORT", если сервер работает на вытесняемом тарифе — иначе null |
ПолеpreemptibleAdvisory |
Типstring | null | ОписаниеПояснение того же предупреждения текстом (на английском, для не-UI-клиентов API). null, если сервер на невытесняемом тарифе |
tzWarning, tzWarningCode, preemptibleAdvisoryCode и preemptibleAdvisory — поля верхнего уровня ответа, не вложены в data.
Пример ответа
Единственное активное окно сервера — часовой пояс однозначен:
{
"success": true,
"data": {
"id": "cm38x02qp0001ml08g7k3h2a",
"serverId": "e765edfc-ba0a-43de-b8ea-838dd872c522",
"cronExpr": "0 9 * * 1-5",
"timezone": "Europe/Moscow",
"label": "daily report",
"lead": null,
"enabled": true,
"source": "MANUAL",
"lastFiredAt": null,
"wakeAttemptStartedAt": null,
"lastWakeLateAt": null,
"createdAt": "2026-07-10T08:12:00.000Z",
"updatedAt": "2026-07-10T08:12:00.000Z"
},
"tzWarning": "The VM may have been deployed with a different timezone (or not redeployed since this window was declared) — verify the in-VM cron or redeploy the app so TZ is re-injected.",
"tzWarningCode": "SINGLE_ZONE",
"preemptibleAdvisoryCode": null,
"preemptibleAdvisory": null
}
Сервер на вытесняемом тарифе получил бы "preemptibleAdvisoryCode": "PREEMPTIBLE_BEST_EFFORT" и непустой preemptibleAdvisory вместо null в тех же двух полях — остальная форма ответа не меняется.
Пример ответа при ошибке
400 — окно нарушает гарантию сервера «Всегда онлайн»:
{
"success": false,
"error": {
"code": "ALWAYS_ON_CONFLICT",
"message": "Scheduled wake conflicts with an always-on (24/7) server, which never auto-sleeps. Turn off the always-on toggle, or set a sleep timeout instead of \"Never\", to schedule wake windows."
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | КодVALIDATION_ERROR |
ОписаниеНарушена валидация тела — отсутствует cronExpr/timezone, timezone не входит в список часовых поясов IANA, label длиннее 80 символов, lead вне диапазона 0–3600 или в теле лишнее поле |
| HTTP400 | КодBLACKHOLE_ONLY |
ОписаниеСервер не в режиме BLACKHOLE |
| HTTP400 | КодGALAXY_NOT_SUPPORTED |
ОписаниеСервер — хост галактики (kind: "GALAXY"). Хост окон не держит вовсе: расписание объявляется на приложении внутри галактики, а не на самом хосте |
| HTTP400 | КодALWAYS_ON_CONFLICT |
ОписаниеСервер работает в режиме «Всегда онлайн» — на невытесняемом тарифе и без авто-сна. Расписание пробуждения тихо нарушило бы эту гарантию. Приложению в галактике этот код не приходит: тариф оно наследует от галактики, и режимом «Всегда онлайн» платформа его не считает. Не приходит он и серверу в режиме работы SCHEDULE: сон у него объявлен владельцем, и окно становится дополнительным пробуждением поверх расписания |
| HTTP400 | КодCADENCE_TOO_LOW |
ОписаниеИнтервал между соседними срабатываниями cronExpr меньше минимального, заданного на платформе — сейчас 5 минут |
| HTTP401 | КодMISSING_API_KEY |
ОписаниеНе передан заголовок X-Api-Key |
| HTTP401 | КодINVALID_API_KEY |
ОписаниеКлюч не опознан: такой строки на платформе нет |
| HTTP403 | КодWAKE_SCHEDULE_DISABLED |
ОписаниеПробуждение по расписанию не включено для этого портала |
| HTTP403 | КодWAKE_SCHEDULE_GALAXY_DISABLED |
ОписаниеСервер — приложение в галактике (kind: "GALAXY_APP"). Окна такое приложение держать умеет, но на платформе выключена возможность для приложений галактики. Её включают отдельно от обычных серверов, поэтому сервер kind: "STANDALONE" этот код не получает |
| HTTP403 | КодWAKE_SCHEDULE_LIMIT |
ОписаниеУ сервера уже 50 окон — предел на сервер |
| HTTP403 | КодINFRA_SCOPE_REQUIRED |
ОписаниеУ ключа нет скоупа vibe:infra |
| HTTP403 | КодINFRA_FORBIDDEN_FOR_COWORK_KEY |
ОписаниеВызов сделан ключом Cowork/Code — такой ключ работает только с данными, изменяющие операции ему закрыты. Что делать — Проектный ключ для деплоя |
| HTTP403 | КодSERVER_ROLE_FORBIDDEN |
ОписаниеВы состоите в команде разработки этого сервера с ролью «Разработчик», а операция открыта роли «Администратор». В error.hint придут ваша роль, требуемый порог и перечень открытых вам вызовов. Разбор ролей — Список серверов |
| HTTP404 | КодNOT_FOUND |
ОписаниеСервер не найден, удалён или привязан к другому API-ключу, и вы не состоите в его команде разработки |
| HTTP429 | КодRATE_LIMITED |
ОписаниеПревышен лимит 10 запросов в минуту на этот эндпоинт. Действующее значение — в заголовке x-ratelimit-limit |
Полный список общих ошибок API — Ошибки.
Известные особенности
- Порядок проверок. Скоуп ключа и владение сервером проверяются раньше остальных условий, поэтому
WAKE_SCHEDULE_DISABLED/BLACKHOLE_ONLY/GALAXY_NOT_SUPPORTED/WAKE_SCHEDULE_GALAXY_DISABLED/ALWAYS_ON_CONFLICTувидит только запрос с корректным ключом на существующий свой сервер, а между собой эти условия проверяются в перечисленном порядке. Проверка cron-выражения (VALIDATION_ERROR, затемCADENCE_TOO_LOW) идёт после этих гейтов. - Два разных отказа по галактике.
GALAXY_NOT_SUPPORTEDотносится к хосту галактики: он окон не держит вовсе, и включение возможности этого не изменит.WAKE_SCHEDULE_GALAXY_DISABLEDотносится к приложению внутри галактики: окна оно держать умеет, но на платформе выключена возможность для таких приложений. Первый приходит со статусом400, второй — с403, и ветвить логику стоит по коду ответа. tzWarning/tzWarningCode— консервативная эвристика. Платформа не хранит, выкладывали ли приложение заново после объявления окна, поэтому предупреждение приходит при любом наборе активных окон после мутации — даже если часовой пояс уже верно проставлен в переменных окружения. Ориентируйтесь на код:"SINGLE_ZONE"— часовой пояс однозначен и попадёт вTZпри следующем деплое отдельной виртуальной машины,"MULTI_ZONE"— окна в разных поясах,TZне проставляется автоматически.preemptibleAdvisoryCode/preemptibleAdvisory— не гейт, а предупреждение. Окно создаётся или обновляется независимо от значения этих полей — на вытесняемом тарифе платформа не запрещает расписание (это её целевой сценарий), а лишь честно сообщает, что подъём к моменту окна best-effort. Локализуйте по кодуpreemptibleAdvisoryCode, а не по строкеpreemptibleAdvisory— это фиксированная английская строка для не-UI-клиентов, не предназначенная для показа пользователю как есть.nullв настройке сна не отменяет сон при действующем расписании. На вытесняемом тарифе это сочетание разрешено: значение остаётся сохранённым выбором «Никогда», но между окнами применяется платформенный таймаут после окна. На невытесняемом тарифе текущий запрос создания или обновления окна приnullотклоняется. Платформенный таймаут после окна там возможен только у уже существующей комбинации настроек. API V1 не возвращает вычисленный session-policy: если автоматизация зависит от длительной фоновой работы, задайте явный числовой таймаут или не оставляйте действующих окон. Отказ приnullна невытесняемом тарифе к приложению в галактике не относится: тариф оно не выбирает, а наследует от галактики. Не относится он и к серверу в режиме работыSCHEDULE: сон у него объявлен расписанием.- Cron внутри VM платформа не настраивает.
POST /wake-schedulesтолько поднимает сервер к нужному моменту — заранее, с запасом на загрузку, но без гарантии успеть к сроку. На вытесняемом тарифе окно может быть пропущено целиком, см.preemptibleAdvisoryCodeвыше. Запуск задачи в этот момент — ответственность собственногоcron/таймера внутри приложения.