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

Разбудить сервер

POST /v1/infra/servers/:id/wake

Пробуждает сервер из sleeping или provisioning. В отличие от /start, /wake поддерживает блокирующий режим через ?wait=true — ответ возвращается только когда сервер полностью готов (виртуальная машина запущена и туннель подключился) или сработал таймаут. Пока платформа ждёт, она сама переспрашивает облако о состоянии машины и повторяет команду запуска, если та не доехала. Подключённый туннель считается доказательством готовности, даже если статус сервера ещё не успел обновиться. Используйте блокирующий режим, когда клиенту нужна готовность перед следующим шагом (cron-задача, триггерный вызов), и асинхронный — когда можно подождать на опросе.

Параметры

Параметр В Тип Обяз. По умолч. Описание
id path string (UUID) да — ID сервера в статусе sleeping или provisioning
wait query string нет — true — блокирующий режим: ответ вернётся только когда сервер готов (до 6.5 минут) или сработает таймаут. Любое другое значение — асинхронный режим, ответ сразу

Тело запроса пустое.

Примеры

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

Terminal
# Асинхронный вызов — ответ сразу, готовность проверяйте опросом
curl -X POST -H "X-Api-Key: YOUR_API_KEY" \
  https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/wake

# Блокирующий — ждёт готовности до ~6.5 минут
curl -X POST -H "X-Api-Key: YOUR_API_KEY" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/wake?wait=true"

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

Terminal
curl -X POST -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/wake?wait=true"

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

javascript
// Блокирующий вариант — проще всего для последующих шагов
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/wake?wait=true`,
  { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const body = await res.json()
if (!body.success) {
  // Rich-error: показать пользователю userMessage, предложить alternatives
  console.error(body.error.userMessage ?? body.error.message)
  if (body.error.alternatives) console.log('Варианты:', body.error.alternatives)
  throw new Error(body.error.code)
}
console.log(`Сервер готов: ${body.data.appUrl}`)

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

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/wake?wait=true`,
  {
    method: 'POST',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  }
)

Поля ответа

Поле Тип Описание
success boolean true при успешном пробуждении
data.id string (UUID) ID сервера
data.status string Актуальный статус в нижнем регистре (running при wait=true успехе, provisioning в асинхронном режиме)
data.blackholeStatus string Состояние туннеля (CONNECTED в блокирующем при успехе)
data.appUrl string | null HTTPS-адрес приложения

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

Успешное пробуждение (?wait=true):

JSON
{
  "success": true,
  "data": {
    "id": "e765edfc-ba0a-43de-b8ea-838dd872c522",
    "status": "running",
    "blackholeStatus": "CONNECTED",
    "appUrl": "https://app-05b67cf7.vibecode.bitrix24.tech"
  }
}

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

402 — баланс заморожен, сервер не поднимется до пополнения (расширенный формат ошибки для AI-агентов):

JSON
{
  "success": false,
  "error": {
    "code": "BILLING_EXHAUSTED",
    "message": "Balance depleted — top up to resume",
    "userMessage": "Баланс Вайбкод исчерпан. Пополните счёт, чтобы возобновить работу серверов.",
    "alternatives": [
      { "type": "topup", "description": "Пополнить баланс в разделе биллинга" }
    ],
    "hint": "Ask the user to top up their VibeCode balance. After top-up the server can be woken normally."
  }
}

Ошибки

