Для 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 — личный ключ

Terminal
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-приложение

Terminal
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 — личный ключ

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-приложение

javascript
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.

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

Единственное активное окно сервера — часовой пояс однозначен:

JSON
{
  "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 — окно нарушает гарантию сервера «Всегда онлайн»:

JSON
{
  "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/таймера внутри приложения.

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