[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Fwake-schedules\u002Fupdate":3,"docs-tabs-infra\u002Fwake-schedules\u002Fupdate":6},{"content":4,"lastmod":5},"## Обновить окно пробуждения\n\n`PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fwake-schedules\u002F:scheduleId`\n\nЗаменяет окно целиком — несмотря на метод `PATCH`, семантика как у полной замены (`PUT`). Непереданные необязательные поля сбрасываются к значениям по умолчанию, а не сохраняют прежнее значение: `enabled` → `true`, `label`\u002F`lead` → пусто. Передавайте полный объект окна, а не только изменившееся поле.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера |\n| `scheduleId` | path | string | да | ID окна. Источник — `data[].id` из [списка окон](.\u002Flist.md) или `data.id` из [создания](.\u002Fcreate.md) |\n\n## Поля запроса (body)\n\nТот же набор полей, что и при [создании окна](.\u002Fcreate.md). Не переданные необязательные поля не сохраняют старое значение, а сбрасываются к значению по умолчанию.\n\n| Поле | Тип | Обяз. | По умолч. при пропуске | Описание |\n|------|-----|:-----:|-----------|----------|\n| `cronExpr` | string | да | — | 5-польное cron-выражение, от 9 до 120 символов |\n| `timezone` | string | да | — | IANA-таймзона окна |\n| `label` | string | нет | сбрасывается в пусто | Метка окна, до 80 символов |\n| `lead` | number | нет | сбрасывается в пусто (используется запас сервера или платформы) | Запас в секундах перед моментом `cronExpr`. От 0 до 3600 |\n| `enabled` | boolean | нет | сбрасывается в `true` | Активно ли окно |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fwake-schedules\u002FSCHEDULE_ID\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"cronExpr\": \"0 10 * * 1-5\",\n    \"timezone\": \"Europe\u002FMoscow\",\n    \"label\": \"daily report\",\n    \"enabled\": true\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fwake-schedules\u002FSCHEDULE_ID\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"cronExpr\": \"0 10 * * 1-5\",\n    \"timezone\": \"Europe\u002FMoscow\",\n    \"label\": \"daily report\",\n    \"enabled\": true\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fwake-schedules\u002F${scheduleId}`,\n  {\n    method: 'PATCH',\n    headers: {\n      'X-Api-Key': 'YOUR_API_KEY',\n      'Content-Type': 'application\u002Fjson',\n    },\n    \u002F\u002F Полный объект окна — поля, пропущенные здесь, сбросятся к значениям по умолчанию\n    body: JSON.stringify({\n      cronExpr: '0 10 * * 1-5',\n      timezone: 'Europe\u002FMoscow',\n      label: 'daily report',\n      enabled: true,\n    }),\n  }\n)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Fwake-schedules\u002F${scheduleId}`,\n  {\n    method: 'PATCH',\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({\n      cronExpr: '0 10 * * 1-5',\n      timezone: 'Europe\u002FMoscow',\n      label: 'daily report',\n      enabled: true,\n    }),\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | string | ID окна |\n| `data.serverId` | string (UUID) | ID сервера-владельца |\n| `data.cronExpr` | string | Обновлённое cron-выражение |\n| `data.timezone` | string | Обновлённая таймзона |\n| `data.label` | string \\| null | Метка окна |\n| `data.lead` | number \\| null | Запас в секундах |\n| `data.enabled` | boolean | Активно ли окно после обновления |\n| `data.source` | string | Как создано окно. Не меняется обновлением |\n| `data.lastFiredAt` | string (ISO 8601) \\| null | Момент последнего подтверждённого срабатывания. Обновление окна это поле не трогает |\n| `data.wakeAttemptStartedAt` | string (ISO 8601) \\| null | Служебная метка планировщика, в норме `null` |\n| `data.lastWakeLateAt` | string (ISO 8601) \\| null | Момент последнего опоздавшего пробуждения |\n| `data.createdAt` | string (ISO 8601) | Дата создания записи |\n| `data.updatedAt` | string (ISO 8601) | Дата этого обновления |\n| `tzWarning` | string \\| null | Предупреждение о рассинхроне таймзоны — текстом. `null`, если у сервера не осталось активных окон после этой мутации |\n| `tzWarningCode` | string \\| null | Машиночитаемый код того же предупреждения: `\"SINGLE_ZONE\"`, `\"MULTI_ZONE\"` или `null` |\n| `preemptibleAdvisoryCode` | string \\| null | `\"PREEMPTIBLE_BEST_EFFORT\"`, если сервер работает на вытесняемом тарифе — иначе `null` |\n| `preemptibleAdvisory` | string \\| null | Пояснение того же предупреждения текстом (на английском, для не-UI-клиентов API). `null`, если сервер на невытесняемом тарифе |\n\n`tzWarning`, `tzWarningCode`, `preemptibleAdvisoryCode` и `preemptibleAdvisory` — поля верхнего уровня ответа, не вложены в `data`.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"cm38x02qp0001ml08g7k3h2a\",\n    \"serverId\": \"e765edfc-ba0a-43de-b8ea-838dd872c522\",\n    \"cronExpr\": \"0 10 * * 1-5\",\n    \"timezone\": \"Europe\u002FMoscow\",\n    \"label\": \"daily report\",\n    \"lead\": null,\n    \"enabled\": true,\n    \"source\": \"MANUAL\",\n    \"lastFiredAt\": \"2026-07-10T06:00:04.000Z\",\n    \"wakeAttemptStartedAt\": null,\n    \"lastWakeLateAt\": null,\n    \"createdAt\": \"2026-07-03T08:12:00.000Z\",\n    \"updatedAt\": \"2026-07-10T09:30:00.000Z\"\n  },\n  \"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.\",\n  \"tzWarningCode\": \"SINGLE_ZONE\",\n  \"preemptibleAdvisoryCode\": null,\n  \"preemptibleAdvisory\": null\n}\n```\n\nСервер на вытесняемом тарифе получил бы `\"preemptibleAdvisoryCode\": \"PREEMPTIBLE_BEST_EFFORT\"` и непустой `preemptibleAdvisory` вместо `null` в тех же двух полях — остальная форма ответа не меняется.\n\n## Пример ответа при ошибке\n\n404 — окно не найдено:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Wake window not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `VALIDATION_ERROR` | Нарушена валидация тела — отсутствует `cronExpr`\u002F`timezone`, `timezone` не входит в список IANA-таймзон, `label` длиннее 80 символов, `lead` вне диапазона 0–3600 или в теле лишнее поле |\n| 400 | `BLACKHOLE_ONLY` | Сервер не в режиме BLACKHOLE |\n| 400 | `GALAXY_NOT_SUPPORTED` | Сервер — хост галактики (`kind: \"GALAXY\"`). Вложенные приложения (`kind: \"GALAXY_APP\"`) принимаются, отклоняется только сам хост |\n| 400 | `ALWAYS_ON_CONFLICT` | Сервер работает в режиме «Всегда онлайн» — на невытесняемом тарифе и без авто-сна |\n| 400 | `CADENCE_TOO_LOW` | Интервал между соседними срабатываниями `cronExpr` меньше минимального, заданного на платформе — сейчас 5 минут |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 403 | `WAKE_SCHEDULE_DISABLED` | Пробуждение по расписанию не включено для этого портала |\n| 403 | `INFRA_SCOPE_REQUIRED` | У ключа нет скоупа `vibe:infra` |\n| 404 | `NOT_FOUND` | Сервер не найден\u002Fудалён\u002Fпринадлежит другому API-ключу, либо окно с таким `scheduleId` у этого сервера не найдено |\n| 429 | `RATE_LIMITED` | Превышен лимит 10 запросов в минуту на этот эндпоинт |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **`PATCH` заменяет окно целиком.** Это отклонение от общего стандарта частичного `PATCH` в API Вайбкод — сравните с [обновлением сделки](\u002Fdocs\u002Fentities\u002Fdeals\u002Fupdate), где непереданные поля сохраняют прежнее значение. Отправка только изменившегося поля молча обнулит остальные необязательные поля — `enabled` станет `true`, `label` и `lead` очистятся. Формируйте тело из последнего известного состояния окна, а не только из изменившихся полей.\n- **`preemptibleAdvisoryCode`\u002F`preemptibleAdvisory` — не гейт, а предупреждение.** Окно обновляется независимо от значения этих полей — на вытесняемом тарифе платформа не запрещает расписание, а лишь честно сообщает, что подъём к моменту окна best-effort. Локализуйте по коду `preemptibleAdvisoryCode`, не по строке `preemptibleAdvisory` — она фиксированная и на английском, для не-UI-клиентов.\n- **Существование окна проверяется раньше остальных гейтов.** На несуществующий `scheduleId` вернётся `404 NOT_FOUND`, даже если запрос заодно нарушает `BLACKHOLE_ONLY` или другой гейт режима сервера.\n\n## Смотрите также\n\n- [Список окон](.\u002Flist.md)\n- [Создать окно](.\u002Fcreate.md)\n- [Удалить окно](.\u002Fdelete.md)\n","2026-07-22",{}]