## Проверить доступ к чату или сообщению

`GET /v1/chats/access`

Проверяет, может ли текущий пользователь открыть чат, сообщение или то и другое.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|---------|
| `dialogId` (query) | string | нет | Чат для проверки: `chatN` для группового, числовой ID пользователя для личного диалога, `me` — личный диалог текущего пользователя. `chatN` — поле `id` строки [последних диалогов](/docs/chats/discovery/recent), ID пользователя — из [списка пользователей](/docs/entities/users/list) |
| `messageId` (query) | number | нет | Сообщение для проверки — положительное целое, поле `id` сообщения из [ленты чата](/docs/chats/messages/list) |

Нужен хотя бы один из двух параметров: без обоих проверять нечего, и запрос отклоняется с `400 MISSING_PARAMS`. Другие параметры и повторы отклоняются с `400 INVALID_PARAMS` до обращения к Битрикс24.

## Примеры

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

```bash
curl "https://vibecode.bitrix24.tech/v1/chats/access?dialogId=chat42" \
  -H "X-Api-Key: YOUR_API_KEY"
```

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

```bash
curl "https://vibecode.bitrix24.tech/v1/chats/access?dialogId=chat42" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/chats/access?messageId=1002', {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})

// Доступа нет — это ошибка, а не result: false
const canOpen = res.ok && (await res.json()).data.result === true
console.log('Сообщение доступно:', canOpen)
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/chats/access?messageId=1002', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const canOpen = res.ok && (await res.json()).data.result === true
```

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

| Поле | Тип | Описание |
|------|-----|---------|
| `success` | boolean | Всегда `true` при успехе |
| `data.result` | boolean | Всегда `true`: доступ есть |

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

```json
{
  "success": true,
  "data": {
    "result": true
  }
}
```

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

422 — сообщения нет на портале:

```json
{
  "success": false,
  "error": {
    "code": "BITRIX_ERROR",
    "message": "MESSAGE_NOT_FOUND",
    "b24Code": "MESSAGE_NOT_FOUND"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 400 | `MISSING_PARAMS` | Не передан ни `dialogId`, ни `messageId` |
| 400 | `INVALID_PARAMS` | `messageId` не положительное целое, `dialogId` пустой, параметр вне `dialogId` и `messageId` или повтор параметра |
| 403 | `BITRIX_ACCESS_DENIED` | Доступа к чату или сообщению нет |
| 404 | `ENTITY_NOT_FOUND` | Битрикс24 вернул «не найдено». Код портала — в `error.b24Code` |
| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку. Код портала — в `error.b24Code`. `CHAT_NOT_FOUND` — чата нет на портале, `MESSAGE_NOT_FOUND` — сообщения нет |
| 502 | `ME_ALIAS_RESOLUTION_FAILED` | Не удалось определить пользователя при использовании алиаса `me` |
| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `im` |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | Ключ в режиме только для чтения, и запрос сделан не личным ключом сотрудника либо переданный `dialogId` не указывает на существующий диалог |
| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов Битрикс24 |

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

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

**Проверки независимы.** С обоими параметрами эндпоинт проверяет чат и сообщение по отдельности и не сверяет, что сообщение лежит в этом чате. Чтобы узнать чат сообщения, откройте чат [вокруг сообщения](/docs/chats/messages/load-in-context).

**Проверка может сделать вас участником.** Проверка идёт тем же путём, что и открытие чата: если чат разрешает автовступление — например, чат комментариев, коллаб или чат задачи, — вызов добавляет текущего пользователя в участники. Эта точечная операция чтения доступна ключу `READONLY`, если это личный ключ сотрудника со скоупом `im`. Переданный `dialogId` при этом должен указывать на существующий диалог: `chatN` или ID пользователя из списка последних диалогов этого сотрудника. Она сама не отмечает сообщения прочитанными.

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

- [Поиск чатов](/docs/chats/discovery)
- [Информация о диалоге](/docs/chats/discovery/get)
- [Загрузка чата](/docs/chats/messages/load)
