## Список API-ключей портала

`GET /v1/keys`

Возвращает API-ключи владельца менеджмент-ключа на указанном портале: личные ключи и ключи авторизации приложений.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|----------|
| `portalId` (query) | string | да | Идентификатор портала. Список: [`GET /v1/portals`](/docs/management-keys/portals). Владелец менеджмент-ключа должен состоять в этом портале |

Пагинации нет: в ответе все ключи владельца на портале, новые первыми.

## Примеры

Запрос принимает только менеджмент-ключ — см. [Ограничения](/docs/management-keys#ограничения).

### curl — менеджмент-ключ

```bash
curl "https://vibecode.bitrix24.tech/v1/keys?portalId=0d9f7744-f853-47c7-b06e-6f61f9dd1b7f" \
  -H "X-Api-Key: YOUR_MANAGEMENT_KEY"
```

### JavaScript — менеджмент-ключ

```javascript
const portalId = '0d9f7744-f853-47c7-b06e-6f61f9dd1b7f'

const res = await fetch(`https://vibecode.bitrix24.tech/v1/keys?portalId=${portalId}`, {
  headers: {
    'X-Api-Key': 'YOUR_MANAGEMENT_KEY',
  },
})

const { success, data } = await res.json()
const activeKeys = data.filter((key) => key.status === 'ACTIVE')
console.log('Активных ключей:', activeKeys.length)
```

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

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data` | array | Массив ключей |
| `data[].id` | string | Идентификатор записи ключа. Его принимают [`GET /v1/keys/:id`](/docs/management-keys/get) и эндпоинты, которым нужен ключ как ресурс, — например `targetApiKeyId` в [переносе владения ботом](/docs/bots/management/transfer) |
| `data[].name` | string | Название ключа, заданное при создании |
| `data[].prefix` | string | Первые символы значения ключа |
| `data[].suffix` | string | Последние четыре символа значения ключа |
| `data[].type` | string | Тип записи ключа, всегда `APP` |
| `data[].userId` | string | Идентификатор владельца ключа |
| `data[].portalId` | string | Идентификатор портала |
| `data[].clientId` | string \| null | Идентификатор клиента OAuth, если он записан на ключе. Иначе `null` |
| `data[].scopes` | array | [Скоупы](/docs/scopes) ключа |
| `data[].ipWhitelist` | array | Разрешённые IP-адреса. Пустой массив — без ограничения |
| `data[].expiresAt` | string \| null | Дата окончания срока действия (ISO 8601), `null` — бессрочный |
| `data[].rateLimit` | number \| null | Индивидуальный лимит запросов к AI-эндпоинтам, `null` — общий лимит платформы |
| `data[].status` | string | `ACTIVE`, `REVOKED`, `EXPIRED` или `BLOCKED` |
| `data[].lastUsedAt` | string \| null | Дата последнего запроса этим ключом (ISO 8601) |
| `data[].createdAt` | string | Дата создания (ISO 8601) |
| `data[].updatedAt` | string | Дата последнего изменения (ISO 8601) |
| `data[].accessMode` | string | `READWRITE` или `READONLY` |
| `data[].totalDefault` | boolean \| null | Приходит ли `meta.total` в списках, запрошенных этим ключом. `null` — действует настройка платформы |
| `data[].issuedVia` | string \| null | Канал, которым выписан вебхук ключа: `per-portal` и `cloud-shared` — модуль-коннектор на портале, `dev_key` — ключ разработчика владельца, `legacy` — регистрация через Битрикс24 Network, `none` — вебхук не заводился, у ключа только права `vibe:*`. `null`, если канал не записан |
| `data[].b24Ready` | boolean \| null | Есть ли у ключа рабочие учётные данные для запросов к Битрикс24. `null` у ключа авторизации приложения и у ключа только со скоупами `vibe:*` |

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