HTTP Код Описание
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Ключ не опознан: такой строки на платформе нет
402 BILLING_EXHAUSTED Баланс Вайбкод исчерпан — пополните
402 ACCOUNT_FROZEN Баланс заморожен
402 MARKETPLACE_REQUIRED, BY_PAID_ONLY, KZ_PAID_ONLY, UZ_PAID_ONLY Galaxy-приложение: пробуждение хоста-галактики остановлено проверкой доступа аккаунта, а не состоянием баланса. Какой из кодов придёт, решает модель доступа региона — подписка BitrixGPT + Маркетплейс либо платный или демо-тариф Битрикс24. Разбор кодов — Ошибки
403 SERVER_WAKE_BLOCKED Пробуждение заблокировано не из-за биллинга (окончание доступа к платформе, административная блокировка, нарушения безопасности). У galaxy-приложения тем же кодом отвечает запрет пробуждения на хосте-галактике
403 INFRA_FORBIDDEN_FOR_COWORK_KEY Вызов сделан ключом Cowork/Code — такой ключ работает только с данными, изменяющие операции ему закрыты. Что делать — Проектный ключ для деплоя
403 EXTERNAL_COLLABORATOR_KEY_SERVER_MISMATCH Вызов сделан ключом внешнего участника разработки, а в адресе указан не тот сервер, для которого ключ выпущен. Такой ключ действует ровно на одном сервере, и ответ не сообщает, существует ли запрошенный сервер. Для работы с другим сервером нужен ключ того внешнего членства
403 EXTERNAL_COLLABORATOR_NOT_A_MEMBER Ключ внешнего участника обращается к своему серверу, но доступа сейчас нет: членство снято, истёк его срок либо для аккаунта Битрикс24, которому принадлежит сервер, отключены внешние участники разработки. Код эти причины не различает и сведений о сервере не раскрывает. Членство перечитывается на каждом запросе, поэтому снятый доступ перестаёт работать сразу
404 SERVER_NOT_FOUND Сервер не существует, удалён или привязан к другому API-ключу, и вы не состоите в его команде разработки
404 NOT_FOUND Сервер удалили, пока выполнялся вызов
404 GALAXY_HOST_NOT_FOUND Galaxy-приложение: хост-галактика, на которой оно размещено, не найдена
422 VM_MISSING У записи нет externalId, и разбор облака не видит машину под облачным именем этого сервера — виртуальная машина не создана у провайдера. Сервер нужно заменить: удалить и создать новый. Адрес каждого шага error.hint называет, только если шаг доступен этому запросу, а для недоступного — причину отказа и что изменить. Поле error.userMessage приходит, только когда доступны оба шага
422 VM_POINTER_LOST У записи нет externalId, но разбор облака видит машину под облачным именем этого сервера: связь потеряна, сама машина скорее всего работает и тарифицируется. Удалять сервер и создавать новый НЕ нужно — тогда машина останется работать вообще без записи. Сервер в error не переводится, обратитесь в поддержку за восстановлением связи
422 SERVER_WRONG_STATE Сервер не в статусе sleeping или provisioning, и /wake к нему неприменим. Ответ несёт currentState и availableActions — что с сервером сейчас и какие действия ему доступны. Тот же отказ получает galaxy-приложение, в которое ни разу не загружали код, и приложение в статусе error: /wake не восстанавливает упавшую сборку. В error.message — вызов загрузки кода, которым это лечится
422 CREDENTIAL_MISSING Galaxy-приложение: у хоста-галактики нет привязанного доступа к облачному провайдеру — обратитесь в поддержку
429 RATE_LIMITED Превышен лимит запросов. В ответе приходит заголовок Retry-After с рекомендованной паузой
502 PROVIDER_ERROR Облачный провайдер вернул ошибку при запуске виртуальной машины
503 WAKE_TIMEOUT Блокирующий ?wait=true не дождался готовности (таймаут ~6.5 минуты): машина так и не поднялась или туннель не подключился. Сервер возвращается в sleeping — повторный вызов безопасен

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

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

  • Поведение при таймауте ?wait=true. Если за ~6.5 минуты виртуальная машина не поднялась, эндпоинт возвращает 503 WAKE_TIMEOUT и пробует откатить сервер в sleeping — чтобы квота не висела на «вечно зависшем» сервере. Внутри этого окна платформа повторяет команду запуска, если облако её потеряло, поэтому таймаут означает, что машина действительно не поднялась, а не что команда не дошла. Поможет повторный /wake или /repair.
  • Поля расширенной ошибки для AI-агентов. При 402/403 тело ошибки дополнительно содержит userMessage (переведённая формулировка для пользователя), alternatives (список путей решения) и hint (совет AI-агенту, повторять автоматически или нет). Используйте эти поля в UI вместо голого code/message.
  • Пробуждение по обращению к субдомену срабатывает не на каждый запрос. Оно запускается в четырёх случаях: у сервера политика доступа PUBLIC, посетитель авторизован, запрос пришёл с токеном доступа режима api-bearer, получатель открыл ссылку режима share-url. Сервер с запретом на пробуждение не поднимется и в этих случаях — см. пункт ниже. Запрос без авторизации к серверу с любой другой политикой, включая OWNER_ONLY по умолчанию, оставляет сервер в статусе sleeping и получает отказ аутентификации. Оба представления используют HTTP 401: браузерная навигация получает HTML-страницу входа, а машинный запрос — JSON BH_LOGIN_REQUIRED. JSON выбирается по Accept: application/json, Content-Type: application/json, Authorization: Bearer, X-Api-Key, X-Requested-With: XMLHttpRequest, пути /v1/… или /api/… либо любому ненавигационному значению Sec-Fetch-Dest (включая empty); запрос без явного HTML и без назначения тоже по умолчанию получает JSON. Эти признаки имеют приоритет над явным HTML и Sec-Fetch-Dest: document|iframe|frame. Поэтому голый POST с Accept: */* получает JSON 401. На сервере с политикой PUBLIC запросы GET и HEAD от поисковых роботов и автоматических клиентов — например curl, wget, python-requests, go-http-client, java/, браузеры без интерфейса и запрос без заголовка User-Agent — машину не поднимают, чтобы обход роботом не держал её включённой. На таком сервере запросы POST, PUT, PATCH и DELETE будят её от любого клиента: это вызовы вебхуков и API, а не обход. Из скрипта и из консоли поднимайте сервер явным /wake с wait=true — тогда ответ придёт, когда сервер уже принимает запросы.
  • Сервер с флагом preventWake вызов /wake не поднимает — коды отказа в таблице выше. Запрет ставится при заморозке баланса, окончании доступа к платформе и административной блокировке, а сервер агента или бота получает его при любой остановке — из карточки или вызовом /sleep-now. Отдельный сервер поднимает /start: он снимает запрет, но заморозку баланса не обходит. У galaxy-приложения запрет на хосте блокирует и /start — см. Galaxy-приложение.
  • Проверка доступности ДО вызова. Перед /wake вызывайте GET /v1/me и смотрите capabilities.servers.wake.available. Если false, пробуждение сейчас недоступно: заморожен баланс или ограничен ключ — причину называет поле reason. Этот признак не учитывает ни тариф, ни запрет на пробуждение самого сервера, поэтому и при true возможен 403 SERVER_WAKE_BLOCKED.
  • Публичный адрес машины после пробуждения другой. Проснувшаяся машина получает адрес заново, поэтому поле ip в GET /v1/infra/servers/:id после каждого цикла сна отдаёт новое значение. Это относится ко всем тарифам, включая невытесняемые. То, что обращается к серверу по адресу — запись DNS, внешний мониторинг, — переводите на HTTPS-субдомен из поля appUrl: пробуждение его не меняет. Обратное направление так не лечится: когда внешний сервис пускает только по списку разрешённых IP, подставить в этот список нечего — постоянного исходящего адреса платформа не даёт ни в одной модели размещения, подробности в разделе Исходящий IP.
  • Для error-сервера /wake не подходит — используйте /start или /repair.

Galaxy-приложения (`kind=GALAXY_APP`)

Параметр ?wait=true на galaxy-приложении ожидания готовности не даёт: ответ приходит сразу, кода WAKE_TIMEOUT здесь не бывает. После холодного старта хоста приложение какое-то время остаётся в статусе sleeping — отслеживайте готовность опросом GET /v1/infra/servers/:id.

Полная карта операций жизненного цикла приложения — Galaxy-приложение.

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