
# Бот-платформа

Создавайте чат-ботов Битрикс24: регистрируйте бота, получайте сообщения и команды пользователей, отвечайте текстом, кнопками и вложениями, управляйте групповыми чатами и участниками. Не нужны вебхуки и публичный сервер — бот опрашивает события и отвечает обычными HTTP-запросами.

**Скоуп:** `imbot` | **Базовый URL:** `https://vibecode.bitrix24.tech/v1` | **Авторизация:** `X-Api-Key`

[Какой ключ выбрать](#какой-ключ-выбрать) | [Владение ботом](#владение-ботом) | [Где работает бот](#где-работает-бот) | [Быстрый старт](#быстрый-старт) | [Echo-бот (пример)](#полный-пример-echo-бот) | [Коды ошибок](#коды-ошибок) | [Справочник эндпоинтов](#справочник-эндпоинтов)

## Разделы документации

- [Управление ботами](/docs/bots/management) — регистрация, обновление, удаление
- [События](/docs/bots/events) — опрос входящих сообщений и команд
- [Сообщения](/docs/bots/messages) — отправка, редактирование, удаление, форматирование
- [Чаты](/docs/bots/chats) — создание чатов, управление участниками и менеджерами
- [Команды](/docs/bots/commands) — slash-команды бота
- [Интерфейс](/docs/bots/ui) — реакции, индикатор набора, поле ввода
- [Файлы](/docs/bots/files) — загрузка и скачивание
- [Диагностика проблем](/docs/bots/troubleshooting) — что делать, если бот не получает события или возвращает ошибки
- [Восстановление доступа к боту](/docs/bots/ownership-recovery) — бота нет в списке, а его код занят

## Оформление сообщений

Справочники по оформлению текста при отправке и редактировании сообщений:

- [Форматирование текста (BB-коды)](/docs/bots/messages/formatting)
- [Клавиатура](/docs/bots/messages/keyboard)
- [Вложения (ATTACH-блоки)](/docs/bots/messages/attach)

---

## Какой ключ выбрать

Бот-платформа работает с двумя типами ключей. Выбор определяется тем, от чьего имени бот будет обращаться к Битрикс24.

| Сценарий | Ключ | Заголовки запроса |
|---------|------|-------------------|
| Бот для своего портала: собственный сервер, фоновый процесс, личный скрипт | Личный API-ключ `vibe_api_…` | `X-Api-Key: vibe_api_…` |
| Бот внутри OAuth-приложения, опубликованного в каталоге Вайбкод и установленного на портал | Ключ авторизации `vibe_app_…` | `X-Api-Key: vibe_app_…` + `Authorization: Bearer <session_token>` |

**Личный ключ `vibe_api_…`.** Создаётся в личном кабинете Вайбкод и привязан к одному порталу Битрикс24. Все запросы идут от лица владельца ключа, дополнительный токен сессии не требуется. Подходит для одноразовых ботов, которые не публикуются как приложение.

**Ключ авторизации `vibe_app_…`.** Привязан к OAuth-приложению из каталога. Каждый запрос отправляется от лица того пользователя, который установил приложение на свой портал и прошёл OAuth-авторизацию — поэтому обязателен заголовок `Authorization: Bearer <session_token>`. Без Bearer бот-эндпоинты вернут `401 TOKEN_MISSING`. Подходит для ботов, которые работают от лица разных пользователей того портала, где приложение зарегистрировано.

Подробное описание типов ключей, форматов и получения `session_token` — [Ключи и авторизация](/docs/keys-auth).

---

## Владение ботом

Бот привязан к тому API-ключу, которым зарегистрирован. Все операции с ботом — получение событий, отправка сообщений, обновление — выполняются тем же ключом. Запрос с другого ключа возвращает `403 BOT_ACCESS_DENIED`.

Это важно при деплое: если приложение развёрнуто с одним ключом, а бот создан другим, обращения к бот-эндпоинтам этим ключом не пройдут. Регистрируйте бота и работайте с ним одним и тем же ключом.

Передать бота на другой ключ можно через [`POST /v1/bots/:botId/transfer`](/docs/bots/management/transfer) — например, когда исходный ключ отозван после пересоздания приложения. `botId` и история чатов при этом сохраняются.

Из-за этой же привязки бот, зарегистрированный другим ключом, не приходит в `GET /v1/bots`, хотя его `code` остаётся занятым на портале. Порядок восстановления по шагам — [Восстановление доступа к боту](/docs/bots/ownership-recovery).

---

## Где работает бот

Опрос событий — постоянно работающий процесс, поэтому боту нужна машина, которая остаётся в сети. Разместить бота можно на сервере Black Hole: создайте его через [`POST /v1/infra/servers`](/docs/infra/servers/create) и разверните на нём код бота через [Deploy API](/docs/infra/deploy).

**Перед запуском бота отключите авто-сон.** Новая виртуальная машина создаётся с таймаутом простоя 60 минут, и простой считается по входящим запросам **к** приложению — обращениям к его HTTPS-субдомену. Опрос событий бот отправляет сам, наружу, поэтому эти запросы таймер простоя не сбрасывают: через час машина останавливается вместе с процессом бота, и бот перестаёт получать сообщения. Авто-сон отключает вызов [`PATCH /v1/infra/servers/:id/sleep`](/docs/infra/lifecycle/sleep) со значением `sleepAfterMinutes: null`. Текущий таймаут и статус машины приходят в [`GET /v1/infra/servers/:id`](/docs/infra/servers/get), у остановленной машины `status` равен `sleeping`.

Тот же таймер останавливает и сервер бота в режиме `webhook`: спящая машина событие не получит, а повторов доставки нет. Разбор обоих случаев — [Бот работал и замолчал](/docs/bots/troubleshooting#бот-работал-и-замолчал).

---

## Быстрый старт

### 1. Зарегистрируйте бота

```bash
curl -X POST https://vibecode.bitrix24.tech/v1/bots \
  -H "X-Api-Key: $VIBE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "my_helper_bot",
    "name": "Помощник",
    "type": "bot",
    "eventMode": "fetch"
  }'
```

Ответ:

```json
{
  "success": true,
  "data": {
    "botId": 42,
    "bot": {
      "id": 42,
      "code": "my_helper_bot",
      "type": "bot",
      "eventMode": "fetch"
    },
    "users": [
      { "id": 42, "name": "Помощник", "workPosition": "Чат-бот", "active": true, "bot": true }
    ]
  }
}
```

> ID бота берите из `data.botId` — `botToken` платформа хранит сама и в ответ не возвращает. Имя бота приходит в массиве `data.users`, а не в объекте `data.bot`.

### 2. Получайте события (длинный опрос)

```bash
curl -H "X-Api-Key: $VIBE_KEY" \
  "https://vibecode.bitrix24.tech/v1/bots/42/events"
```

Ответ содержит `nextOffset` — передайте его как `offset` в следующем запросе:

```json
{
  "success": true,
  "data": {
    "events": [
      {
        "eventId": 35,
        "type": "ONIMBOTV2MESSAGEADD",
        "date": "2026-04-13T10:05:00+03:00",
        "data": {
          "dialogId": "12",
          "bot": { "id": 42, "code": "my_helper_bot", "type": "bot" },
          "message": {
            "id": 1501,
            "chatId": 87,
            "authorId": 1,
            "date": "2026-04-13T10:05:00+03:00",
            "text": "Привет, бот!"
          },
          "chat": { "id": 87, "dialogId": "12", "type": "private" },
          "user": { "id": 1, "name": "Иван Петров", "firstName": "Иван", "lastName": "Петров" }
        }
      }
    ],
    "nextOffset": 36,
    "hasMore": false,
    "storedOffset": 35,
    "persisted": true
  }
}
```

Следующий запрос:

```bash
curl -H "X-Api-Key: $VIBE_KEY" \
  "https://vibecode.bitrix24.tech/v1/bots/42/events?offset=36"
```

### 3. Отправьте ответ

```bash
curl -X POST https://vibecode.bitrix24.tech/v1/bots/42/messages \
  -H "X-Api-Key: $VIBE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "dialogId": "12",
    "fields": { "message": "Привет! Чем могу помочь?" }
  }'
```

Ответ:

```json
{
  "success": true,
  "data": {
    "id": 1502,
    "uuidMap": []
  }
}
```

---

## Полный пример: Echo-бот

```javascript
const VIBE_KEY = process.env.VIBE_KEY
const BASE = 'https://vibecode.bitrix24.tech/v1'

// ── 1. Регистрация бота ─────────────────────────────────────────
const regRes = await fetch(`${BASE}/bots`, {
  method: 'POST',
  headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    code: 'echo_bot',
    name: 'Echo Bot',
    type: 'bot',
    color: 'AQUA',
    eventMode: 'fetch',
    workPosition: 'Повторяет ваши сообщения'
  })
})
const { data } = await regRes.json()
const BOT_ID = data.botId

console.log(`Bot registered with ID: ${BOT_ID}`)

// ── 2. Регистрация slash-команд ─────────────────────────────────
await fetch(`${BASE}/bots/${BOT_ID}/commands`, {
  method: 'POST',
  headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    command: 'ping',
    title: { ru: 'Проверить, жив ли бот', en: 'Check whether the bot is alive' }
  })
})

await fetch(`${BASE}/bots/${BOT_ID}/commands`, {
  method: 'POST',
  headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    command: 'help',
    title: { ru: 'Показать список команд', en: 'Show the command list' }
  })
})

// ── 3. Цикл опроса событий (polling) ───────────────────────────
let offset = undefined

async function poll() {
  while (true) {
    try {
      const url = new URL(`${BASE}/bots/${BOT_ID}/events`)
      if (offset !== undefined) url.searchParams.set('offset', String(offset))

      const res = await fetch(url, {
        headers: { 'X-Api-Key': VIBE_KEY }
      })
      const { data } = await res.json()

      for (const event of data.events || []) {
        await handleEvent(event)
      }

      if (data.nextOffset !== undefined) {
        offset = data.nextOffset
      }
    } catch (err) {
      console.error('Poll error:', err.message)
    }

    await new Promise(r => setTimeout(r, 3000))
  }
}

async function handleEvent(event) {
  const { data } = event

  // ── Обработка сообщений ────────────────────────────────────
  if (event.type === 'ONIMBOTV2MESSAGEADD') {
    const dialogId = data.chat.dialogId
    const text = data.message?.text || ''
    const userName = data.user?.firstName || 'друг'

    // Пропускаем системные сообщения и свои собственные
    if (data.message?.isSystem) return
    if (data.message?.authorId === BOT_ID) return

    // Показываем "думает..."
    await fetch(`${BASE}/bots/${BOT_ID}/typing`, {
      method: 'POST',
      headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
      body: JSON.stringify({
        dialogId,
        statusMessageCode: 'IMBOT_AGENT_ACTION_THINKING'
      })
    })

    // Ставим реакцию на сообщение
    await fetch(`${BASE}/bots/${BOT_ID}/messages/${data.message.id}/reactions`, {
      method: 'POST',
      headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
      body: JSON.stringify({ reaction: 'like' })
    })

    // Отправляем эхо-ответ с клавиатурой
    await fetch(`${BASE}/bots/${BOT_ID}/messages`, {
      method: 'POST',
      headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
      body: JSON.stringify({
        dialogId,
        fields: {
          message: `${userName}, вы написали: [I]${text}[/I]`,
          keyboard: [
            {
              TEXT: 'Повторить',
              BG_COLOR_TOKEN: 'primary',
              ACTION: 'SEND',
              ACTION_VALUE: text || 'ping',
              BLOCK: 'Y'
            },
            {
              TEXT: 'Помощь',
              BG_COLOR_TOKEN: 'secondary',
              ACTION: 'SEND',
              ACTION_VALUE: '/help',
              DISPLAY: 'LINE'
            }
          ]
        }
      })
    })
  }

  // ── Обработка команд ───────────────────────────────────────
  if (event.type === 'ONIMBOTV2COMMANDADD') {
    const dialogId = data.chat.dialogId
    const command = data.command

    if (command.command === 'ping') {
      await fetch(`${BASE}/bots/${BOT_ID}/commands/${command.id}/answer`, {
        method: 'POST',
        headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
        body: JSON.stringify({
          dialogId,
          messageId: data.message.id,
          fields: { message: '[B]Pong![/B] Бот работает нормально.' }
        })
      })
    }

    if (command.command === 'help') {
      await fetch(`${BASE}/bots/${BOT_ID}/commands/${command.id}/answer`, {
        method: 'POST',
        headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
        body: JSON.stringify({
          dialogId,
          messageId: data.message.id,
          fields: { message: '[B]Echo Bot — Команды[/B]\n\n/ping — проверить, жив ли бот\n/help — показать этот список\n\nПросто напишите мне — я повторю ваше сообщение.' }
        })
      })
    }
  }

  // ── Обработка реакций ──────────────────────────────────────
  if (event.type === 'ONIMBOTV2REACTIONCHANGE') {
    const dialogId = data.chat.dialogId
    const userName = data.user?.firstName || 'Кто-то'

    if (data.action === 'add') {
      await fetch(`${BASE}/bots/${BOT_ID}/messages`, {
        method: 'POST',
        headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
        body: JSON.stringify({
          dialogId,
          fields: {
            message: `${userName} поставил реакцию: ${data.reaction}`,
            system: true
          }
        })
      })
    }
  }

  // ── Вход в чат ─────────────────────────────────────────────
  if (event.type === 'ONIMBOTV2JOINCHAT') {
    await fetch(`${BASE}/bots/${BOT_ID}/messages`, {
      method: 'POST',
      headers: { 'X-Api-Key': VIBE_KEY, 'Content-Type': 'application/json' },
      body: JSON.stringify({
        dialogId: data.chat.dialogId,
        fields: {
          message: 'Привет! Я Echo Bot. Напишите мне что-нибудь, и я повторю.\n\nКоманды:\n[SEND=/ping]Ping[/SEND] | [SEND=/help]Помощь[/SEND]'
        }
      })
    })
  }
}

poll()
```

---

## Полный пример: Standup-бот (личный опрос → отчёт в группу)

Сценарий: утром бот пишет каждому сотруднику **в личные сообщения**, собирает ответы и публикует сводку в **групповой чат**. Здесь важны два разных `dialogId` (см. [Отправить сообщение](/docs/bots/messages/send)):

- **личное сообщение** — `dialogId` равен числовому ID пользователя (`"42"`)
- **групповой чат** — `dialogId` имеет вид `chatXXX`.

### Где взять `dialogId` группового чата

- Создать чат: `POST /v1/bots/:botId/chats` (`Chat.add`) — в ответе `data.chat.dialogId` = `chatXXX`. См. [Создать чат](/docs/bots/chats/create).
- Или взять из входящего события: каждое сообщение-событие из `GET /v1/bots/:botId/events` несёт `dialogId` (для группового чата это `chatXXX`). См. [События](/docs/bots/events).

### Где взять ID участников

`GET /v1/bots/:botId/chats/:dialogId/users` возвращает список участников чата, либо берите сотрудников из `GET /v1/users` (скоуп `user`). Числовой ID каждого пользователя и есть его личный `dialogId`.

### Шаги

```javascript
const BASE = 'https://vibecode.bitrix24.tech/v1'
const headers = { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' }

// 1. Утром: личный вопрос каждому участнику (dialogId = числовой userId)
async function askTeam(botId, userIds) {
  for (const userId of userIds) {
    await fetch(`${BASE}/bots/${botId}/messages`, {
      method: 'POST',
      headers,
      body: JSON.stringify({
        dialogId: String(userId),
        fields: { message: 'Доброе утро! Что сделал вчера, что планируешь сегодня, что мешает в работе?' },
      }),
    })
  }
}

// 2. В течение дня: собираем ответы через polling.
//    Поля события вложены в ev.data (см. «События»): chat.dialogId, message.text, user.id.
//    В личном диалоге ev.data.chat.dialogId равен числовому ID отправителя — тот же
//    путь, что использует echo-бот выше.
const answers = {}
async function collect(botId, expectedUserIds) {
  const res = await fetch(`${BASE}/bots/${botId}/events`, { headers })
  const { data } = await res.json()
  for (const ev of data.events ?? []) {
    if (ev.type !== 'ONIMBOTV2MESSAGEADD') continue
    const fromUser = String(ev.data.user.id)
    // Личный диалог: dialogId берём из ev.data.chat.dialogId
    if (ev.data.chat.dialogId === fromUser && expectedUserIds.includes(fromUser)) {
      answers[fromUser] = ev.data.message.text
    }
  }
}

// 3. Публикуем сводку в групповой чат (dialogId = chatXXX)
async function publishReport(botId, groupDialogId, userIds) {
  const lines = userIds.map(id => `[b]${id}[/b]: ${answers[String(id)] ?? '— нет ответа'}`)
  await fetch(`${BASE}/bots/${botId}/messages`, {
    method: 'POST',
    headers,
    body: JSON.stringify({
      dialogId: groupDialogId, // 'chat123'
      fields: { message: `[b]Standup за сегодня[/b]\n${lines.join('\n')}` },
    }),
  })
}
```

**Расписание — на стороне вашего сервера.** Платформа не планирует запуски за вас: бот живёт на вашем Black Hole-сервере, поэтому утренний опрос и публикацию отчёта вызывайте по собственному расписанию (`crontab`, `node-cron` и т. п.). Опрос событий держите запущенным постоянно — см. [Echo-бот](#полный-пример-echo-бот) выше. Сам по себе опрос машину в сети не удерживает, поэтому на ней должен быть отключён авто-сон — [Где работает бот](#где-работает-бот).

---

## Windows / PowerShell и UTF-8

При отправке запросов к API ботов из Windows PowerShell кириллица в `name` бота или в теле сообщения может превратиться в знаки вопроса (`?`). Это не проблема отображения на стороне сервера — кириллические байты теряются ещё до отправки HTTP-запроса, на стороне клиента.

**Причина:** по умолчанию PowerShell перекодирует строку из параметра `-Body` у `Invoke-WebRequest` / `Invoke-RestMethod` в системную кодировку `windows-1251`, и кириллица теряется ещё до того, как HTTP-клиент соберёт запрос. Заголовок `Content-Type: charset=utf-8` здесь не помогает — к моменту его применения исходные байты уже потеряны при перекодировании на стороне клиента.

**Решение:** передавайте тело запроса массивом байтов UTF-8.

```powershell
# 1. Кодировка вывода консоли — на кодирование тела запроса не влияет
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 2. Собрать JSON и преобразовать его в массив UTF-8 байтов
$body = @{
  code = 'my_bot'
  name = 'Мой бот'
  color = 'AZURE'
} | ConvertTo-Json -Compress

$bytes = [System.Text.Encoding]::UTF8.GetBytes($body)

# 3. Передать в -Body массив байтов (не строку!) и явно указать кодировку в Content-Type
Invoke-WebRequest `
  -Uri 'https://vibecode.bitrix24.tech/v1/bots' `
  -Method POST `
  -Headers @{
    'X-Api-Key'    = $env:VIBE_KEY
    'Content-Type' = 'application/json; charset=utf-8'
  } `
  -Body $bytes
```

**Распространённые ошибки:**

- Сохранять `.ps1` файл **с UTF-8 BOM** — старые версии PowerShell могут не разобрать сам скрипт.
- Передавать **строку** в `-Body` (`-Body $body`) вместо массива байтов (`-Body $bytes`) — строка повторно перекодируется через системную кодировку.
- Полагаться только на `Content-Type: application/json; charset=utf-8` без `UTF8.GetBytes` — этот заголовок не восстанавливает байты, потерянные при перекодировании на стороне клиента, а лишь объявляет серверу заявленную кодировку тела.

**Node.js и Python работают по умолчанию** — `fetch` с JSON в теле запроса и библиотека `requests` сами кодируют тело в UTF-8, дополнительных шагов не требуется. Проблема специфична для PowerShell.

---

## Коды ошибок

### Ошибки бот-платформы

| Код | HTTP | Описание |
|-----|------|---------|
| `SCOPE_DENIED` | 403 | API-ключ не имеет скоупа `imbot` |
| `TOKEN_MISSING` | 401 | API-ключ не имеет настроенных токенов |
| `CODE_REQUIRED` | 400 | Не передан параметр `code` при регистрации |
| `NAME_REQUIRED` | 400 | Не передан параметр `name` при регистрации |
| `INVALID_BOT_ID` | 400 | `botId` должен быть числом |
| `BOT_NOT_FOUND` | 404 | Бот с таким ID не найден — зарегистрируйте через `POST /v1/bots` |
| `BOT_ACCESS_DENIED` | 403 | Бот принадлежит другому API-ключу. Вернуть управление — [Восстановление доступа к боту](/docs/bots/ownership-recovery) |
| `BOT_ALREADY_EXISTS` | 409 | Бот с таким `code` уже зарегистрирован. Ответ содержит `data.botId` существующего бота — тот же путь к полю, что в успешном 201. Если этого бота нет в `GET /v1/bots` — [Восстановление доступа к боту](/docs/bots/ownership-recovery) |
| `REGISTRATION_FAILED` | 502 | Битрикс24 не вернул ID бота при регистрации |

### Системные ошибки

| Код | HTTP | Описание |
|-----|------|---------|
| `MISSING_API_KEY` | 401 | Отсутствует заголовок `X-Api-Key` |
| `INVALID_API_KEY` | 401 | Неверный API-ключ |
| `KEY_REVOKED` | 403 | API-ключ отозван |
| `RATE_LIMITED` | 429 | Превышен лимит запросов |
| `BITRIX_ERROR` | 422 | Ошибка в ответе Битрикс24 API |
| `BITRIX_UNAVAILABLE` | 502 | Портал Битрикс24 недоступен |
| `INTERNAL_ERROR` | 500 | Внутренняя ошибка сервера |

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

---

## Справочник эндпоинтов

Эта таблица — перечень возможностей бота на Вайбкод. Общий список REST-методов портала Битрикс24 для такой проверки не подходит: он неполон относительно Bot API v2, и проверка по нему сообщает об отсутствии возможности, которая работает. Разбор ситуации — [Методы Bot API v2 не видны в списке REST-методов портала](/docs/bots/troubleshooting#методы-bot-api-v2-не-видны-в-списке-rest-методов-портала).

Все 37 эндпоинтов бот-платформы:

| Метод | Путь | Битрикс24 метод | Описание |
|-------|------|---------------|---------|
| POST | [/v1/bots](/docs/bots/management/create) | imbot.v2.Bot.register | Регистрация бота |
| GET | [/v1/bots](/docs/bots/management/list) | — | Список ботов |
| GET | [/v1/bots/:botId](/docs/bots/management/get) | imbot.v2.Bot.get | Данные бота |
| PATCH | [/v1/bots/:botId](/docs/bots/management/update) | imbot.v2.Bot.update | Обновление бота |
| DELETE | [/v1/bots/:botId](/docs/bots/management/delete) | imbot.v2.Bot.unregister | Удаление бота |
| POST | [/v1/bots/:botId/reauth](/docs/bots/management/reauth) | — | Повторная авторизация бота |
| POST | [/v1/bots/:botId/resubscribe](/docs/bots/management/resubscribe) | imbot.v2.Bot.update | Перепривязка подписки на события |
| POST | [/v1/bots/:botId/transfer](/docs/bots/management/transfer) | — | Перенос владения ботом на другой ключ |
| GET | [/v1/bots/revision](/docs/bots/management/revision) | imbot.v2.Revision.get | Ревизия бот-платформы |
| GET | [/v1/bots/:botId/events](/docs/bots/events/polling) | imbot.v2.Event.get | Получение событий |
| POST | [/v1/bots/:botId/messages](/docs/bots/messages/send) | imbot.v2.Chat.Message.send | Отправка сообщения |
| PATCH | [/v1/bots/:botId/messages/:messageId](/docs/bots/messages/update) | imbot.v2.Chat.Message.update | Обновление сообщения |
| DELETE | [/v1/bots/:botId/messages/:messageId](/docs/bots/messages/delete) | imbot.v2.Chat.Message.delete | Удаление сообщения |
| POST | [/v1/bots/:botId/chats/:dialogId/read](/docs/bots/messages/read) | imbot.v2.Chat.Message.read | Прочитать сообщения |
| GET | [/v1/bots/:botId/messages/:messageId](/docs/bots/messages/get) | imbot.v2.Chat.Message.get | Получить сообщение |
| GET | [/v1/bots/:botId/messages/:messageId/context](/docs/bots/messages/context) | imbot.v2.Chat.Message.getContext | Контекст сообщения |
| POST | [/v1/bots/:botId/messages/:messageId/reactions](/docs/bots/ui/reaction-add) | imbot.v2.Chat.Message.Reaction.add | Добавить реакцию |
| DELETE | [/v1/bots/:botId/messages/:messageId/reactions](/docs/bots/ui/reaction-delete) | imbot.v2.Chat.Message.Reaction.delete | Удалить реакцию |
| POST | [/v1/bots/:botId/typing](/docs/bots/ui/typing) | imbot.v2.Chat.InputAction.notify | Индикатор набора |
| POST | [/v1/bots/:botId/text-field](/docs/bots/ui/text-field) | imbot.v2.Chat.TextField.enabled | Управление полем ввода |
| POST | [/v1/bots/:botId/chats](/docs/bots/chats/create) | imbot.v2.Chat.add | Создание чата |
| GET | [/v1/bots/:botId/chats/:dialogId](/docs/bots/chats/get) | imbot.v2.Chat.get | Информация о чате |
| PATCH | [/v1/bots/:botId/chats/:dialogId](/docs/bots/chats/update) | imbot.v2.Chat.update | Обновление чата |
| POST | [/v1/bots/:botId/chats/:dialogId/leave](/docs/bots/chats/leave) | imbot.v2.Chat.leave | Покинуть чат |
| POST | [/v1/bots/:botId/chats/:dialogId/owner](/docs/bots/chats/set-owner) | imbot.v2.Chat.setOwner | Назначить владельца |
| POST | [/v1/bots/:botId/chats/:dialogId/users](/docs/bots/chats/user-add) | imbot.v2.Chat.User.add | Добавить участников |
| DELETE | [/v1/bots/:botId/chats/:dialogId/users](/docs/bots/chats/user-delete) | imbot.v2.Chat.User.delete | Удалить участника |
| GET | [/v1/bots/:botId/chats/:dialogId/users](/docs/bots/chats/user-list) | imbot.v2.Chat.User.list | Список участников |
| POST | [/v1/bots/:botId/chats/:dialogId/managers](/docs/bots/chats/manager-add) | imbot.v2.Chat.Manager.add | Добавить менеджеров |
| DELETE | [/v1/bots/:botId/chats/:dialogId/managers](/docs/bots/chats/manager-delete) | imbot.v2.Chat.Manager.delete | Удалить менеджеров |
| POST | [/v1/bots/:botId/commands](/docs/bots/commands/register) | imbot.v2.Command.register | Регистрация команды |
| GET | [/v1/bots/:botId/commands](/docs/bots/commands/list) | imbot.v2.Command.list | Список команд |
| PATCH | [/v1/bots/:botId/commands/:commandId](/docs/bots/commands/update) | imbot.v2.Command.update | Обновление команды |
| DELETE | [/v1/bots/:botId/commands/:commandId](/docs/bots/commands/delete) | imbot.v2.Command.unregister | Удаление команды |
| POST | [/v1/bots/:botId/commands/:commandId/answer](/docs/bots/commands/answer) | imbot.v2.Command.answer | Ответ на команду |
| POST | [/v1/bots/:botId/files](/docs/bots/files/upload) | imbot.v2.File.upload | Загрузка файла |
| GET | [/v1/bots/:botId/files/:fileId](/docs/bots/files/download) | imbot.v2.File.download | Скачивание файла |
