
## Список ключей

`GET /v1/ai/credentials`

Возвращает все BYOK-ключи, подключённые текущим пользователем (USER scope), вместе со статистикой использования за последние 30 дней. Ключи на уровне портала (PORTAL) не попадают в этот список — их подключает администратор в кабинете Вайбкод.

## Параметры

Параметров запроса нет.

## Примеры

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

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

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

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

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

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

const { data } = await res.json()
data.forEach((cred) => {
  console.log(`${cred.name} (${cred.provider.name}) — ${cred.usage.requests} запросов за 30 дней`)
})
```

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

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

const { data } = await res.json()
console.log('Подключено провайдеров:', data.length)
```

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

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data` | array | Массив подключённых ключей |
| `data[].id` | string | Уникальный ID ключа |
| `data[].providerId` | string | ID провайдера. Список: [`GET /v1/ai/providers`](/docs/ai/credentials/providers) |
| `data[].provider.slug` | string | Системное имя провайдера: `openai`, `anthropic`, `custom-openai-compat` и т. п. |
| `data[].provider.name` | string | Отображаемое название провайдера |
| `data[].name` | string | Имя ключа, заданное пользователем |
| `data[].isDefault` | boolean | Флаг ключа по умолчанию для провайдера |
| `data[].lastError` | string \| null | Последняя ошибка верификации (null, если ошибок не было) |
| `data[].lastErrorAt` | string \| null | Время последней ошибки в `ISO 8601` |
| `data[].usage.requests` | number | Количество запросов за последние 30 дней |
| `data[].usage.promptTokens` | number | Токены входа за 30 дней |
| `data[].usage.completionTokens` | number | Токены ответа за 30 дней |
| `data[].createdAt` | string | Время создания в `ISO 8601` |
| `data[].updatedAt` | string | Время последнего обновления в `ISO 8601` |

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

```json
{
  "success": true,
  "data": [
    {
      "id": "cred_abc123def456",
      "providerId": "openai",
      "provider": {
        "slug": "openai",
        "name": "OpenAI"
      },
      "name": "Мой личный OpenAI",
      "isDefault": true,
      "lastError": null,
      "lastErrorAt": null,
      "usage": {
        "requests": 142,
        "promptTokens": 45200,
        "completionTokens": 18300
      },
      "createdAt": "2026-04-15T10:00:00.000Z",
      "updatedAt": "2026-04-20T14:30:00.000Z"
    }
  ]
}
```

Если ключи не подключены — `data` будет пустым массивом:

```json
{
  "success": true,
  "data": []
}
```

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

`403 scope_missing` — у API-ключа нет скоупа `vibe:ai`:

```json
{
  "success": false,
  "error": {
    "code": "scope_missing",
    "message": "API key does not have the vibe:ai scope"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 403 | `scope_missing` | API-ключу не хватает скоупа `vibe:ai` |
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |

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

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

**Видны только USER-ключи.** Эндпоинт показывает ключи, которые подключили лично вы. Ключи на уровне портала (PORTAL scope), которые администратор настроил для всех участников — здесь не отображаются. Их подключает администратор в кабинете Вайбкод.

**`lastError` показывает последнюю проблему.** Если у ключа `lastError` отличен от `null` — провайдер вернул ошибку при последней проверке (через `POST /v1/ai/credentials/:id/test` или при использовании в чат-комплишене). Поле сбрасывается при успешном `PATCH` с обновлением `credentials` или при успешной проверке.

**Статистика за фиксированные 30 дней.** Поле `usage` содержит цифры за последние 30 дней без возможности задать период. Для произвольного периода — [`GET /v1/ai/credentials/:id/usage?days=N`](./usage.md).

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

- [Подключить ключ](./create.md)
- [Список провайдеров](/docs/ai/credentials/providers)
- [Свои ключи (BYOK)](/docs/ai/credentials)
