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

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

Проверяет состояние собственного запроса на изменение доступа перед повтором исходной операции.

Используйте исходный 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) |

## Примеры

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

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

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

```bash
curl "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/audience-proposals/PROPOSAL_ID" \
  -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}`,
  {
    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}`,
  {
    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": "PENDING",
    "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` |

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

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

- **Подтверждение и применение — разные шаги.** API-ключ не может подтвердить запрос. После решения человека состояние `APPROVED` позволяет повторить исходный вызов с тем же ключом, точными параметрами и `approvalId`.
- **Чтение обнаруживает устаревший запрос.** Проверка может вернуть `STALE` или `EXPIRED`. Создайте новый запрос исходным действием.
- **Секреты выдаёт исходный вызов.** Токены и секретные ссылки получает исходная операция после применения, а не проверка запроса.

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

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