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

Получить сервер

GET /v1/infra/servers/:id

Возвращает детали одного сервера по ID. Для полной владельческой карточки эндпоинт автоматически опрашивает облачного провайдера, когда сохранён статус provisioning или отсутствует IP, при условии, что у сервера есть внешний идентификатор. Удалённый сервер (status: "deleted") недоступен: возвращается 404.

Карточка бывает трёх форм. Управляющий ключ получает полный объект. Такую же форму без блока access получает ключ приложения для привязанного к нему сервера, кроме хоста GALAXY, даже если запись сервера закреплена за другим ключом приложения. Участник команды разработки получает 200 с укороченной карточкой. Если galaxyId живого galaxy-приложения текущего ключа указывает на живой общий хост того же портала, этот хост приходит как безопасная проекция для чтения с access.via: "galaxy-reference". Разбор форм и полей — Список серверов.

Параметры

Параметр В Тип Обяз. Описание
id path string (UUID) да ID сервера либо galaxyId galaxy-приложения из ответа POST /v1/infra/servers или GET /v1/infra/servers

Примеры

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

Terminal
curl -H "X-Api-Key: YOUR_API_KEY" \
  https://vibecode.bitrix24.tech/v1/infra/servers/e765edfc-ba0a-43de-b8ea-838dd872c522

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

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

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

