
## Список токенов сервера

`GET /v1/infra/servers/:id/access-tokens`

Возвращает токены сервера с фильтрацией по статусу. По умолчанию — только активные.

## Параметры

| Параметр | В | Тип | Обяз. | Описание |
|----------|---|-----|:-----:|----------|
| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера. Список: [`GET /v1/infra/servers`](/docs/infra/servers/list) |
| `status` | query | string | нет | Фильтр: `active` (по умолч.) \| `expired` \| `revoked` \| `all`. Значение вне этого набора не отбрасывается — выборка ведёт себя как `all` |

## Примеры

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

```bash
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/access-tokens?status=active"
```

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

```bash
curl -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/access-tokens?status=all"
```

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

```javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/access-tokens?status=active`,
  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const { data } = await res.json()
console.log(`Активных токенов: ${data.tokens.length} / ${data.limits.activeCountMax}`)
```

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

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

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

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data.tokens` | array | Массив токенов |
| `data.tokens[].id` | string | ID токена |
| `data.tokens[].mode` | string | `"api-bearer"` или `"share-url"` |
| `data.tokens[].createdVia` | string | Откуда выпущен токен: `PLATFORM` — через API или интерфейс Вайбкод, `BITRIX24_PORTAL` — со стороны Битрикс24 при публикации ссылки на приложение |
| `data.tokens[].name` | string \| null | Метка токена |
| `data.tokens[].identityBound` | boolean | Для `api-bearer` всегда `true`, для `share-url` — требуется ли вход через Битрикс24 |
| `data.tokens[].shortcode` | string \| null | Код ссылки для `share-url`, `null` для `api-bearer` |
| `data.tokens[].expiresAt` | string (ISO 8601) | Момент истечения |
| `data.tokens[].revokedAt` | string (ISO 8601) \| null | Момент отзыва, `null` если не отозван |
| `data.tokens[].createdAt` | string (ISO 8601) | Момент выпуска |
| `data.tokens[].lastUsedAt` | string (ISO 8601) \| null | Последнее использование |
| `data.tokens[].sessionCount` | number | Число сессий, созданных через этот токен |
| `data.tokens[].createdBy.id` | string | ID пользователя, выпустившего токен |
| `data.tokens[].createdBy.name` | string | Имя пользователя |
| `data.tokens[].createdBy.email` | string | Электронная почта пользователя |
| `data.limits.activeCount` | number | Текущее число активных токенов сервера |
| `data.limits.activeCountMax` | number | Лимит активных токенов на сервер (100) |
| `data.limits.mintRateLimitPerHour` | number | Лимит выпусков в час на API-ключ (50) |
| `data.limits.mintsLastHour` | number | Количество выпущенных токенов за последний час по данному API-ключу |

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

```json
{
  "success": true,
  "data": {
    "tokens": [
      {
        "id": "9f1c4b7e-3d52-4a18-9c0e-7b2a1f6d84c3",
        "mode": "api-bearer",
        "createdVia": "PLATFORM",
        "name": "ci-smoke",
        "identityBound": true,
        "shortcode": null,
        "expiresAt": "2026-05-18T10:50:00.000Z",
        "revokedAt": null,
        "createdAt": "2026-05-18T10:40:00.000Z",
        "lastUsedAt": "2026-05-18T10:41:30.000Z",
        "sessionCount": 1,
        "createdBy": { "id": "c4e8b1a7-6f30-4d92-8a15-3b7e0c2d94f6", "name": "Иван Петров", "email": "ivan@example.bitrix24.ru" }
      },
      {
        "id": "2a7d5e61-84bc-4f39-b0d7-5e6c9a3f1b28",
        "mode": "share-url",
        "createdVia": "BITRIX24_PORTAL",
        "name": "предпросмотр",
        "identityBound": false,
        "shortcode": "R8k3Zm2P",
        "expiresAt": "2026-06-17T08:44:00.000Z",
        "revokedAt": null,
        "createdAt": "2026-05-18T08:44:00.000Z",
        "lastUsedAt": null,
        "sessionCount": 0,
        "createdBy": { "id": "c4e8b1a7-6f30-4d92-8a15-3b7e0c2d94f6", "name": "Иван Петров", "email": "ivan@example.bitrix24.ru" }
      }
    ],
    "limits": {
      "activeCount": 2,
      "activeCountMax": 100,
      "mintRateLimitPerHour": 50,
      "mintsLastHour": 1
    }
  }
}
```

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

404 — сервер не найден:

```json
{
  "success": false,
  "error": {
    "code": "SERVER_NOT_FOUND",
    "message": "Server not found"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |
| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |
| 403 | `TOKEN_OWNER_MISMATCH` | Сервер принадлежит другому API-ключу. Членство в команде разработки сервера эту операцию не открывает — она требует управляющего ключа при любой роли. |
| 404 | `SERVER_NOT_FOUND` | Сервер не найден или удалён |
| 503 | `FEATURE_DISABLED` | Раздел токенов доступа выключен на платформе. Признак до вызова и запасной путь — [Доступность](/docs/infra/access-tokens#доступность) |

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

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

- **Поле `token` (JWT) не включается в список.** JWT приходит только в ответе на [выпуск](./create.md) и на [обновление](./refresh.md) токена.
- **`status=all` возвращает истёкшие и отозванные токены.** Статус токена определяется по полям `revokedAt` (не `null` → отозван) и `expiresAt` (меньше текущего времени → истёк).
- **Список ограничен 500 токенами.** Фильтр `status` сужает выборку до нужной категории.

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

- [Выпустить токен](./create.md)
- [Отозвать токен](./delete.md)
- [Токены доступа](/docs/infra/access-tokens)
