[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Fservers\u002Fcreate":3,"docs-tabs-infra\u002Fservers\u002Fcreate":6},{"content":4,"lastmod":5},"\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","2026-07-15",{}]