Для AI-агентов: markdown этой страницы — /docs-content/chats/discovery.md индекс документации — /llms.txt
Поиск чатов
Найдите нужный чат: последние диалоги, счётчики непрочитанного, папки и разделы списка, каналы, коллабы и внешние чаты, общие чаты, изменения с момента, чат CRM-сущности, поиск, сведения о диалоге, внешний ID диалога и проверка доступа.
Скоуп: im | Базовый URL: https://vibecode.bitrix24.tech/v1 | Авторизация: X-Api-Key
Последние диалоги
GET /v1/chats/recent
Возвращает список последних диалогов текущего пользователя: закреплённые диалоги первыми, далее по времени последнего сообщения.
Общий параметр filter этим эндпоинтом не применяется. По умолчанию API сохраняет прежний ответ HTTP 200 и прежние данные, добавляет заголовок Warning: 299 - "filter is not supported on this endpoint and was ignored", а сервер фиксирует использование неподдерживаемого фильтра в журнале.
Проверка параметров для format=v2 сохраняется без изменений.
Параметры
| Параметр | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
Параметрformat (query) |
Типstring | Обяз.нет | По умолч.— | Описаниеv2 включает режим v2 — см. «Режим v2» ниже. Любое другое значение игнорируется, ответ прежний. Повтор format не отклоняется: из format=v1&format=v2 берётся последнее значение, то есть режим v2, а format=v2&format=v1 даёт прежний ответ. Форма format[]=v2 включает режим v2, если все её значения — v2 |
ПараметрskipOpenLines (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеИсключить линии открытых каналов. Принимает true, Y или y |
ПараметрskipChat (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеИсключить групповые чаты. Принимает true, Y или y |
ПараметрskipDialog (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеИсключить личные диалоги. Принимает true, Y или y |
ПараметрunreadOnly (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеТолько диалоги с непрочитанными сообщениями. Принимает true, Y или y |
ПараметрonlyOpenLines (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеТолько линии открытых каналов. Принимает true, Y или y |
ПараметрonlyCopilot (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеТолько чаты с AI-ассистентом. Принимает true, Y или y |
ПараметрonlyChannel (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеТолько каналы. Принимает true, Y или y |
ПараметрlastMessageDate (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеДата последнего сообщения для постраничной навигации (ISO 8601). В режиме v2 — курсор по правилу ниже, формат YYYY-MM-DDTHH:MM:SS со смещением или Z, без долей секунды |
ПараметрupdatedAfter (query) |
Типstring | Обяз.нет | По умолч.— | ОписаниеРежим дельты: вернуть диалоги, изменённые начиная с указанного момента. Дата в ISO 8601 с явным смещением или Z. Несовместим с offset и lastMessageDate |
Параметрlimit (query) |
Типnumber | Обяз.нет | По умолч.50 | ОписаниеКоличество элементов в ответе. Максимум 200. В режиме v2 — от 50 до 200: меньшее значение поднимается до 50, большее срезается до 200, в обоих случаях переданное и применённое значения возвращаются в meta |
Параметрoffset (query) |
Типnumber | Обяз.нет | По умолч.0 |
ОписаниеСмещение для постраничной навигации |
Режим дельты. Параметр updatedAfter переключает эндпоинт в режим «что изменилось с указанного момента»: GET /v1/chats/recent?updatedAfter=2026-06-28T00:00:00Z. В ответ приходит массив диалогов, у которых dateUpdate не раньше переданного момента. Граница включительна — диалог с dateUpdate, равным переданному моменту, попадает в ответ, поэтому при сдвиге курсора на максимальное увиденное значение пограничная запись придёт повторно.
Размером выборки в этом режиме управляет сервер: читается одна страница до 200 диалогов. Переданный limit на неё не влияет и возвращается в meta.requestedLimit вместе с применённым meta.appliedLimit.
Если в meta пришло truncated со значением true, дельта может быть неполной: за отданной страницей есть ещё диалоги, либо форму ответа не удалось разобрать. В этом случае не сдвигайте updatedAfter, а получите полный список постраничным режимом с курсором lastMessageDate. Число возвращённых строк признаком полноты не является — короткий ответ приходит и тогда, когда за ним есть ещё данные.
Дата без явного смещения — например 2026-06-29 10:00:00 — отклоняется с 400 INVALID_PARAMS: такое значение читается по-разному в зависимости от часового пояса сервера, поэтому момент требуется указать однозначно.
Режим v2. format=v2 переключает эндпоинт в режим v2: первая страница запрашивается без lastMessageDate, следующие — с ним. В data приходит объект v2 — recentItems и коллекции chats, users, messages, files — с ключами в camelCase. Режим принимает только format, limit, lastMessageDate и unreadOnly (true или false). Любой другой параметр, в том числе параметры прежнего режима и их формы в верхнем регистре (OFFSET, LIMIT, LAST_UPDATE), отклоняется с 400 INVALID_PARAMS и именем параметра. Список всегда общий, без вложенных разделов. У режима своя корзина лимита запросов, отдельная от прежнего режима.
Курсор следующей страницы — наименьшая непустая dateLastActivity среди незакреплённых строк текущей страницы. Сравнивайте моменты времени, а не строки: смещение у дат бывает разным. Граница включительная, а закреплённые чаты с датой не новее курсора открывают каждую страницу — повторы снимайте по chatId. Конец списка — только hasNextPage: false. Если при hasNextPage: true курсора нет или он равен прежнему, повторите запрос с бо́льшим limit, вплоть до 200. true без продвижения и при 200 — отказ, а не конец списка. Строк ответа не отбрасывайте, даже когда показываете меньше: курсор считается по всему ответу, и отброшенные строки больше не придут. Обход — не снимок: чат, поднятый новой активностью из-под курсора во время обхода, в нём не появится, поэтому после обхода перечитайте первую страницу. Для полного обхода берите limit=200: закреплённые строки повторяются на каждой странице, и маленькая страница тратит запросы на повторы.
Примеры
curl — личный ключ
curl "https://vibecode.bitrix24.tech/v1/chats/recent?limit=20" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth-приложение
curl "https://vibecode.bitrix24.tech/v1/chats/recent?limit=20" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/chats/recent?limit=20', {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { data } = await res.json()
console.log('Последние диалоги:', data.items)
JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/chats/recent?limit=20', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { data } = await res.json()
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеsuccess |
Типboolean | ОписаниеВсегда true при успехе |
Полеdata |
Типobject|array | ОписаниеОбъект результата. В режиме дельты — массив диалогов, см. абзац под таблицей |
Полеdata.items |
Типarray | ОписаниеМассив последних диалогов |
Полеdata.items[].id |
Типstring | ОписаниеИдентификатор диалога (chatXXX для группового чата или числовой ID для личного диалога) |
Полеdata.items[].chatId |
Типnumber | ОписаниеЧисловой ID чата |
Полеdata.items[].type |
Типstring | ОписаниеТип диалога: chat, openlines, copilot, channel |
Полеdata.items[].title |
Типstring | ОписаниеНазвание диалога |
Полеdata.items[].avatar |
Типobject | ОписаниеАватар диалога |
Полеdata.items[].avatar.url |
Типstring | ОписаниеURL изображения аватара. Пустая строка, если аватар не задан |
Полеdata.items[].avatar.color |
Типstring | ОписаниеЦвет аватара в шестнадцатеричном формате, например #4ba984 |
Полеdata.items[].message |
Типobject | ОписаниеПоследнее сообщение в диалоге |
Полеdata.items[].message.id |
Типnumber | ОписаниеID сообщения |
Полеdata.items[].message.text |
Типstring | ОписаниеТекст сообщения |
Полеdata.items[].message.authorId |
Типnumber | ОписаниеID автора сообщения |
Полеdata.items[].message.date |
Типstring | ОписаниеДата сообщения (ISO 8601) |
Полеdata.items[].message.file |
Типboolean | ОписаниеСодержит ли сообщение файл |
Полеdata.items[].message.attach |
Типboolean | ОписаниеСодержит ли сообщение вложение |
Полеdata.items[].message.sticker |
Типstring | null | ОписаниеСтикер сообщения или null |
Полеdata.items[].message.status |
Типstring | ОписаниеСтатус сообщения (например, received) |
Полеdata.items[].lastId |
Типnumber | ОписаниеID последнего прочитанного сообщения |
Полеdata.items[].unread |
Типboolean | ОписаниеЕсть ли непрочитанные сообщения |
Полеdata.items[].counter |
Типnumber | ОписаниеКоличество непрочитанных сообщений |
Полеdata.items[].pinned |
Типboolean | ОписаниеДиалог закреплён |
Полеdata.items[].dateUpdate |
Типstring | ОписаниеДата последнего обновления диалога (ISO 8601) |
Полеdata.items[].dateLastActivity |
Типstring | ОписаниеДата последней активности (ISO 8601) |
Полеdata.items[].chat |
Типobject | ОписаниеРасширенная информация о чате |
Полеdata.items[].chat.id |
Типnumber | ОписаниеЧисловой ID чата |
Полеdata.items[].chat.name |
Типstring | ОписаниеСистемное название чата |
Полеdata.items[].chat.type |
Типstring | ОписаниеТип чата: chat, general, openlines, copilot, channel, mail, crm и другие |
Полеdata.items[].chat.owner |
Типnumber | ОписаниеID владельца чата |
Полеdata.items[].chat.userCounter |
Типnumber | ОписаниеКоличество участников |
Полеdata.items[].chat.role |
Типstring | ОписаниеРоль текущего пользователя: OWNER, MANAGER, MEMBER |
Полеdata.items[].chat.entityType |
Типstring | ОписаниеТип связанной сущности (CRM, TASKS, MAIL, GENERAL и другие) |
Полеdata.items[].chat.entityId |
Типstring | ОписаниеID связанной сущности |
Полеdata.hasMorePages |
Типboolean | Описаниеtrue, если есть следующая страница |
Полеdata.hasMore |
Типboolean | ОписаниеДублирует hasMorePages. Сохранён для обратной совместимости |
Полеmeta.requestedLimit |
Типnumber | ОписаниеПереданный limit до срезания. Присутствует вместе с appliedLimit, только когда переданное значение вышло за диапазон от 1 до 200, когда limit передан в режиме дельты или когда в режиме v2 он меньше 50 или больше 200 |
Полеmeta.appliedLimit |
Типnumber | ОписаниеПрименённое значение limit — только если он был приведён к границе. В режиме дельты приходит при любом переданном limit и равно размеру серверной страницы — 200 |
Полеmeta.mode |
Типstring | ОписаниеЗначение delta. Приходит только в режиме дельты |
Полеmeta.returned |
Типnumber | ОписаниеЧисло диалогов в ответе. Приходит только в режиме дельты |
Полеmeta.truncated |
Типboolean | ОписаниеПриходит со значением true, когда дельту не удалось подтвердить полной: за отданной страницей есть ещё диалоги либо форма ответа не разобрана |
Полеdata.recentItems |
Типarray | ОписаниеРежим v2: строки списка в порядке портала — закреплённые первыми, далее по активности |
Полеdata.recentItems[].dialogId |
Типstring | ОписаниеРежим v2: ID диалога (chatXXX или ID пользователя) — его принимают загрузка чата и лента сообщений |
Полеdata.recentItems[].chatId |
Типnumber | ОписаниеРежим v2: ID чата — ключ для снятия повторов. Совпадает с data.chat.id загрузки чата |
Полеdata.recentItems[].pinned |
Типboolean | ОписаниеРежим v2: чат закреплён |
Полеdata.recentItems[].dateLastActivity |
Типstring|null | ОписаниеРежим v2: момент последней активности. Наименьшее значение среди незакреплённых строк — курсор следующей страницы |
Полеdata.hasNextPage |
Типboolean | ОписаниеРежим v2: false — конец списка |
В режиме дельты data — массив диалогов с теми же полями элемента, что перечислены выше для data.items. Поля hasMorePages и hasMore в этом режиме не возвращаются, их роль выполняет meta.truncated.
Пример ответа
Постраничный режим:
{
"success": true,
"data": {
"items": [
{
"id": "chat456",
"chatId": 456,
"type": "chat",
"title": "Команда разработки",
"avatar": {
"url": "",
"color": "#4ba984"
},
"message": {
"id": 1201,
"text": "Обновление задачи готово",
"authorId": 1,
"date": "2026-06-03T16:51:12+03:00",
"file": false,
"attach": false,
"sticker": null,
"status": "received"
},
"lastId": 1195,
"pinned": false,
"unread": false,
"counter": 0,
"dateUpdate": "2026-06-03T16:51:12+03:00",
"dateLastActivity": "2026-06-03T16:51:12+03:00",
"chat": {
"id": 456,
"name": "Команда разработки",
"type": "chat",
"owner": 1,
"userCounter": 5,
"role": "OWNER",
"entityType": "",
"entityId": ""
}
},
{
"id": "chat123",
"chatId": 123,
"type": "crm",
"title": "Чат по сделке",
"avatar": {
"url": "",
"color": "#f76187"
},
"message": {
"id": 980,
"text": "Договор согласован",
"authorId": 7,
"date": "2026-06-02T14:08:10+03:00",
"file": false,
"attach": false,
"sticker": null,
"status": "received"
},
"lastId": 0,
"pinned": false,
"unread": false,
"counter": 0,
"dateUpdate": "2026-06-02T14:08:10+03:00",
"dateLastActivity": "2026-06-02T14:08:10+03:00",
"chat": {
"id": 123,
"name": "Чат по сделке",
"type": "crm",
"owner": 1,
"userCounter": 2,
"role": "MEMBER",
"entityType": "CRM",
"entityId": "DEAL|42"
}
}
],
"hasMorePages": true,
"hasMore": true
}
}
Режим дельты. Показаны основные поля элемента, полный набор — в таблице выше:
{
"success": true,
"data": [
{
"id": "chat456",
"chatId": 456,
"type": "chat",
"title": "Команда разработки",
"pinned": false,
"unread": false,
"counter": 0,
"dateUpdate": "2026-06-29T10:12:44+03:00",
"dateLastActivity": "2026-06-29T10:12:44+03:00"
}
],
"meta": {
"mode": "delta",
"returned": 1
}
}
Пример ответа при ошибке
403 — нет скоупа im:
{
"success": false,
"error": {
"code": "SCOPE_DENIED",
"message": "This endpoint requires 'im' scope"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP200 | КодWarning: 299 |
ОписаниеФильтр игнорируется по умолчанию; прежние данные сохраняются, предупреждение передаётся заголовком Warning. |
| HTTP400 только при включённом строгом режиме | КодUNSUPPORTED_FILTER |
ОписаниеСерверный режим выключен по умолчанию; до его включения эндпоинт сохраняет HTTP 200 и прежние данные. |
| HTTP400 | КодINVALID_PARAMS |
ОписаниеupdatedAfter передан без явного смещения или Z, либо не является датой |
| HTTP400 | КодINVALID_PARAMS |
ОписаниеupdatedAfter передан вместе с offset или lastMessageDate |
| HTTP400 | КодINVALID_PARAMS |
ОписаниеРежим v2: параметр вне format, limit, lastMessageDate, unreadOnly, повтор параметра, кроме format, нечисловой limit, unreadOnly не true и не false или lastMessageDate не в формате YYYY-MM-DDTHH:MM:SS со смещением или Z либо с несуществующей датой или временем (2026-02-30, 24:00) |
| HTTP403 | КодSCOPE_DENIED |
ОписаниеAPI-ключ не имеет скоупа im |
| HTTP401 | КодTOKEN_MISSING |
ОписаниеAPI-ключ не имеет настроенных токенов Битрикс24 |
| HTTP422 | КодBITRIX_ERROR |
ОписаниеБитрикс24 вернул ошибку (подробности в message) |
| HTTP502 | КодBITRIX_UNAVAILABLE |
ОписаниеБитрикс24 недоступен или вернул ошибку сервера |
Полный список общих ошибок API — Ошибки.
Известные особенности
- Флаги
skipOpenLinesиonlyOpenLinesвзаимоисключающие: включение обоих приводит к результату, при котором ни один из чатов открытых линий не попадёт в список. - В обычном режиме глубокий
offsetпередаётся в Битрикс24. Небольшое окно читается из одной буферной страницы, неполная граничная строка может потребовать один дозапрос. Новая активность между запросами может менять порядок списка. В обычном режиме граница даты включительная: передайтеdateLastActivityпоследнего незакреплённого элемента, не передавайтеoffsetи удаляйте повторы поchatId. Закреплённые строки и строки с той же датой могут повторяться. Если курсор не продвинулся, увеличьтеlimitдо 200. - Ответ содержит поле
data.copilotс конфигурацией AI-ассистента портала. К списку диалогов оно не относится. - В режиме дельты диалог с нечитаемым значением
dateUpdateостаётся в ответе: лишняя запись безопаснее потерянного изменения. - Фильтры семейств
skip*,only*иunreadOnlyдействуют и в режиме дельты, сужая просматриваемую страницу. - В режиме v2 ключи-имена полей приводятся к
camelCase, а ключи-данные остаются как есть: ключи словаряdata.copilot.roles— коды ролей, иcopilot_assistantприходит какcopilot_assistant— тем же значением, чтоroleу чата, поэтому роль находится прямым обращениемroles[role]. - На портале без методов v2 режим отвечает
422 BITRIX_ERRORс кодом портала вerror.b24Codeи не откатывается на прежний ответ молча: форма ответа другая.