
## Список серверов

`GET /v1/infra/servers`

Возвращает серверы, которыми управляет текущий API-ключ. Удалённые серверы (`status: "deleted"`) в выдачу по умолчанию не попадают — чтобы их увидеть, передайте `?includeDeleted=true`. Серверы других ключей — даже в том же портале — не видны. Для просмотра всех серверов портала используйте панель администратора в личном кабинете.

## Параметры запроса

| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| `includeDeleted` | string | Нет | Передайте `true`, чтобы в выдачу попали и удалённые серверы. Любое другое значение (как и отсутствие параметра) оставляет выдачу по умолчанию |
| `page` | number | Нет | Номер страницы (с 1). Действует только на серверы, где вы состоите в команде разработки, а не владелец, — см. «Известные особенности» |
| `limit` | number | Нет | Размер страницы, 1..500, по умолчанию 50. Учитывается, только если передан `page` и/или `limit` |

Зачем это нужно: исходники переживают сервер. Удалив сервер, вы по-прежнему можете посмотреть его версии исходников, снять с них тег, скачать или очистить — но для этого нужен его идентификатор, а получить его больше неоткуда. Контракт исходников описан на странице [Хранилище исходников](/docs/source-storage).

## Примеры

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

```bash
curl -H "X-Api-Key: YOUR_API_KEY" \
  https://vibecode.bitrix24.tech/v1/infra/servers
```

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

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

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

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

servers.forEach(s => {
  const ready = s.status === 'running' && s.blackholeStatus === 'CONNECTED'
  console.log(`${s.name}: ${ready ? '✓ готов' : s.status} — ${s.appUrl}`)
})
```

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

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

## Поля ответа

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data` | array | Массив серверов. Каждый элемент — такой же объект, как у [`GET /v1/infra/servers/:id`](./get.md), за исключением: SSH-полей `ssh.password` и `ssh.privateKey` (в списке не отдаются) и полей `localPort` / `buildLog` / `buildHint` (только у одиночного `GET /:id`) |
| `data[].id` | string (UUID) | ID сервера |
| `data[].status` | string | Текущий статус: `provisioning`, `running`, `sleeping`, `error`. Удалённые серверы (`deleted`) в выдачу по умолчанию не попадают — см. `includeDeleted` |
| `data[].deletedAt` | string \| null | Момент удаления сервера в ISO-8601. `null` у живых серверов |
| `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`, если замера ещё не было. Пороги описаны в [Галактика](/docs/infra/galaxy). Для `STANDALONE` и `GALAXY_APP` — `null` |
| `data[].diskProbedAt` | string (ISO 8601) \| null | Время замера диска. У спящей машины приходит последнее известное значение вместе с временем этого замера |
| `data[].name` | string | Системное имя сервера |
| `data[].displayName` | string \| null | Отображаемое имя для личного кабинета. Если не передавалось — совпадает с `name` |
| `data[].description` | string \| null | Описание приложения для карточки каталога Битрикс24. `null`, если описание не задавали. Меняется через [`PATCH /v1/infra/servers/:id`](./update.md) |
| `data[].ip` | string \| null | Публичный IP (может быть `null`, пока идёт создание сервера) |
| `data[].ssh` | object \| null | Блок SSH-данных: `{ user, port, hasPassword }`. Поля `password` и `privateKey` в списке не присутствуют |
| `data[].plan` | string | Тариф. **Для galaxy-приложения** (`kind: "GALAXY_APP"`) возвращается тариф хоста-носителя, а не запрошенный |
| `data[].region` | string | Фактический регион сервера — может отличаться от запрошенного после переключения на запасную зону. **Для galaxy-приложения** возвращается регион хоста-носителя |
| `data[].image` | string | Образ ОС |
| `data[].monthlyCost` | string | Каталожная месячная стоимость в Вайбах (Ꝟ), строкой: `"1200"` или `"1200.00"`. Фактическое списание может отличаться. Сравнивайте с `Number(s.monthlyCost)` |
| `data[].mode` | string | `BLACKHOLE` или `OPEN` |
| `data[].createdVia` | string | `api` — вызов через API Вайбкод, `ui` — действие в личном кабинете, `galaxy` — galaxy-приложение. У серверов агентов и ботов приходят собственные значения |
| `data[].subdomain` | string | Субдомен для приложения |
| `data[].blackholeStatus` | string | Состояние туннеля: `NONE`, `WAITING`, `CONNECTED`, `DISCONNECTED` |
| `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`](/docs/infra/deploy/deploy), а сигнал его готовности — успех шага `runtime` в ответе деплоя, а не значение этого поля |
| `data[].appUrl` | string \| null | HTTPS-адрес приложения |
| `data[].sleepAfterMinutes` | number \| null | Через сколько минут простоя сервер автоматически усыпляется. `null` — не усыплять автоматически |
| `data[].provisionError` | string \| null | Краткая причина последней ошибки создания или сборки. `null`, если ошибок не было |
| `data[].provisionErrorCode` | string \| null | Машиночитаемый код категории сбоя: `PREEMPTIBLE_EVICTION` / `PROVISION_TIMEOUT` / `NO_CAPACITY` / `GUEST_NOT_BOOTING` / `GENERIC`. `null`, если ошибок не было. Значение `GUEST_NOT_BOOTING` терминальное — см. «Известные особенности» |
| `data[].provisionReason` | string \| null | Структурный признак причины сбоя galaxy-приложения: `oom` — не хватило памяти контейнера, или `crash`. `null` у обычных серверов и когда сбоя не было. Значение `oom` — сигнал перенести приложение на выделенный сервер, порядок описан в [Создать сервер](./create.md) |
| `data[].b24CatalogSync` | object | Состояние карточки приложения в каталоге приложений Вайбкод на портале Битрикс24: `{ status, itemId, attempts, pendingOp, eligible }`. Разбор полей — [Опубликовать в каталоге](./b24-catalog-publish.md) |
| `data[].createdAt` | string (ISO 8601) | Момент создания |
| `total` | number | Только при запросе с `page` и/или `limit`: сколько всего строк вернулся бы без этих параметров (свои серверы + все членства) |
| `page` | number | Только при запросе с `page` и/или `limit`: применённый номер страницы |
| `limit` | number | Только при запросе с `page` и/или `limit`: применённый размер страницы |

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

