## Отменить запрос доступа

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

Отменяет собственный запрос на изменение доступа. Отмена не меняет доступ к приложению.

Используйте исходный API-ключ, которым создан запрос. Другой ключ того же владельца не получает доступ к запросу.

## Параметры

| Параметр | В | Тип | Обяз. | Описание |
|----------|---|-----|:-----:|----------|
| `id` | path | string (UUID) | да | ID сервера из исходного действия. Источник — [Список серверов](/docs/infra/servers/list) |
| `proposalId` | path | string (UUID) | да | ID запроса из `error.details.proposalId` ответа `409 AUDIENCE_APPROVAL_REQUIRED` на [смену политики](./access-policy.md) или [создание токена](/docs/infra/access-tokens/create) |

## Поля запроса (body)

Тело необязательно. Если передаёте тело, используйте только пустой объект `{}`.

## Примеры

### 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"
```

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

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

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

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

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

```javascript
const response = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/audience-proposals/${proposalId}/cancel`,
  {
    method: 'POST',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  },
)
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": "CANCELLED",
    "baseRevision": "0",
    "currentRevision": "0"
  }
}
```

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

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

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

## Ошибки

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

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

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

- **Проверяйте `canCancel` перед отменой.** Отменить можно актуальный запрос в состоянии `PENDING` или `APPROVED`.
- **Отмена не отзывает выданный доступ.** После `APPLIED` меняйте доступ исходными методами управления.

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

- [Согласование расширения доступа](/docs/infra/access#согласование-расширения-доступа)
- [Проверить запрос на изменение доступа](./audience-proposals-get.md)
- [Политика доступа](./access-policy.md)
- [Создать токен](/docs/infra/access-tokens/create)
