## Проверить или отменить запрос доступа

`GET /v1/infra/servers/:id/audience-proposals/:proposalId`

`POST /v1/infra/servers/:id/audience-proposals/:proposalId/cancel`

Позволяют исходному API-ключу прочитать свой запрос на изменение доступа или отменить его. `proposalId` приходит в `error.details.proposalId` ответа `409 AUDIENCE_APPROVAL_REQUIRED` на исходное действие. Другой ключ того же владельца не получает доступ к запросу.

API-ключ не может подтвердить запрос. Решение принимает человек, вошедший в кабинет. Состояние `APPROVED` означает согласие, а не применение: исходный вызов нужно повторить с тем же ключом, точными параметрами и `approvalId`. Отмена сама по себе не меняет доступ.

## Параметры

| Параметр | В | Тип | Обяз. | Описание |
|----------|---|-----|:-----:|----------|
| `id` | path | string (UUID) | да | ID сервера из исходного действия; список — [Список серверов](/docs/infra/servers/list) |
| `proposalId` | path | string (UUID) | да | ID запроса из `error.details.proposalId` |

Для отмены тело необязательно. Если оно передано, допустим только пустой объект `{}`. Идентичность вызывающего определяется проверенным `X-Api-Key`, а не полями тела.

## Примеры

### curl — проверить

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

### curl — отменить

```bash
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/audience-proposals/PROPOSAL_ID/cancel"   -H "X-Api-Key: YOUR_API_KEY"
```

### JavaScript — проверить

```javascript
const response = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/audience-proposals/${proposalId}`,
  { headers: { 'X-Api-Key': apiKey } },
)
const { proposal } = await response.json()
console.log(proposal.state)
```

### JavaScript — отменить

```javascript
const response = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/audience-proposals/${proposalId}/cancel`,
  { method: 'POST', headers: { 'X-Api-Key': apiKey } },
)
const { proposal } = await response.json()
console.log(proposal.state)
```

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

Успешный ответ имеет вид `{ "proposal": ... }`, без обёртки `success` или `data`. Таблица описывает основные поля; ответ также содержит проверяемое действие, исходный, предполагаемый и текущий состав доступа, названия участников и различия.

| Поле | Тип | Описание |
|------|-----|----------|
| `proposal.id` | string (UUID) | ID запроса |
| `proposal.state` | string | `PENDING`, `APPROVED`, `APPLIED`, `REJECTED`, `CANCELLED`, `EXPIRED` или `STALE` |
| `proposal.baseRevision` | string | Версия доступа при создании; десятичная строка |
| `proposal.currentRevision` | string | Текущая версия доступа; десятичная строка |
| `proposal.expiresAt` | string | Срок запроса в ISO 8601 |
| `proposal.canDecide` | boolean | Для API-ключа всегда `false` |
| `proposal.canCancel` | boolean | Можно ли отменить запрос сейчас |
| `proposal.resultEntityId` | string (UUID), optional | ID созданной записи после применения; не токен и не секретная ссылка |

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

Ниже показаны только ID, состояние и версии из ответа проверки:

```json
{
  "proposal": {
    "id": "00000000-0000-4000-8000-000000000001",
    "state": "PENDING",
    "baseRevision": "0",
    "currentRevision": "0"
  }
}
```

После успешной отмены состояние — `CANCELLED`.

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

404 — запрос отсутствует или принадлежит другому вызывающему:

```json
{
  "success": false,
  "error": { "code": "NOT_FOUND", "message": "Proposal not found" }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `VALIDATION_ERROR` | Неверный UUID или непустое тело отмены |
| 401 | `MISSING_API_KEY` | Ключ не передан |
| 401 | `INVALID_API_KEY` | Ключ не опознан |
| 403 | `AUDIENCE_APPROVAL_FORBIDDEN` | Текущий ключ, его владелец или привязка к порталу больше не допускают действие |
| 404 | `NOT_FOUND` | Нет сервера или запроса в нужном портале либо запрос создан другим вызывающим |
| 409 | `AUDIENCE_APPROVAL_REPLAY` | Отмена: запрос уже применён, отменён или завершён другим решением |
| 409 | `AUDIENCE_APPROVAL_STALE` | Отмена: версия доступа изменилась |
| 410 | `AUDIENCE_APPROVAL_EXPIRED` | Отмена: срок запроса истёк |

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

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

- **Исходный ключ остаётся обязательным.** Выдача нового ключа тому же владельцу не переносит запрос. Даже ключ со scope `vibe:cowork` может проверить и отменить собственный запрос, если остальные текущие проверки проходят; это не даёт ему права выполнять изменяющие infra-операции.
- **Чтение обнаруживает устаревший запрос.** Проверка может вернуть `STALE` или `EXPIRED`. Такое согласие неприменимо; создайте новый запрос исходным действием.
- **Секреты не выдаются через отчёт.** Bearer/JWT и секретные ссылки получает только исходный вызов после применения, а не эти методы.

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

- [Политика доступа](/docs/infra/access/access-policy)
- [Создать токен](/docs/infra/access-tokens/create)