javascript
// Опрос готовности сервера
async function waitReady(serverId) {
  while (true) {
    const res = await fetch(
      `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}`,
      { headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
    )
    const { data } = await res.json()
    if (data.access?.via === 'galaxy-reference') {
      throw new Error('Для ожидания готовности используйте ID galaxy-приложения, а не хоста')
    }
    if (data.status === 'running' && data.blackholeStatus === 'CONNECTED') {
      return data
    }
    if (data.status === 'error') {
      throw new Error(`Сервер в ошибке: ${data.id}`)
    }
    await new Promise(r => setTimeout(r, 10000))
  }
}

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

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

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе
data object Полная владельческая карточка, укороченная карточка collaborator или проекция galaxy-reference. Проекция хоста содержит только id, status, kind, galaxyId, name, displayName, createdAt и access. Остальные поля таблицы у неё отсутствуют
data.id string (UUID) ID сервера
data.status string Последний сохранённый статус: provisioning | running | stopped | sleeping | error. Удалённый сервер возвращает 404
data.provider string ID провайдера
data.kind string Тип ресурса: STANDALONE (отдельная виртуальная машина), GALAXY (галактика — хост-носитель galaxy-приложений) или GALAXY_APP (galaxy-приложение — контейнер на общем хосте). Определяет контракт деплоя — проверяйте его перед загрузкой кода
data.galaxyId string (UUID) | null Для GALAXY_APP — ID хоста, на котором размещено приложение. Для остальных типов null
data.appCount number | null Для GALAXY-хоста — число неудалённых приложений на нём. Для остальных типов null
data.diskTotalMb number | null Размер диска машины-галактики в мебибайтах. Для STANDALONE и GALAXY_APP — null
data.diskFreeMb number | null Свободное место на диске машины-галактики в мебибайтах. Для STANDALONE и GALAXY_APP — null
data.diskState string | null Оценка занятости диска: ok, warning, critical или unknown, если замера ещё не было. Пороги описаны в Галактика. Для STANDALONE и GALAXY_APP — null
data.diskProbedAt string (ISO 8601) | null Время замера диска. У спящей машины приходит последнее известное значение вместе с временем этого замера
data.reachability object | null Только для GALAXY_APP — может ли приложение ответить прямо сейчас: effectiveStatus, состояние галактики-носителя hostStatus и hostTunnel, живо снятые container и forwarder, состояние публичного адреса publicEntry, исход опроса probe и его время probedAt. Поле status выше — состояние учётной записи приложения, и во время пробуждения оно отстаёт от машины. Разбор значений — Сон и пробуждение Galaxy-приложения. Для остальных типов null
data.name string Системное имя сервера — технический идентификатор
data.displayName string | null Отображаемое имя для UI. Если при создании не передавалось — совпадает с name
data.description string | null Описание приложения для карточки каталога Битрикс24. null, если описание не задавали. Меняется через PATCH /v1/infra/servers/:id
data.ip string | null Публичный IP. null пока виртуальная машина не получит адрес
data.ssh object | null Для OPEN-сервера: { user, port, hasPassword }. Для BLACKHOLE может быть null или тот же блок без фактического доступа. Пароль и приватный ключ здесь не возвращаются — их отдаёт только POST /v1/infra/servers один раз при создании
data.plan string Тариф. Для galaxy-приложения (kind: "GALAXY_APP") возвращается тариф хоста-носителя, а не запрошенный при создании — приложения делят ресурсы хоста
data.region string Регион, в который сервер попал реально. Для galaxy-приложения возвращается регион хоста-носителя (платформа сама выбирает размещение), а не запрошенный
data.image string Образ ОС
data.monthlyCost string Каталожная месячная стоимость в Вайбах (Ꝟ) строкой (например "1200"). Фактическое списание может отличаться. Сравнивайте через Number(data.monthlyCost)
data.mode string BLACKHOLE или OPEN
data.createdVia string api — вызов через API Вайбкод, ui — действие в личном кабинете, galaxy — galaxy-приложение. У серверов агентов и ботов приходят собственные значения
data.subdomain string Субдомен для приложения
data.blackholeStatus string NONE | CONNECTED | DISCONNECTED. Для работающего BLACKHOLE-сервера сохранённый CONNECTED сверяется с текущим снимком шлюза только для ответа. Запись в базе и туннель этот GET не меняет
data.accessPolicy string OWNER_ONLY | NAMED_USERS | DEPARTMENT | PORTAL | AUTHENTICATED | PUBLIC
data.runtimeId string | null ID рантайма, установленного через POST /:id/deploy (создание сервера всегда даёт null).
data.runtimeStatus string | null Устаревшее поле, оставлено для совместимости. Для серверов, созданных после 2026-04-25, всегда возвращается null. Рантайм ставится на этапе POST /:id/deploy, а сигнал его готовности — успех шага runtime в ответе деплоя, а не значение этого поля
data.startCommand string | null Команда запуска последнего УСПЕШНОГО деплоя (start в POST /:id/deploy). null означает, что команда не требовалась или деплоя ещё не было; различайте эти случаи по deployPort
data.installCommand string | null Команда установки зависимостей того же деплоя. null — деплой прошёл без install, в том числе если было передано пустое значение
data.deployPort number | null Порт, объявленный в том же деплое (port в POST /:id/deploy). Не совпадает с localPort: PATCH /v1/infra/servers/:id/port меняет localPort независимо от деплоя. null — деплоя ещё не было
data.appUrl string | null HTTPS-адрес приложения
data.localPort number Настроенный порт (по умолчанию 3000). В автоопределении это предпочтительный fallback, а фактическую последнюю цель показывает detectedPort. Меняется через PATCH /v1/infra/servers/:id/port
data.detectedPort number | null Последний порт, который сообщил сканер подключённого агента. null — достоверного наблюдения ещё не сохранено; ответ агента без сканера не создаёт и не стирает наблюдение
data.detectedPortObservedAt string (ISO 8601) | null Когда платформа получила detectedPort. Поле обновляется асинхронно после подключения туннеля; этот GET не опрашивает агент
data.portPinned boolean Порт закреплён в настройках агента на машине, поэтому переживает сон, пробуждение и восстановление туннеля. false — агент определяет порт сам при каждом старте. Подробнее — Изменение порта
data.sleepAfterMinutes number | null Через сколько минут простоя сервер автоматически усыпляется. null — не усыплять автоматически
data.idleSleepProtected boolean true, если сон по простою недоступен: сервер должен оставаться на связи. Поле сообщает только решение и не раскрывает ботов или API-ключи
data.runMode string Режим работы: IDLE — засыпает по простою, SCHEDULE — работает по расписанию, ALWAYS — круглосуточно. Выводится из назначенного расписания, idleSleepProtected, createdVia и sleepAfterMinutes. Защищённый сервер без расписания имеет режим ALWAYS, даже если хранит числовой порог
data.workSchedule object | null Назначенное расписание или null. Поля: id, name (у готового расписания платформы пустое — опознавайте по presetKey), presetKey, timezone, windows. Каждое окно — {{ isoDay, start, end }}, где isoDay это 1…7 от понедельника, а start и end — местное время расписания в виде ЧЧ:ММ. Окна приходят СПИСКОМ: в одном дне их может быть два, например смена с перерывом
data.provisionError string | null Краткая причина последней ошибки провижининга/сборки. null, если ошибок не было
data.provisionErrorCode string | null Машиночитаемый код категории сбоя: PREEMPTIBLE_EVICTION / PROVISION_TIMEOUT / NO_CAPACITY / GUEST_NOT_BOOTING / AGENT_NEVER_CONNECTED / DISK_FULL / GENERIC. null, если ошибок не было. Значение GUEST_NOT_BOOTING терминальное. Разбор этого значения и DISK_FULL — в «Известных особенностях»
data.provisionReason string | null Структурный признак причины сбоя galaxy-приложения: oom — не хватило памяти контейнера, или crash. null у обычных серверов и когда сбоя не было. Значение oom — сигнал перенести приложение на выделенный сервер, порядок описан в Создать сервер
data.buildLog string | null Хвост лога docker-сборки (≤8 КБ) для упавшей сборки galaxy-приложения. null для обычных серверов и при успешной сборке
data.nextScheduledWakeAt string (ISO 8601) | null Время ближайшего запланированного пробуждения (с учётом опережающего запаса). null, если у сервера нет включённых окон пробуждения. Настраивается через Пробуждение по расписанию
data.wakeScheduleCapable boolean Доступна ли серверу настройка окон пробуждения по расписанию — зависит от типа сервера и включённости фичи на портале
data.buildHint string | null Локализованная рекомендация при сбое сборки galaxy-приложения или занятом пути загрузки. Поле приходит всегда. Заполнено для известной причины в error, а также в provisioning при занятом пути загрузки (GALAXY_UPLOAD_BUSY), когда советует повторить тот же деплой. У зависшей фоновой попытки после таймаута статус становится error, а причина занятого пути и подсказка сохраняются. Иначе null, в том числе у обычных серверов
data.b24CatalogSync object Состояние карточки приложения в каталоге приложений Вайбкод на портале Битрикс24: { status, itemId, attempts, pendingOp, eligible }. Разбор полей — Опубликовать в каталоге
data.createdAt string (ISO 8601) Момент создания
data.access object У участника команды содержит via: "collaborator", role, allowedActions, allowedEndpoints и _note. У хоста по ссылке содержит via: "galaxy-reference", allowedActions: ["read"], только GET /v1/infra/servers и GET /v1/infra/servers/:id в allowedEndpoints и пояснение _note. Поля role нет. У управляющего ключа этого поля в детальной карточке нет — маркер via: "owner" отдаёт список серверов

Пример полного ответа

JSON
{
  "success": true,
  "data": {
    "id": "e765edfc-ba0a-43de-b8ea-838dd872c522",
    "status": "running",
    "provider": "bitrix-cloud",
    "kind": "STANDALONE",
    "galaxyId": null,
    "appCount": null,
    "diskTotalMb": null,
    "diskFreeMb": null,
    "diskState": null,
    "diskProbedAt": null,
    "name": "vibe-server-pd9l",
    "displayName": "vibe-server-pd9l",
    "description": null,
    "ip": "111.88.251.211",
    "ssh": {
      "user": "ubuntu",
      "port": 22,
      "hasPassword": true
    },
    "plan": "bc-small",
    "region": "ru-central1-a",
    "image": "fd80bm0rh4rkepi5ksdi",
    "monthlyCost": "1200",
    "mode": "OPEN",
    "createdVia": "ui",
    "subdomain": "app-05b67cf7",
    "blackholeStatus": "CONNECTED",
    "accessPolicy": "OWNER_ONLY",
    "runtimeId": null,
    "runtimeStatus": null,
    "startCommand": null,
    "installCommand": null,
    "deployPort": null,
    "appUrl": "https://app-05b67cf7.vibecode.bitrix24.tech",
    "localPort": 3000,
    "detectedPort": 3000,
    "detectedPortObservedAt": "2026-09-15T08:15:30.000Z",
    "portPinned": false,
    "sleepAfterMinutes": null,
    "idleSleepProtected": false,
    "runMode": "IDLE",
    "workSchedule": null,
    "provisionError": null,
    "provisionErrorCode": null,
    "provisionReason": null,
    "b24CatalogSync": {
      "status": "IDLE",
      "itemId": null,
      "attempts": 0,
      "pendingOp": null,
      "eligible": true
    },
    "buildLog": null,
    "nextScheduledWakeAt": null,
    "wakeScheduleCapable": true,
    "buildHint": null,
    "createdAt": "2026-04-03T13:30:25.819Z"
  }
}

Пример хоста по `galaxyId`

JSON
{
  "success": true,
  "data": {
    "id": "3f7a91c4-6e0b-42d8-8b55-19ad7c204e6f",
    "status": "running",
    "kind": "GALAXY",
    "galaxyId": null,
    "name": "vibe-galaxy-host-q7x2",
    "displayName": "Общий хост Galaxy",
    "createdAt": "2026-06-18T08:15:30.000Z",
    "access": {
      "via": "galaxy-reference",
      "allowedActions": ["read"],
      "allowedEndpoints": [
        "GET /v1/infra/servers",
        "GET /v1/infra/servers/:id"
      ],
      "_note": "This host is readable only because one of your galaxy applications references it. Host management and application operations must target resources owned by your key, not this shared host."
    }
  }
}

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

404 — сервер не существует, удалён или у текущего ключа нет ни управляющего, ни командного, ни ссылочного доступа:

JSON
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Server not found"
  }
}