```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,
      "appUrl": "https://app-05b67cf7.vibecode.bitrix24.tech",
      "sleepAfterMinutes": null,
      "provisionError": null,
      "provisionErrorCode": null,
      "provisionReason": null,
      "b24CatalogSync": {
        "status": "IDLE",
        "itemId": null,
        "attempts": 0,
        "pendingOp": null,
        "eligible": true
      },
      "createdAt": "2026-04-03T13:30:25.819Z"
    }
  ]
}
```

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

401 — не передан API-ключ:

```json
{
  "success": false,
  "error": {
    "code": "MISSING_API_KEY",
    "message": "API key required. Pass via X-Api-Key header."
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |
| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |
| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |

Полный список общих ошибок API — [Ошибки](/docs/errors).

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

- **Пустой массив при работающих серверах означает, что текущий ключ ими не управляет.** Выдача ограничена серверами текущего ключа. После истечения или отзыва прежнего ключа сервер остаётся привязан к нему. Если прежний ключ удалён, сервер остаётся без управляющего ключа. В обоих случаях новый ключ возвращает пустой `data`, хотя серверы работают и видны в личном кабинете. Как вернуть доступ — [Восстановление доступа к серверу](/docs/infra/server-access-recovery).
- **Даже администратор портала видит только свои серверы.** Для портальной картины используйте панель администратора в личном кабинете — ограничение по API-ключу фиксировано.
- **Серверы порталов, помеченных удалёнными в Битрикс24, автоматически скрываются.** Платформа ежедневно проверяет доступность порталов: если портал отвечает 410/403 три дня подряд, он помечается как удалённый и его серверы перестают отображаться.
- **Без `page`/`limit` ответ не пагинируется** — все серверы ключа возвращаются одним массивом, как и раньше. `page`/`limit` режут только серверы, где вы участник команды разработки: собственные серверы ключа всегда приходят целиком, независимо от параметров.
- **`includeDeleted=true` не показывает серверы удалённых порталов.** Скрытие по признаку удалённого портала (см. выше) действует при любом значении параметра: портала больше нет, поэтому вызов к таким серверам бессмысленен.
- **`GUEST_NOT_BOOTING` — терминальное состояние, повтор не поможет.** Гостевая операционная система машины не загружается после прерванного обновления. [`POST /repair`](/docs/infra/lifecycle/repair) и [`POST /start`](/docs/infra/lifecycle/start) отвечают `422` с этим же кодом, в [`availableActions`](/docs/infra/lifecycle/refresh) остаётся только `delete`, начисление за машину закрыто. Клиент, который запускает или ремонтирует серверы по расписанию, обязан читать это значение: такую машину нужно пересоздать, а не чинить.

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

- [Создать сервер](./create.md)
- [Получить сервер](./get.md)
- [Обновить имя и описание](./update.md)
- [Удалить сервер](./delete.md)
- [Жизненный цикл](/docs/infra/lifecycle)
- [Восстановление доступа к серверу](/docs/infra/server-access-recovery)
