[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Fservers\u002Fdelete":3,"docs-tabs-infra\u002Fservers\u002Fdelete":6},{"content":4,"lastmod":5},"\n## Удалить сервер\n\n`DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id`\n\nУдаляет сервер безвозвратно: виртуальная машина уничтожается у провайдера, запись в базе помечается как `DELETED`, открытые биллинг-транзакции финализируются. Восстановить удалённый сервер нельзя — создавайте новый через [`POST \u002Fv1\u002Finfra\u002Fservers`](.\u002Fcreate.md). Удаление идемпотентно только на уровне виртуальной машины у провайдера (если она уже удалена у провайдера, ошибки не будет). Повторный вызов для уже помеченного сервера вернёт 404.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID сервера из [`POST \u002Fv1\u002Finfra\u002Fservers`](.\u002Fcreate.md) или [`GET \u002Fv1\u002Finfra\u002Fservers`](.\u002Flist.md) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE -H \"X-Api-Key: YOUR_API_KEY\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002Fdb008c84-91a5-4e15-b9d5-6c6aa2838448\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}`,\n  {\n    method: 'DELETE',\n    headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n  }\n)\nconst { success } = await res.json()\nif (success) console.log('Сервер удалён')\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}`,\n  {\n    method: 'DELETE',\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | `true` при успешном удалении |\n\nОтвет короткий — тело `{ \"success\": true }` подтверждает факт удаления. Дополнительных данных не возвращается.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true\n}\n```\n\n## Пример ответа при ошибке\n\n404 — сервер уже удалён или не существует:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Server not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не найден, принадлежит другому API-ключу, или уже был удалён |\n| 409 | `GALAXY_HAS_APPS` | Сервер — галактика, на которой ещё работают приложения. Сначала удалите приложения, затем галактику. Тело содержит `appCount` |\n| 502 | `GALAXY_HOST_UNREACHABLE` | Galaxy-приложение: его хост недоступен и его не удалось разбудить. Повторите чуть позже |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Обработка 404 при повторах — норма.** Если клиент потерял соединение после первого `DELETE`, повтор вернёт 404. Ловите 404 как «уже удалено».\n- **Если виртуальная машина уже удалена у провайдера другим способом** (панель провайдера, ручная очистка) — `DELETE` всё равно отработает успешно и пометит запись в базе как удалённую.\n- **Квота освобождается сразу.** После удаления можно сразу создавать новый сервер — `MAX_SERVERS_REACHED` больше не будет считать эту запись.\n- **Удаление работает для любого статуса.** Сервер в `provisioning`, `running`, `sleeping` и `error` — все удаляются штатно.\n- **Galaxy-приложение удаляется этим же методом.** Если портал размещает приложения в галактиках (несколько приложений работают контейнерами на общем хосте), `DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id` снимает приложение, которым владеет ключ: разбирает его контейнер на хосте и помечает запись удалённой. Ответ — `200 { \"success\": true }`, как для обычного сервера.\n- **Спящую галактику платформа будит сама.** Если галактика спит, платформа разбудит её перед разбором контейнера — отдельно будить другое приложение и повторять запрос не нужно. Ошибка 502 `GALAXY_HOST_UNREACHABLE` остаётся только когда хост недоступен или его не удалось разбудить, например при заморозке по биллингу. В этом случае повторите запрос чуть позже.\n- **Галактика с работающими приложениями этим методом не удаляется.** Если сервер — галактика, на которой ещё работают приложения, запрос вернёт 409 `GALAXY_HAS_APPS` с полем `appCount`. Сначала удалите приложения галактики, затем саму галактику.\n\n## Смотрите также\n\n- [Создать сервер](.\u002Fcreate.md) — `POST \u002Fv1\u002Finfra\u002Fservers`.\n- [Список серверов](.\u002Flist.md) — `GET \u002Fv1\u002Finfra\u002Fservers` (удалённые в выдачу не попадают).\n- [Получить сервер](.\u002Fget.md) — `GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`.\n- [Остановить сервер](\u002Fdocs\u002Finfra\u002Flifecycle\u002Fstop) — альтернатива удалению, если хотите вернуться к серверу позже.\n- [Усыпить сервер](\u002Fdocs\u002Finfra\u002Flifecycle\u002Fsleep-now) — для экономии денег на временно неиспользуемом BLACKHOLE-сервере.\n","2026-06-29",{"create.md":7,"list.md":8,"get.md":9},"\n## Создать сервер\n\n`POST \u002Fv1\u002Finfra\u002Fservers`\n\nСоздаёт приложение у облачного провайдера. Всегда в режиме Black Hole — iptables блокирует все входящие порты, приложение невидимо из интернета.\n\nНа портале есть две модели размещения, и от модели зависит, чего ждать после создания:\n\n- **Отдельная виртуальная машина** (модель по умолчанию). Ответ возвращается сразу со статусом `provisioning`, провижининг занимает 1–3 минуты, после чего нужно опрашивать [`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`](.\u002Fget.md) до `status: \"running\"` и `blackholeStatus: \"CONNECTED\"`. Ответ **единственный раз** содержит SSH-данные `ssh.password` и `ssh.privateKey` — они будут нужны при переключении в режим OPEN, сохраните их сразу. Эта страница описывает данную модель в полях запроса, полях ответа и таблице ошибок ниже.\n- **Galaxy-приложение** — контейнер на общем хосте. Если портал размещает приложения в галактиках, тот же `POST \u002Fv1\u002Finfra\u002Fservers` создаёт galaxy-приложение, а не виртуальную машину. Признак модели в ответе — поле `createdVia` равно `galaxy`. Раздел [«Galaxy-приложение»](#galaxy-приложение) ниже описывает два сценария запуска, полная модель — на странице [Galaxy-приложение](\u002Fdocs\u002Finfra\u002Fgalaxy).\n\n## Galaxy-приложение\n\nЕсли портал размещает приложения в галактиках, `POST \u002Fv1\u002Finfra\u002Fservers` создаёт **galaxy-приложение** — контейнер на общем хосте, а не отдельную виртуальную машину. Запрос и порядок вызовов те же, отличается жизненный цикл. Признак модели в ответе — поле `createdVia` равно `galaxy`. Полная модель, стоимость и отличия деплоя — на странице [Galaxy-приложение](\u002Fdocs\u002Finfra\u002Fgalaxy).\n\n**Не ждите `CONNECTED` перед загрузкой кода.** Galaxy-приложение **никогда** само не доходит до `blackholeStatus: \"CONNECTED\"` — его контейнер собирается при загрузке кода. Если просто опрашивать статус, приложение останется в `provisioning`, а примерно через 20 минут платформа пометит его как `error` и запишет в поле `provisionError`, что код так и не был загружен. Поэтому код загружают сразу — одним из двух сценариев ниже.\n\n### Сценарий 1 — прозрачный, рекомендуется\n\nОдин запрос. Передайте в `POST \u002Fv1\u002Finfra\u002Fservers` код приложения в поле `source` вместе с `runtime` и `start` (и при необходимости `install`, `env`, `port`). Сборка пойдёт в фоновом режиме. После ответа опрашивайте [`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`](.\u002Fget.md) до `status: \"running\"`. Отдельный вызов загрузки кода не нужен.\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"my-crm-app\",\n    \"displayName\": \"Мой CRM-бот\",\n    \"source\": { \"content\": \"\u003Cbase64-архив>\" },\n    \"runtime\": \"node20\",\n    \"start\": \"node index.js\",\n    \"install\": \"npm ci\",\n    \"port\": 3000\n  }'\n```\n\nПоля `source`, `runtime`, `start`, `install`, `env`, `port` совпадают по смыслу с телом [`POST \u002F:id\u002Fdeploy`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy):\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `source` | object | да (для этого сценария) | Источник кода. `source.content` — архив приложения в base64, до 500 МБ на тело запроса |\n| `runtime` | string | да (если передан `source`) | ID рантайма: `node20`, `python311`, `php83`, `static` и другие. Список — [`GET \u002Fv1\u002Finfra\u002Fruntimes`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fruntimes) |\n| `start` | string | да (если передан `source`) | Команда запуска приложения, одной строкой. Перенос строки вернёт `400` |\n| `install` | string | нет | Команда установки зависимостей, одной строкой |\n| `env` | object | нет | Переменные окружения `{ \"KEY\": \"value\" }`. Подставляются в контейнер при запуске, см. ниже |\n| `port` | number | нет | Порт, на котором приложение слушает |\n\nБез полей `runtime` и `start` поле `source` вернёт `400` — оба поля обязательны. На портале без режима галактик `source` запрещён и вернётся `400 SOURCE_AT_CREATE_GALAXY_ONLY`.\n\n### Сценарий 2 — в два шага\n\nСоздайте приложение **без** `source` — ответ придёт со статусом `provisioning` и подсказкой `next: \"deploy\"`. Сразу вызовите [`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fdeploy`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy) с кодом в `source`, рантаймом и командой запуска. Загружайте код сразу, не дожидаясь `CONNECTED`.\n\n```bash\n# Шаг 1 — создать приложение без кода\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"provider\": \"bitrix-cloud\", \"name\": \"my-crm-app\", \"plan\": \"bc-medium\", \"region\": \"ru-central1-a\" }'\n\n# Ответ содержит data.id, data.next = \"deploy\" и data.hint.\n# Шаг 2 — сразу загрузить код, не дожидаясь CONNECTED\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fdeploy \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"source\": { \"content\": \"\u003Cbase64-архив>\" },\n    \"runtime\": \"node20\",\n    \"start\": \"node index.js\",\n    \"port\": 3000\n  }'\n```\n\n`provider`, `plan` и `region` обязательны по схеме для создания без `source`; для galaxy-приложения их значения информационны — приложение наследует план и регион своего хоста.\n\n### Диагностика и переменные окружения\n\n- **Поле `provisionError`.** Если сборка или запуск упали, [`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`](.\u002Fget.md) вернёт в `data.provisionError` причину сбоя, а при ошибке сборки образа — ещё и хвост лога сборки Docker. Читайте это поле, чтобы понять причину.\n- **Переменные `env` подставляются при запуске.** Значения из `env` передаются в контейнер во время запуска через `docker run --env`, а не вшиваются в образ. Поэтому ключи API и секреты из `env` не попадают в слои образа.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `provider` | string | **да** | ID провайдера из [`GET \u002Fv1\u002Finfra\u002Fproviders`](..\u002Fproviders\u002Flist.md), например `bitrix-cloud`. 1–50 символов |\n| `name` | string | **да** | Технический идентификатор (slug). 2–63 символа, только строчные латинские буквы, цифры и `-`, первым символом — буква. Паттерн: `^[a-z][a-z0-9-]*$`. Используется в URL поддомена (`app-\u003Chex>` генерируется отдельно), логах, audit-журнале. **Неизменяемый после создания.** Для отображаемого имени используйте `displayName` |\n| `displayName` | string | нет | Отображаемое имя на любом языке (русский, китайский, эмодзи — что угодно). 2–100 символов, без управляющих байтов. Отображается в UI, уведомлениях о падении сервера, security-алертах, биллинг-строках, B24-каталоге. Если не передан — подставится `name` (slug). `name` остаётся техническим идентификатором (неизменяемым, используется в URL поддомена и логах) |\n| `plan` | string | **да** | ID тарифа из [`GET \u002Fv1\u002Finfra\u002Fproviders\u002F:providerId\u002Fplans`](..\u002Fproviders\u002Fplans.md), например `bc-small` |\n| `region` | string | **да** | ID региона из [`GET \u002Fv1\u002Finfra\u002Fproviders\u002F:providerId\u002Fregions`](..\u002Fproviders\u002Fregions.md), например `ru-central1-b` |\n| `image` | string | нет | ID образа ОС из [`GET \u002Fv1\u002Finfra\u002Fproviders\u002F:providerId\u002Fimages`](..\u002Fproviders\u002Fimages.md). Если не передан — платформа сама подставит актуальный образ провайдера. Если передаёте — берите актуальный из ответа: ID меняется при обновлении сборки |\n| `sshPublicKey` | string | нет | Ваш SSH-публичный ключ (`ssh-rsa …`, `ssh-ed25519 …`, `ecdsa-sha2-nistp256\u002F384\u002F521 …`, security-keys). До 8192 символов. Если не передан — платформа сгенерирует приватный ключ и вернёт его один раз в `ssh.privateKey` |\n| `placement` | string | нет | Модель размещения: `auto` (по умолчанию) или `dedicated`. На портале с режимом «Сначала галактика» (`galaxies-only`) значение `dedicated` создаёт отдельную виртуальную машину, а не galaxy-приложение — перенос приложения на собственный сервер. Проходит те же проверки, что и обычное создание сервера: политику `serverCreation` и квоту серверов на пользователя. При `auto` поведение прежнее (в режиме «Сначала галактика» создаётся galaxy-приложение) |\n| `graduateFrom` | string | нет | ID вашего galaxy-приложения (`kind=GALAXY_APP`), которое платформа удалит сразу после того, как создаст для него выделенный сервер — чтобы старое приложение не осталось висеть в галактике. Ограничен владельцем: тот же ключ, тот же портал, `kind=GALAXY_APP`. Чужой идентификатор или идентификатор не galaxy-приложения вернёт `404`, ничего не удаляя. Имеет смысл только вместе с `placement: dedicated`. Заголовок `Idempotency-Key` с `graduateFrom` для выделенного сервера несовместим — см. [Идемпотентность](#идемпотентность) |\n\n> **Примечание:** для модели отдельной виртуальной машины параметр `runtime` в `POST \u002Fv1\u002Finfra\u002Fservers` не принимается — передача вернёт `400 RUNTIME_PARAM_REMOVED`. Рантайм устанавливается на этапе деплоя. См. [POST \u002F:id\u002Fdeploy](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy). **Исключение — режим галактик:** при передаче поля `source` параметр `runtime` обязателен (см. раздел [«Galaxy-приложение»](#galaxy-приложение)), и `400 RUNTIME_PARAM_REMOVED` в этом случае не возвращается.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\n# name — только строчные латинские буквы, цифры и дефис, первый символ буква (^[a-z][a-z0-9-]*$)\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"provider\": \"bitrix-cloud\",\n    \"name\": \"my-crm-app\",\n    \"displayName\": \"Мой CRM-бот\",\n    \"plan\": \"bc-small\",\n    \"region\": \"ru-central1-b\",\n    \"image\": \"fd83esfomhq25p2ono90\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\n# name — только строчные латинские буквы, цифры и дефис, первый символ буква (^[a-z][a-z0-9-]*$)\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"provider\": \"bitrix-cloud\",\n    \"name\": \"my-crm-app\",\n    \"displayName\": \"Мой CRM-бот\",\n    \"plan\": \"bc-small\",\n    \"region\": \"ru-central1-b\",\n    \"image\": \"fd83esfomhq25p2ono90\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\n\u002F\u002F name — только строчные латинские буквы, цифры и дефис, первый символ буква (^[a-z][a-z0-9-]*$)\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    provider: 'bitrix-cloud',\n    name: 'my-crm-app',\n    displayName: 'Мой CRM-бот',\n    plan: 'bc-small',\n    region: 'ru-central1-b',\n    image: 'fd83esfomhq25p2ono90',\n  }),\n})\nconst { data } = await res.json()\nconsole.log('Server ID:', data.id, 'Subdomain:', data.subdomain)\n\n\u002F\u002F Сохраняем SSH-креды на всякий случай — они возвращаются только один раз\nif (data.ssh.privateKey) {\n  await saveLocally(`${data.id}.key`, data.ssh.privateKey)\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\n\u002F\u002F name — только строчные латинские буквы, цифры и дефис, первый символ буква (^[a-z][a-z0-9-]*$)\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers', {\n  method: 'POST',\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    provider: 'bitrix-cloud',\n    name: 'my-crm-app',\n    displayName: 'Мой CRM-бот',\n    plan: 'bc-small',\n    region: 'ru-central1-b',\n    image: 'fd83esfomhq25p2ono90',\n  }),\n})\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | string (UUID) | Уникальный идентификатор сервера |\n| `data.status` | string | Всегда `\"provisioning\"` сразу после создания. Ждите `\"running\"` через 1–3 минуты |\n| `data.provider` | string | Эхо переданного `provider` |\n| `data.name` | string | Эхо переданного `name` (slug) |\n| `data.kind` | string | Тип сервера, всегда: `STANDALONE` или `GALAXY_APP` |\n| `data.galaxyId` | string | Только для galaxy-ветки (id хоста-галактики); в standalone-ответе ключ отсутствует |\n| `data.displayName` | string \\| null | Отображаемое имя. Если при создании не передавали `displayName` — будет равно `name` |\n| `data.ip` | string \\| null | Публичный IP. `null` сразу после создания, заполнится когда виртуальная машина запустится |\n| `data.ssh.user` | string | Пользователь для SSH: `root` для новых серверов |\n| `data.ssh.port` | number | Порт SSH: `22` |\n| `data.ssh.password` | string \\| null | **Одноразово!** Пароль root. Сохраняйте сразу — позже не вернётся. Нужен при переключении в OPEN-режим |\n| `data.ssh.privateKey` | string \\| null | **Одноразово!** Приватный ключ в формате OpenSSH (если `sshPublicKey` не передавали при создании). Сохраняйте сразу |\n| `data.plan` | string | Эхо переданного `plan`. **Исключение — galaxy-приложение** (`createdVia: \"galaxy\"`): возвращается тариф хоста-носителя, а не запрошенный |\n| `data.region` | string | Регион, в который сервер реально попал. Может отличаться от запрошенного при переключении на запасную зону (см. «Известные особенности»). **Для galaxy-приложения** — регион хоста-носителя |\n| `data.image` | string | Эхо переданного `image` |\n| `data.mode` | string | Всегда `\"BLACKHOLE\"` сразу после создания |\n| `data.createdVia` | string | `\"api\"` для вызовов через v1 API, `\"ui\"` для вызовов из личного кабинета |\n| `data.subdomain` | string | Субдомен для приложения, например `app-92fb1c34`. Используется в `appUrl` |\n| `data.blackholeStatus` | string | Состояние туннеля агента. Сразу после создания — `\"NONE\"`, затем проходит через `WAITING` и завершается `CONNECTED` |\n| `data.accessPolicy` | string | Политика доступа к приложению. По умолчанию `\"OWNER_ONLY\"` — только владелец ключа |\n| `data.runtimeId` | string \\| null | Всегда `null` при создании. Заполняется при деплое с `runtime` |\n| `data.runtimeStatus` | string \\| null | Всегда `null` при создании. Обновляется во время деплоя |\n| `data.appUrl` | string \\| null | HTTPS-адрес приложения: `https:\u002F\u002F{subdomain}.vibecode.bitrix24.tech` |\n| `data.createdAt` | string (ISO 8601) | Момент создания |\n\n## Пример ответа\n\nОтдельная виртуальная машина:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"db008c84-91a5-4e15-b9d5-6c6aa2838448\",\n    \"status\": \"provisioning\",\n    \"provider\": \"bitrix-cloud\",\n    \"name\": \"docs-test-temp\",\n    \"kind\": \"STANDALONE\",\n    \"ip\": null,\n    \"ssh\": {\n      \"user\": \"root\",\n      \"port\": 22,\n      \"password\": \"0FPIIR9EfO2OAeSSMK6bKA\",\n      \"privateKey\": \"-----BEGIN OPENSSH PRIVATE KEY-----\\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmU…\\n-----END OPENSSH PRIVATE KEY-----\\n\"\n    },\n    \"plan\": \"bc-agent\",\n    \"region\": \"ru-central1-b\",\n    \"image\": \"fd83esfomhq25p2ono90\",\n    \"mode\": \"BLACKHOLE\",\n    \"createdVia\": \"api\",\n    \"subdomain\": \"app-92fb1c34\",\n    \"blackholeStatus\": \"NONE\",\n    \"accessPolicy\": \"OWNER_ONLY\",\n    \"runtimeId\": null,\n    \"runtimeStatus\": null,\n    \"appUrl\": \"https:\u002F\u002Fapp-92fb1c34.vibecode.bitrix24.tech\",\n    \"createdAt\": \"2026-04-22T10:50:11.477Z\"\n  }\n}\n```\n\nGalaxy-приложение по сценарию 1 — `source` передан, сборка идёт в фоне. Полей `ssh` и `next` нет:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"7c2b1f08-3a4d-4e91-9b6c-2f5e8a1d0c33\",\n    \"status\": \"provisioning\",\n    \"provider\": \"bitrix-cloud\",\n    \"name\": \"my-crm-app\",\n    \"kind\": \"GALAXY_APP\",\n    \"galaxyId\": \"\u003Cgalaxy-host-id>\",\n    \"displayName\": \"Мой CRM-бот\",\n    \"ip\": null,\n    \"ssh\": null,\n    \"plan\": \"bc-medium\",\n    \"region\": \"ru-central1-a\",\n    \"image\": \"ubuntu-2404-lts\",\n    \"mode\": \"BLACKHOLE\",\n    \"createdVia\": \"galaxy\",\n    \"subdomain\": \"app-7c2b1f08\",\n    \"blackholeStatus\": \"NONE\",\n    \"accessPolicy\": \"OWNER_ONLY\",\n    \"runtimeId\": null,\n    \"runtimeStatus\": null,\n    \"appUrl\": \"https:\u002F\u002Fapp-7c2b1f08.vibecode.bitrix24.tech\",\n    \"createdAt\": \"2026-04-22T10:50:11.477Z\"\n  }\n}\n```\n\nGalaxy-приложение по сценарию 2 — `source` не передан, появляются `next` и `hint`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"7c2b1f08-3a4d-4e91-9b6c-2f5e8a1d0c33\",\n    \"status\": \"provisioning\",\n    \"provider\": \"bitrix-cloud\",\n    \"name\": \"my-crm-app\",\n    \"kind\": \"GALAXY_APP\",\n    \"galaxyId\": \"\u003Cgalaxy-host-id>\",\n    \"displayName\": \"Мой CRM-бот\",\n    \"ip\": null,\n    \"ssh\": null,\n    \"plan\": \"bc-medium\",\n    \"region\": \"ru-central1-a\",\n    \"image\": \"ubuntu-2404-lts\",\n    \"mode\": \"BLACKHOLE\",\n    \"createdVia\": \"galaxy\",\n    \"subdomain\": \"app-7c2b1f08\",\n    \"blackholeStatus\": \"NONE\",\n    \"accessPolicy\": \"OWNER_ONLY\",\n    \"runtimeId\": null,\n    \"runtimeStatus\": null,\n    \"appUrl\": \"https:\u002F\u002Fapp-7c2b1f08.vibecode.bitrix24.tech\",\n    \"createdAt\": \"2026-04-22T10:50:11.477Z\",\n    \"next\": \"deploy\",\n    \"hint\": \"This is a galaxy app — POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fdeploy with source.content now; it will not reach \\\"running\\\" on its own.\"\n  }\n}\n```\n\nЕсли сборка galaxy-приложения упала, [`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`](.\u002Fget.md) вернёт причину в `data.provisionError`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"7c2b1f08-3a4d-4e91-9b6c-2f5e8a1d0c33\",\n    \"status\": \"error\",\n    \"createdVia\": \"galaxy\",\n    \"provisionError\": \"Docker build failed: npm ci exited with code 1\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — нарушена валидация (имя начинается с заглавной):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_REQUEST\",\n    \"message\": \"name: Name must start with a letter and contain only lowercase letters, digits, and hyphens\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `INVALID_REQUEST` | Нарушена валидация полей (неверный формат имени, отсутствует обязательное поле, неверный SSH-ключ и т. д.). Поле `message` содержит конкретную причину |\n| 400 | `SOURCE_AT_CREATE_GALAXY_ONLY` | Поле `source` передано на портале без режима галактик. Загружайте код через [`POST \u002F:id\u002Fdeploy`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy) после создания |\n| 400 | `RUNTIME_PARAM_REMOVED` | Параметр `runtime` удалён для модели отдельной виртуальной машины. Указывайте рантайм в [`POST \u002F:id\u002Fdeploy`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy) |\n| 400 | `UNKNOWN_PARAM` | В теле есть неизвестное поле (например `deployMode` вместо `placement`). `details.unknownFields` перечисляет лишние поля, `details.suggestions` подсказывает правильное имя, `details.validParams` — полный список допустимых полей |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 402 | `COMMERCIAL_PLAN_REQUIRED` | Бесплатный тариф Битрикс24 и пробный период недоступны (пробный уже использован). См. [раздел «Тариф и доступ»](\u002Fdocs\u002Finfra#тариф-и-доступ) |\n| 402 | `TRIAL_EXPIRED` | Trial использован и завершился |\n| 402 | `TRIAL_PORTAL_LIMIT` | Превышена квота серверов портала на trial |\n| 402 | `TRIAL_USER_LIMIT` | Превышена квота серверов на пользователя на trial |\n| 402 | `PLAN_NOT_ALLOWED_ON_TRIAL` | На trial разрешён только тариф `bc-micro` |\n| 402 | `ACCOUNT_FROZEN` | Баланс Вайбкод заморожен, нужно пополнить |\n| 403 | `INFRA_NOT_PERMITTED` | Инфраструктура отключена на платформе или на портале |\n| 403 | `SERVER_CREATION_DISABLED` | Создание серверов запрещено политикой портала |\n| 403 | `MAX_SERVERS_REACHED` | Превышен лимит серверов на API-ключ (по умолчанию 3). Удалите ненужные через [`DELETE`](.\u002Fdelete.md) или создавайте новый API-ключ |\n| 404 | `NO_CREDENTIALS` | Провайдер `provider` не сконфигурирован на платформе |\n| 502 | `PROVIDER_ERROR` | Облачный провайдер вернул ошибку при создании виртуальной машины. Запись сервера помечается как удалённая, квота не расходуется — можно сразу повторить попытку. Поле `message` содержит текст от провайдера |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Идемпотентность\n\nПередайте необязательный заголовок `Idempotency-Key`, чтобы безопасно повторять создание **отдельного** сервера (standalone). Если ответ на первый запрос потерялся (обрыв сети, таймаут балансировщика), повтор с тем же ключом не создаст второй сервер — вернётся тот же самый сервер, что и в первый раз, со статусом `201` и заголовком ответа `Idempotent-Replayed: true`.\n\n- Ключ — строка 1–255 символов из набора `[A-Za-z0-9_.:-]`. Область действия — ваш API-ключ.\n- **При повторе одноразовые SSH-данные не выдаются повторно.** В теле ответа `ssh.privateKey` и `ssh.password` будут `null`, а поле `note` пояснит это. Сохраняйте данные из ответа первого создания.\n- **Заголовок работает только для standalone-серверов.** На порталах с размещением в галактике корректный ключ игнорируется без ошибки, и защита от повторного создания на этот путь **не распространяется**.\n- Заголовок несовместим с `graduateFrom` для выделенного сервера — вернётся `400 IDEMPOTENCY_UNSUPPORTED_WITH_GRADUATION`.\n\n| Код | `code` | Когда |\n|-----|--------|-------|\n| 400 | `INVALID_IDEMPOTENCY_KEY` | Ключ не проходит валидацию (длина или недопустимые символы) |\n| 400 | `IDEMPOTENCY_UNSUPPORTED_WITH_GRADUATION` | Ключ вместе с `graduateFrom` для выделенного сервера |\n| 409 | `IDEMPOTENCY_KEY_ALREADY_USED` | Ключ уже использован для сервера, который затем был удалён — возьмите новый ключ |\n| 409 | `IDEMPOTENCY_CONCURRENT_RETRY` | Параллельный запрос с тем же ключом ещё выполняется — повторите чуть позже |\n\n## Известные особенности\n\n- **Примеры корректных и некорректных имён** по паттерну `^[a-z][a-z0-9-]*$`:\n  - Правильно: `my-app`, `bot-1`, `crm-dashboard`.\n  - Неправильно: `My-App` (заглавная), `bot_1` (подчёркивание), `my.app` (точка), `кириллица`.\n- **`sshPublicKey` vs автогенерация.** Если передаёте свой публичный ключ — платформа не генерирует приватный, и `ssh.privateKey` в ответе будет `null`. Пароль в `ssh.password` всё равно возвращается.\n- **Когда `region` в ответе отличается от запрошенного.** В запрошенной зоне могли кончиться IP-адреса (`Address space exhausted`) — тогда платформа автоматически пробует следующие зоны в порядке из [`GET \u002Fv1\u002Finfra\u002Fproviders\u002F:providerId\u002Fregions`](..\u002Fproviders\u002Fregions.md), и фиксирует это в аудит-логе событием `SERVER_ZONE_FALLBACK`.\n- **Таймаут провижининга — 10 минут.** Если `status` застрял в `provisioning` дольше, система сама вернёт сервер в `sleeping` с `preventWake: true`, после чего остаётся вызвать [`DELETE`](.\u002Fdelete.md) и создать новый.\n- **Рантайм устанавливается на этапе деплоя.** Параметр `runtime` был удалён из `POST \u002Fv1\u002Finfra\u002Fservers` (вернёт `400 RUNTIME_PARAM_REMOVED`). Указывайте `runtime` в теле [`POST \u002F:id\u002Fdeploy`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy) — он установится между извлечением архива и запуском приложения.\n\n## Смотрите также\n\n- [Провайдеры и каталоги](\u002Fdocs\u002Finfra\u002Fproviders) — откуда брать `provider`, `plan`, `region`, `image`.\n- [Получить сервер](.\u002Fget.md) — опрос статуса до готовности.\n- [Список серверов](.\u002Flist.md) — чтобы увидеть все свои.\n- [Удалить сервер](.\u002Fdelete.md) — вернуть квоту.\n- [Deploy API](\u002Fdocs\u002Finfra\u002Fdeploy) — следующий шаг после создания.\n- [Полный деплой приложения](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fdeploy) — загрузка кода в galaxy-приложение по сценарию 2.\n- [Список рантаймов](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fruntimes) — допустимые значения `runtime`.\n- [Тариф и доступ](\u002Fdocs\u002Finfra#тариф-и-доступ) — когда и почему возникают 402-ошибки.\n","\n## Список серверов\n\n`GET \u002Fv1\u002Finfra\u002Fservers`\n\nВозвращает все серверы, созданные от имени текущего API-ключа. Удалённые серверы (`status: \"deleted\"`) в выдачу не попадают. Серверы других ключей — даже в том же портале — не видны. Для просмотра всех серверов портала используйте панель администратора в UI.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -H \"X-Api-Key: YOUR_API_KEY\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nconst { data: servers } = await res.json()\n\nservers.forEach(s => {\n  const ready = s.status === 'running' && s.blackholeStatus === 'CONNECTED'\n  console.log(`${s.name}: ${ready ? '✓ готов' : s.status} — ${s.appUrl}`)\n})\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { data: servers } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив серверов. Каждый элемент — такой же объект, как у [`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`](.\u002Fget.md), за исключением: SSH-полей `ssh.password` и `ssh.privateKey` (в списке не отдаются) и полей `localPort` \u002F `buildLog` (только у одиночного `GET \u002F:id`) |\n| `data[].id` | string (UUID) | ID сервера |\n| `data[].status` | string | Текущий статус: `provisioning`, `running`, `sleeping`, `error` (список удалённых не возвращается) |\n| `data[].provider` | string | ID провайдера |\n| `data[].kind` | string | Тип ресурса: `STANDALONE` (отдельная виртуальная машина), `GALAXY` (галактика — хост-носитель galaxy-приложений) или `GALAXY_APP` (galaxy-приложение на общем хосте). Определяет контракт деплоя |\n| `data[].galaxyId` | string (UUID) \\| null | Для `GALAXY_APP` — ID хоста-носителя. Для остальных типов `null` |\n| `data[].appCount` | number \\| null | Для `GALAXY`-хоста — число живых приложений на нём. Для остальных типов `null` |\n| `data[].name` | string | Имя сервера (slug) |\n| `data[].displayName` | string \\| null | Отображаемое имя для UI. Если не передавалось — совпадает с `name` |\n| `data[].ip` | string \\| null | Публичный IP (может быть `null`, пока идёт провижининг) |\n| `data[].ssh` | object \\| null | Блок SSH-данных: `{ user, port, hasPassword }`. Поля `password` и `privateKey` в списке не присутствуют |\n| `data[].plan` | string | Тариф. **Для galaxy-приложения** (`kind: \"GALAXY_APP\"`) возвращается тариф хоста-носителя, а не запрошенный |\n| `data[].region` | string | Регион, в который сервер попал реально (может отличаться от запрошенного после переключения на запасную зону). **Для galaxy-приложения** возвращается регион хоста-носителя |\n| `data[].image` | string | Образ ОС |\n| `data[].monthlyCost` | string | Месячная стоимость, строкой: `\"1200\"` или `\"1200.00\"`. Сравнивайте с `Number(s.monthlyCost)` |\n| `data[].mode` | string | `BLACKHOLE` или `OPEN` |\n| `data[].createdVia` | string | `api` или `ui` |\n| `data[].subdomain` | string | Субдомен для приложения |\n| `data[].blackholeStatus` | string | Состояние туннеля: `NONE`, `WAITING`, `CONNECTED`, `DISCONNECTED` |\n| `data[].accessPolicy` | string | Политика доступа: `OWNER_ONLY`, `NAMED_USERS`, `DEPARTMENT`, `PORTAL`, `AUTHENTICATED`, `PUBLIC` |\n| `data[].runtimeId` | string \\| null | ID рантайма, установленного через POST \u002F:id\u002Fdeploy (создание сервера всегда даёт `null`). |\n| `data[].runtimeStatus` | string \\| null | Статус рантайма из последнего deploy: `null` (свежий сервер), `installing`, `ready`, или `error`. Создание сервера всегда даёт `null` — рантайм ставится через POST \u002F:id\u002Fdeploy. |\n| `data[].appUrl` | string \\| null | HTTPS-адрес приложения |\n| `data[].sleepAfterMinutes` | number \\| null | Через сколько минут простоя сервер автоматически усыпляется. `null` — не усыплять автоматически |\n| `data[].provisionError` | string \\| null | Краткая причина последней ошибки провижининга\u002Fсборки. `null`, если ошибок не было |\n| `data[].provisionErrorCode` | string \\| null | Машиночитаемый код категории сбоя: `PREEMPTIBLE_EVICTION` \u002F `PROVISION_TIMEOUT` \u002F `NO_CAPACITY` \u002F `GENERIC`. `null`, если ошибок не было |\n| `data[].createdAt` | string (ISO 8601) | Момент создания |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"e765edfc-ba0a-43de-b8ea-838dd872c522\",\n      \"status\": \"running\",\n      \"provider\": \"bitrix-cloud\",\n      \"kind\": \"STANDALONE\",\n      \"galaxyId\": null,\n      \"appCount\": null,\n      \"name\": \"vibe-server-pd9l\",\n      \"displayName\": \"vibe-server-pd9l\",\n      \"ip\": \"111.88.251.211\",\n      \"ssh\": {\n        \"user\": \"ubuntu\",\n        \"port\": 22,\n        \"hasPassword\": true\n      },\n      \"plan\": \"bc-small\",\n      \"region\": \"ru-central1-a\",\n      \"image\": \"fd80bm0rh4rkepi5ksdi\",\n      \"monthlyCost\": \"1200\",\n      \"mode\": \"OPEN\",\n      \"createdVia\": \"ui\",\n      \"subdomain\": \"app-05b67cf7\",\n      \"blackholeStatus\": \"CONNECTED\",\n      \"accessPolicy\": \"OWNER_ONLY\",\n      \"runtimeId\": null,\n      \"runtimeStatus\": null,\n      \"appUrl\": \"https:\u002F\u002Fapp-05b67cf7.vibecode.bitrix24.tech\",\n      \"sleepAfterMinutes\": null,\n      \"provisionError\": null,\n      \"provisionErrorCode\": null,\n      \"createdAt\": \"2026-04-03T13:30:25.819Z\"\n    }\n  ]\n}\n```\n\n## Пример ответа при ошибке\n\n401 — не передан API-ключ:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key required. Pass via X-Api-Key header.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Даже администратор портала видит только свои серверы.** Для портальной картины используйте UI в панели администратора — ограничение по API-ключу фиксировано.\n- **Серверы порталов, помеченных удалёнными в Битрикс24, автоматически скрываются.** Платформа ежедневно проверяет доступность порталов: если портал отвечает 410\u002F403 три дня подряд, он помечается как удалённый и его серверы перестают отображаться.\n- **Ответ не пагинируется** — лимит 3 сервера на ключ делает пагинацию ненужной.\n\n## Смотрите также\n\n- [Создать сервер](.\u002Fcreate.md) — `POST \u002Fv1\u002Finfra\u002Fservers`.\n- [Получить сервер](.\u002Fget.md) — `GET \u002Fv1\u002Finfra\u002Fservers\u002F:id` — детали одного сервера.\n- [Удалить сервер](.\u002Fdelete.md) — `DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id`.\n- [Жизненный цикл](\u002Fdocs\u002Finfra\u002Flifecycle) — действия над конкретным сервером.\n","\n## Получить сервер\n\n`GET \u002Fv1\u002Finfra\u002Fservers\u002F:id`\n\nВозвращает детали одного сервера по ID. Если сервер в статусе `provisioning`, эндпоинт автоматически опрашивает облачного провайдера на предмет актуального статуса и IP — подходит для цикла опроса после создания. Удалённый сервер (`status: \"deleted\"`) не доступен: возвращается 404.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID сервера из [`POST \u002Fv1\u002Finfra\u002Fservers`](.\u002Fcreate.md) или [`GET \u002Fv1\u002Finfra\u002Fservers`](.\u002Flist.md) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -H \"X-Api-Key: YOUR_API_KEY\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002Fe765edfc-ba0a-43de-b8ea-838dd872c522\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\n```\n\n### JavaScript — личный ключ\n\n```javascript\n\u002F\u002F Опрос готовности сервера\nasync function waitReady(serverId) {\n  while (true) {\n    const res = await fetch(\n      `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}`,\n      { headers: { 'X-Api-Key': 'YOUR_API_KEY' } }\n    )\n    const { data } = await res.json()\n    if (data.status === 'running' && data.blackholeStatus === 'CONNECTED') {\n      return data\n    }\n    if (data.status === 'error') {\n      throw new Error(`Сервер в ошибке: ${data.id}`)\n    }\n    await new Promise(r => setTimeout(r, 10000))\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}`,\n  {\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  }\n)\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | string (UUID) | ID сервера |\n| `data.status` | string | `provisioning` \\| `running` \\| `sleeping` \\| `error`. Удалённый сервер возвращает 404 |\n| `data.provider` | string | ID провайдера |\n| `data.kind` | string | Тип ресурса: `STANDALONE` (отдельная виртуальная машина), `GALAXY` (галактика — хост-носитель galaxy-приложений) или `GALAXY_APP` (galaxy-приложение — контейнер на общем хосте). Определяет контракт деплоя — проверяйте его перед загрузкой кода |\n| `data.galaxyId` | string (UUID) \\| null | Для `GALAXY_APP` — ID хоста, на котором размещено приложение. Для остальных типов `null` |\n| `data.appCount` | number \\| null | Для `GALAXY`-хоста — число живых приложений на нём. Для остальных типов `null` |\n| `data.name` | string | Имя сервера (slug, технический идентификатор) |\n| `data.displayName` | string \\| null | Отображаемое имя для UI. Если при создании не передавалось — совпадает с `name` |\n| `data.ip` | string \\| null | Публичный IP. `null` пока виртуальная машина не получит адрес |\n| `data.ssh` | object \\| null | Для OPEN-сервера: `{ user, port, hasPassword }`. Для BLACKHOLE может быть `null` или тот же блок без фактического доступа. **Пароль и приватный ключ здесь не возвращаются** — их отдаёт только [`POST \u002Fv1\u002Finfra\u002Fservers`](.\u002Fcreate.md) один раз при создании |\n| `data.plan` | string | Тариф. **Для galaxy-приложения** (`kind: \"GALAXY_APP\"`) возвращается тариф хоста-носителя, а не запрошенный при создании — приложения делят ресурсы хоста |\n| `data.region` | string | Регион, в который сервер попал реально. **Для galaxy-приложения** возвращается регион хоста-носителя (платформа сама выбирает размещение), а не запрошенный |\n| `data.image` | string | Образ ОС |\n| `data.monthlyCost` | string | Месячная стоимость строкой (например `\"1200\"`). Сравнивайте через `Number(data.monthlyCost)` |\n| `data.mode` | string | `BLACKHOLE` или `OPEN` |\n| `data.createdVia` | string | `api` или `ui` |\n| `data.subdomain` | string | Субдомен для приложения |\n| `data.blackholeStatus` | string | `NONE` \\| `WAITING` \\| `CONNECTED` \\| `DISCONNECTED` |\n| `data.accessPolicy` | string | `OWNER_ONLY` \\| `NAMED_USERS` \\| `DEPARTMENT` \\| `PORTAL` \\| `AUTHENTICATED` \\| `PUBLIC` |\n| `data.runtimeId` | string \\| null | ID рантайма, установленного через POST \u002F:id\u002Fdeploy (создание сервера всегда даёт `null`). |\n| `data.runtimeStatus` | string \\| null | Статус рантайма из последнего deploy: `null` (свежий сервер), `installing`, `ready`, или `error`. Создание сервера всегда даёт `null` — рантайм ставится через POST \u002F:id\u002Fdeploy. |\n| `data.appUrl` | string \\| null | HTTPS-адрес приложения |\n| `data.localPort` | number | Локальный порт, на который туннель направляет трафик (по умолчанию `3000`). Меняется через [`PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fport`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fport) |\n| `data.sleepAfterMinutes` | number \\| null | Через сколько минут простоя сервер автоматически усыпляется. `null` — не усыплять автоматически |\n| `data.provisionError` | string \\| null | Краткая причина последней ошибки провижининга\u002Fсборки. `null`, если ошибок не было |\n| `data.provisionErrorCode` | string \\| null | Машиночитаемый код категории сбоя: `PREEMPTIBLE_EVICTION` \u002F `PROVISION_TIMEOUT` \u002F `NO_CAPACITY` \u002F `GENERIC`. `null`, если ошибок не было |\n| `data.buildLog` | string \\| null | Хвост лога docker-сборки (≤8 КБ) для упавшей сборки galaxy-приложения. `null` для обычных серверов и при успешной сборке |\n| `data.createdAt` | string (ISO 8601) | Момент создания |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"e765edfc-ba0a-43de-b8ea-838dd872c522\",\n    \"status\": \"running\",\n    \"provider\": \"bitrix-cloud\",\n    \"kind\": \"STANDALONE\",\n    \"galaxyId\": null,\n    \"appCount\": null,\n    \"name\": \"vibe-server-pd9l\",\n    \"displayName\": \"vibe-server-pd9l\",\n    \"ip\": \"111.88.251.211\",\n    \"ssh\": {\n      \"user\": \"ubuntu\",\n      \"port\": 22,\n      \"hasPassword\": true\n    },\n    \"plan\": \"bc-small\",\n    \"region\": \"ru-central1-a\",\n    \"image\": \"fd80bm0rh4rkepi5ksdi\",\n    \"monthlyCost\": \"1200\",\n    \"mode\": \"OPEN\",\n    \"createdVia\": \"ui\",\n    \"subdomain\": \"app-05b67cf7\",\n    \"blackholeStatus\": \"CONNECTED\",\n    \"accessPolicy\": \"OWNER_ONLY\",\n    \"runtimeId\": null,\n    \"runtimeStatus\": null,\n    \"appUrl\": \"https:\u002F\u002Fapp-05b67cf7.vibecode.bitrix24.tech\",\n    \"localPort\": 3000,\n    \"sleepAfterMinutes\": null,\n    \"provisionError\": null,\n    \"provisionErrorCode\": null,\n    \"buildLog\": null,\n    \"createdAt\": \"2026-04-03T13:30:25.819Z\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — сервер с таким ID не существует или принадлежит другому API-ключу:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Server not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не найден или принадлежит другому API-ключу |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Для `running`\u002F`sleeping`\u002F`error` запроса к провайдеру нет.** Автоматический опрос провайдера срабатывает только при статусе `provisioning`. Если нужно сверить состояние других статусов — используйте [`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Frefresh`](\u002Fdocs\u002Finfra\u002Flifecycle\u002Frefresh).\n- **Критерий готовности — два поля.** Для продолжения работы с [Deploy API](\u002Fdocs\u002Finfra\u002Fdeploy) нужны одновременно `status: \"running\"` **и** `blackholeStatus: \"CONNECTED\"`. Если стоит только `running` — виртуальная машина уже жива, но агент туннеля ещё не подключился. Если использовался `runtime` при деплое — дополнительно дождитесь `runtimeStatus: \"ready\"`.\n- **`blackholeStatus: \"DISCONNECTED\"` при `running`** — туннель потерял связь у живого сервера. Попробуйте [`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Frepair`](\u002Fdocs\u002Finfra\u002Flifecycle\u002Frepair).\n- **Подводный камень `monthlyCost`:** поле возвращается строкой. `data.monthlyCost > 1000` даст неверный результат — сравнивайте через `Number(data.monthlyCost) > 1000`.\n- **Если потеряли SSH-креды из ответа создания — восстановить нельзя.** Пересоздайте SSH-ключ вручную через [`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fexec`](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fexec) (для BLACKHOLE) или пересоздайте сервер.\n\n## Смотрите также\n\n- [Создать сервер](.\u002Fcreate.md) — `POST \u002Fv1\u002Finfra\u002Fservers`.\n- [Список серверов](.\u002Flist.md) — `GET \u002Fv1\u002Finfra\u002Fservers`.\n- [Удалить сервер](.\u002Fdelete.md) — `DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id`.\n- [Обновить статус](\u002Fdocs\u002Finfra\u002Flifecycle\u002Frefresh) — принудительный опрос провайдера для любого статуса.\n- [Метрики туннеля](\u002Fdocs\u002Finfra\u002Fdeploy\u002Fmetrics) — активность агента.\n"]