Ошибки

HTTP Код Описание
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Ключ не опознан: такой строки на платформе нет
403 EXTERNAL_COLLABORATOR_KEY_SERVER_MISMATCH Вызов сделан ключом внешнего участника разработки, а в адресе указан не тот сервер, для которого ключ выпущен. Такой ключ действует ровно на одном сервере, и ответ не сообщает, существует ли запрошенный сервер. Для работы с другим сервером нужен ключ того внешнего членства
403 EXTERNAL_COLLABORATOR_NOT_A_MEMBER Ключ внешнего участника обращается к своему серверу, но доступа сейчас нет: членство снято, истёк его срок либо для аккаунта Битрикс24, которому принадлежит сервер, отключены внешние участники разработки. Код эти причины не различает и сведений о сервере не раскрывает. Членство перечитывается на каждом запросе, поэтому снятый доступ перестаёт работать сразу
404 NOT_FOUND Сервер не найден, удалён или недоступен текущему ключу ни через управление, ни через привязку приложения, ни через команду разработки. Чужой хост остаётся скрыт, если живое galaxy-приложение ключа не ссылается на него в том же портале
429 RATE_LIMITED Превышен общий лимит запросов платформы

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

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

  • Статус туннеля в карточке эффективный, но без побочных эффектов. Если работающий BLACKHOLE-сервер сохранён как CONNECTED, а его субдомена нет в успешном непустом снимке шлюза, ответ показывает DISCONNECTED. Недоступный или пустой снимок оставляет сохранённое значение. Запрос не запускает repair и не пишет результат сверки в базу. Это не относится к проекции galaxy-reference, которая всегда остаётся сохранённым снимком.
  • Карточка участника команды разработки короче и не опрашивает провайдера. При access.via: "collaborator" не приходят ip, ssh, localPort, detectedPort, detectedPortObservedAt, portPinned, deletedAt, appCount, поля диска, wakeScheduleCapable и b24CatalogSync, а monthlyCost, sleepAfterMinutes и nextScheduledWakeAt добавляются только роли ADMIN. Диагностика приложения и параметры последнего деплоя при этом на месте: reachability, buildLog, buildHint, startCommand, installCommand и deployPort приходят так же, как владельцу. Статус в этой ветке берётся из последнего замера платформы, а не сверяется с провайдером на месте, поэтому у только что созданного сервера он может отставать на один такт опроса — для цикла ожидания готовности используйте ключ, которым сервер создавали.
  • Проекция galaxy-reference ещё короче и всегда берётся из сохранённого состояния. Она не обращается к провайдеру или шлюзу даже при status: "provisioning". Проекция существует только пока живое galaxy-приложение текущего ключа ссылается на живой GALAXY-хост того же портала. Она открывает только этот GET и список серверов. /deploy, /exec, /upload, /logs, /sources, /ssh, /refresh, операции жизненного цикла, PATCH и DELETE для хоста не открываются.
  • Для полной владельческой карточки запрос к провайдеру выполняется при provisioning или отсутствующем IP. В обоих случаях у сервера должен быть внешний идентификатор. Если IP уже сохранён, для running/stopped/sleeping/error запроса нет. Чтобы принудительно сверить состояние, используйте POST /v1/infra/servers/:id/refresh.
  • Критерий готовности — два поля. Для продолжения работы с Deploy API нужны одновременно status: "running" и blackholeStatus: "CONNECTED". Если стоит только running — виртуальная машина уже жива, но агент туннеля ещё не подключился. Ждать бесконечно не нужно: у только что созданного отдельного сервера (kind: "STANDALONE"), который держит running при blackholeStatus: "NONE" дольше десяти минут, агент уже не поднимется — платформа переводит такой сервер в error с кодом AGENT_NEVER_CONNECTED (см. ниже). Готовность рантайма после деплоя определяется успехом шага runtime в ответе POST /:id/deploy — поле runtimeStatus для этого не используется, оно устаревшее и остаётся null.
  • blackholeStatus: "DISCONNECTED" при running — туннель потерял связь у живого сервера. Попробуйте POST /v1/infra/servers/:id/repair.
  • AGENT_NEVER_CONNECTED — на новой машине не поднялся агент. Виртуальная машина запустилась штатно, но установка агента при старте не завершилась, поэтому туннеля нет и не будет: скрипт первой загрузки выполняется один раз. Отдельному серверу (kind: "STANDALONE") платформа выносит этот вердикт, только пока он только что создан и держит status: "running" при blackholeStatus: "NONE" дольше десяти минут: сервер переводится в error, начисление за машину закрывается. Сначала попробуйте POST /v1/infra/servers/:id/repair — он ставит агента заново по SSH; если не помогло, пересоздайте сервер. POST /start на таком сервере отвечает 422 с этим же кодом: запуск ничего не чинит, а объяснение стирает. Вердикт выносится только серверам в режиме Black Hole — для сервера в открытом режиме running при blackholeStatus: "NONE" это нормальное состояние. Хост-галактика (kind: "GALAXY") получает тот же код по своему порогу — пятнадцать минут в running при blackholeStatus: "NONE" — и не только после создания: вердикт выносится всякий раз, когда хост снова дольше порога остаётся в этом состоянии. Уже существующие хосты-галактики, у которых до этого изменения сохранился старый текст provisionError, сохраняют provisionErrorCode: null в ответах GET, но /start и availableActions распознают это точное legacy-описание и предлагают только восстановление. Остальное совпадает: начисление закрывается, POST /start отвечает 422 с этим кодом, лечится ремонтом. Если агент подключится сам, сервер вернётся в running, а provisionError и provisionErrorCode очистятся.
  • DISK_FULL — ремонт не смог поставить агента: на диске сервера нет места. Код записывает ремонт, завершившийся неудачей. Повтор ремонта поможет только после того, как на диске освободится место. Успешный ремонт снимает код. Сервер при этом не переходит в error. Если ремонт будил спящий сервер, после неудачи машина остаётся запущенной до авто-сна, а при выключенном авто-сне — пока её не остановят.
  • Подводный камень monthlyCost: поле возвращается строкой. Сравнение двух таких строк идёт посимвольно: "24" > "1000" вернёт true, а .sort() выстроит значения не по величине. Приводите к числу через Number(data.monthlyCost).
  • Если потеряли SSH-креды из ответа создания — восстановить нельзя. Пересоздайте SSH-ключ вручную через POST /v1/infra/servers/:id/exec (для BLACKHOLE) или пересоздайте сервер.
  • GUEST_NOT_BOOTING — терминальное состояние, повтор не поможет. Гостевая операционная система машины не загружается. POST /repair и POST /start отвечают 422 с этим кодом, в availableActions остаётся только delete, начисление за машину закрыто. Удаление приложения требует подтверждённого удаления контейнера: DELETE /v1/infra/servers/:id возвращает 502 GALAXY_HOST_UNREACHABLE, если teardown не подтверждён, сохраняя приложение и его привязку. Восстановите доступ к хосту и повторите запрос либо обратитесь в поддержку платформы для подтверждения уничтожения облачной машины и завершения уборки. Клиент по расписанию должен пересоздать такую машину вместо повторных запусков и ремонта.

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