
## Отозвать токен

`DELETE /v1/infra/servers/:id/access-tokens/:tokenId`

Отзывает токен досрочно. Новые переходы по `share-url` и вызовы с `api-bearer` блокируются немедленно.

## Параметры

| Параметр | В | Тип | Обяз. | Описание |
|----------|---|-----|:-----:|----------|
| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера. Список: [`GET /v1/infra/servers`](/docs/infra/servers/list) |
| `tokenId` | path | string (UUID) | да | ID токена из [`POST /access-tokens`](./create.md) или [`GET /access-tokens`](./list.md) |

## Примеры

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

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

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

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

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

```javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/access-tokens/${tokenId}`,
  {
    method: 'DELETE',
    headers: { 'X-Api-Key': 'YOUR_API_KEY' },
  }
)
// 204 No Content — тело ответа отсутствует
if (res.status !== 204) {
  const { error } = await res.json()
  throw new Error(error.code)
}
```

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

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

## Ответ

`204 No Content` — тело ответа отсутствует. Признак успеха — код ответа, не содержимое.

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

```
HTTP/1.1 204 No Content
```

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

410 — токен уже отозван:

```json
{
  "success": false,
  "error": {
    "code": "ALREADY_REVOKED",
    "message": "Token already revoked"
  }
}
```

## Ошибки

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

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

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

- **Куки `share-url` продолжают работать до 10 минут после отзыва.** Отзыв немедленно блокирует новые переходы, но браузер с уже установленными куки видит приложение до истечения сессионного JWT.
- **Истёкший токен отзывается штатно.** Отзыв смотрит только на признак отзыва, поэтому запись с истёкшим `expiresAt` принимает `DELETE` и отвечает `204`. Обновление такой записи, наоборот, отвечает `410 TOKEN_EXPIRED` — [Обновить токен](./refresh.md).

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

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