```json
{
  "success": true,
  "data": [
    {
      "id": "6dbad0ce-79a9-43f5-8ca4-3e1af7ef63bc",
      "name": "Интеграция с CRM",
      "prefix": "vibe_api_XXXXXXXXX",
      "suffix": "XXXX",
      "type": "APP",
      "userId": "fafa9780-eed7-4d29-b040-2448d924f452",
      "portalId": "0d9f7744-f853-47c7-b06e-6f61f9dd1b7f",
      "clientId": null,
      "scopes": ["crm", "task", "im", "vibe:ai", "vibe:search", "vibe:storage"],
      "ipWhitelist": [],
      "expiresAt": null,
      "rateLimit": null,
      "status": "ACTIVE",
      "lastUsedAt": "2026-10-23T10:01:53.371Z",
      "createdAt": "2026-10-14T07:07:00.732Z",
      "updatedAt": "2026-10-23T10:01:53.371Z",
      "accessMode": "READWRITE",
      "totalDefault": null,
      "issuedVia": "cloud-shared",
      "b24Ready": true
    },
    {
      "id": "ef0b2172-aa01-445c-815c-f8ce82559d5e",
      "name": "Ключ авторизации приложения",
      "prefix": "vibe_app_XXXXXXXXX",
      "suffix": "XXXX",
      "type": "APP",
      "userId": "fafa9780-eed7-4d29-b040-2448d924f452",
      "portalId": "0d9f7744-f853-47c7-b06e-6f61f9dd1b7f",
      "clientId": null,
      "scopes": ["crm", "vibe:infra", "vibe:ai", "vibe:search", "vibe:storage"],
      "ipWhitelist": [],
      "expiresAt": null,
      "rateLimit": null,
      "status": "REVOKED",
      "lastUsedAt": null,
      "createdAt": "2026-08-27T06:36:58.910Z",
      "updatedAt": "2026-08-27T06:37:01.459Z",
      "accessMode": "READWRITE",
      "totalDefault": null,
      "issuedVia": null,
      "b24Ready": null
    }
  ]
}
```

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

400 — не передан `portalId`:

```json
{
  "success": false,
  "error": {
    "code": "MISSING_PORTAL_ID",
    "message": "Query parameter portalId is required"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `MISSING_PORTAL_ID` | Не передан параметр `portalId` |
| 403 | `NOT_PORTAL_MEMBER` | Владелец менеджмент-ключа не состоит в портале с указанным `portalId` |
| 403 | `PORTAL_ACCESS_BLOCKED` | Доступ владельца к порталу отключён: его участие в портале неактивно или запрещено политикой доступа портала |
| 403 | `MANAGEMENT_SCOPE_REQUIRED` | У менеджмент-ключа нет скоупа `vibe:mgmt:keys` |
| 401 | `WRONG_KEY_TYPE` | Запрос отправлен ключом портала — личным `vibe_api_` или ключом авторизации `vibe_app_`. Эндпоинт принимает только менеджмент-ключ |
| 401 | `KEY_INACTIVE` | Менеджмент-ключ отозван или заблокирован |
| 401 | `KEY_EXPIRED` | Срок действия менеджмент-ключа закончился |
| 401 | `INVALID_API_KEY` | Ключ с переданным значением не найден |
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |

Отказы `OWNER_DELETED`, `OWNER_BLOCKED` и `ACCOUNT_PENDING_ERASURE` зависят от аккаунта владельца ключа — см. [Состояние аккаунта владельца](/docs/management-keys#состояние-аккаунта-владельца).

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

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

**Неактивные ключи в списке.** Ответ включает отозванные, истёкшие и заблокированные ключи. Рабочие ключи — элементы со `status: "ACTIVE"`.

**Значение ключа не возвращается.** Поля `prefix` и `suffix` запрос не авторизуют: по ним узнают свой ключ в списке. Значение ключа приходит один раз — в ответе [создания](/docs/management-keys/create) или [перевыпуска](/docs/management-keys/rotate).

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

- [Получить API-ключ](/docs/management-keys/get)
- [Создать API-ключ](/docs/management-keys/create)
- [Изменить API-ключ](/docs/management-keys/update)
- [Удалить API-ключ](/docs/management-keys/delete)
- [Перевыпустить API-ключ](/docs/management-keys/rotate)
- [Список порталов](/docs/management-keys/portals)
- [Менеджмент-ключи](/docs/management-keys)
