Для 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 — личный ключ
# Асинхронный вызов — ответ сразу, готовность проверяйте опросом
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-приложение
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 — личный ключ
// Блокирующий вариант — проще всего для последующих шагов
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-приложение
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):
{
"success": true,
"data": {
"id": "e765edfc-ba0a-43de-b8ea-838dd872c522",
"status": "running",
"blackholeStatus": "CONNECTED",
"appUrl": "https://app-05b67cf7.vibecode.bitrix24.tech"
}
}
Пример ответа при ошибке
402 — баланс заморожен, сервер не поднимется до пополнения (расширенный формат ошибки для AI-агентов):
{
"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и получает отказ аутентификации. Оба представления используют HTTP401: браузерная навигация получает HTML-страницу входа, а машинный запрос — JSONBH_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: */*получает JSON401. На сервере с политикой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-приложение.