Для разработчиков
🍁 Осень 2026
20 октября 2026

Номер выгрузки в ответе, аватар бота и OAuth в SDK

Метод POSTЭкспорт сообщений может сразу вернуть номер выгрузки: с заголовком Prefer: return=representation он отвечает статусом 202 и номером в теле. По этому номеру архив забирают методом GETСкачать архив экспорта, когда сборка закончится, и вебхук для этого не нужен. SDK, CLI и нода n8n передают заголовок сами. Подробнее — в разделе Экспорт сообщений.

Аватар бота теперь можно поставить и убрать через API. Это доступно тем, кто может редактировать настройки бота.

Были добавлены новые методы:

Обмен кода на токен и отзыв токена описаны в справочнике методов, рядом с остальными методами API. В SDK у них появились свои методы, а ссылку для кнопки авторизации и пару PKCE SDK собирает сам. Как пройти авторизацию от имени сотрудника целиком — в разделе Получение токена.

Ещё изменения:

  • Ответ 429 методов API при превышении лимитов приходит в JSON, как остальные ошибки. Подробнее — на странице Лимиты.
  • При блокировке отправки сообщений за перегрузку ответ сообщает, сколько осталось до снятия блокировки. Подробнее — на странице Лимиты.
  • В части пространств метод POSTПолучение подписи, ключа и других параметров отдаёт другой набор полей формы. Передавайте в форме загрузки все поля из ответа, кроме адреса: SDK, CLI и нода n8n так и делают. Подробнее — на странице Загрузка файлов.
  • Списки и поиск отвечают ошибкой на нецелое число записей на странице. Подробнее — на странице Пагинация.
  • Метод POSTНовый чат возвращает идентификаторы сотрудников, которых не удалось добавить в чат.
  • Поиск в методе GETСписок сотрудников сообщает, что страницы закончились. Подробнее — на странице Пагинация.
  • Метод GETИнформация о боте отдаёт адрес входящего вебхука, секрет подписи исходящего и тело последнего запроса на входящий вебхук. Они приходят токену со скоупом bots:write, если вы можете управлять токенами бота.
  • Метод GETИнформация о токене отдаёт дату входа из CLI или выдачи доступа внешнему приложению.
  • Бесплатное пространство отправляет ограниченное число писем-приглашений за сутки. Подробнее — на странице Лимиты.
  • Редактирование сотрудника применяется целиком: если новая почта занята, остальные поля тоже не меняются.
  • В тег можно добавить только бота, которого может добавить в чат любой сотрудник. Подробнее — в разделе Бот в тегах.

Были обновлены следующие методы: POSTЭкспорт сообщений, GETСкачать архив экспорта, GETИнформация о боте, PUTРедактирование бота, POSTНовый сотрудник, PUTРедактирование сотрудника, POSTДобавление тегов, POSTНовый чат, GETСписок сотрудников, POSTПолучение подписи, ключа и других параметров, POSTЗагрузка файла, GETИнформация о токене.

n8nv2.2.0
~
Chat: операция Request Export сразу возвращает номер выгрузки в id — с ним Download Export забирает архив, когда тот соберётся
+
Chat: операция Create отдаёт в not_found_member_ids идентификаторы из Member IDs, которых не удалось добавить в чат
+
Bot: операции Update Avatar и Delete Avatar — аватар бота
+
Bot: операция Get отдаёт в Webhook адрес входящего вебхука, секрет подписи и тело последнего запроса, если у токена есть скоуп bots:write и вы можете управлять токенами бота
~
Form: в операции Create поля Close Text и Submit Text по умолчанию пустые — тогда кнопки подписывает Пачка: «Отменить» и «Отправить»
~
Message: в операции Create поле Content необязательно — сообщение можно отправить из одних файлов
~
Profile и User: в операции Update Status поля Emoji и Title нужны, только когда статуса ещё нет — продлить статус можно одним Expires At
~
File: операция Create передаёт в форме загрузки acl и bucket, только если они пришли: в части пространств метод Получение подписи, ключа и других параметров отдаёт bucket вместо acl
CLIv2026.10.1
~
pachca chats request-export выводит номер выгрузки id: с ним pachca chats download-export забирает архив, когда тот соберётся
+
pachca chats create предупреждает в stderr об идентификаторах из --member-ids, которых не удалось добавить в чат
+
pachca bots update-avatar и bots remove-avatar — аватар бота
+
pachca bots get: в webhook приходят адрес входящего вебхука url, секрет подписи secret_token и тело последнего запроса last_request_body, если у токена есть скоуп bots:write и вы можете управлять токенами бота
~
pachca messages create отправляет сообщение без --content, если к нему приложены файлы
~
pachca profile update-status и pachca users update-status: --emoji и --title нужны, только когда статуса ещё нет — продлить статус можно одним --expires-at
~
pachca upload передаёт в форме загрузки acl и bucket, только если они пришли, а у pachca files direct-url флаг --acl необязателен и есть флаг --bucket: в части пространств метод Получение подписи, ключа и других параметров отдаёт bucket вместо acl
SDKv1.6.0
~
Метод Экспорт сообщений (POST /chats/exports) возвращает модель ChatExport с идентификатором выгрузки: SDK передаёт заголовок Prefer: return=representation
~
Метод Скачивание файла (GET /files/{id}) возвращает содержимое файла: Blob в TypeScript, bytes в Python, []byte в Go, ByteArray в Kotlin, Data в Swift и byte[] в C#
~
Метод Новый чат (POST /chats) возвращает ответ целиком в модели CreateChatResponse: чат в data, а в meta.not_found_member_ids — идентификаторы из member_ids, которых не удалось добавить. Код, который брал поля чата из результата, берёт их из data.
~
Класс ошибки SDK выбирает по телу ответа: ApiError — для ответа с массивом errors, OAuthError — для ответа с кодом в поле error, в том числе 403 с insufficient_scope или role_forbidden
~
Перечисления в ответах принимают и значения, которых SDK ещё не знает: такое значение приходит как есть. В Kotlin такое перечисление — value class со строкой value, в Swift — enum со случаем unknown(String), в C# — структура со строкой Value. В Python такое значение — элемент перечисления с исходной строкой в value и is_known, равным False. Код, который перебирает значения такого перечисления, дописывает ветку для незнакомого: else в when в Kotlin, default или case .unknown в switch в Swift, а в C# сравнивает через == или switch по Value вместо case. Перечисления, которые встречаются только в запросах, прежние.
~
Поле error в OAuthError — перечисление OAuthErrorCode. В TypeScript поле — строка, а OAuthErrorCode перечисляет её значения.
~
Поле acl в UploadParams и FileUploadRequest необязательно, и добавлено поле bucket: в части пространств метод Получение подписи, ключа и других параметров отдаёт bucket вместо acl, а метод Загрузка файла передаёт в форме только заданные поля
~
Go: ответ 401, тело которого не разбирается, приходит обычной ошибкой HTTP 401: …, как ответы с другими кодами
+
Методы Обмен кода на токен (POST /oauth/token) и Отзыв токена (POST /oauth/revoke) в сервисе oauth — для бота, который получает токен сотрудника
+
Функции для кнопки авторизации: ссылка на экран согласия и пара PKCE — buildAuthorizeUrl и createPkce в TypeScript, в остальных языках по их правилам
+
Методы Загрузка аватара бота (PUT /bots/{id}/avatar) и Удаление аватара бота (DELETE /bots/{id}/avatar)
+
Поля url, secret_token и last_request_body в объекте webhook бота — приходят в методе Информация о боте (GET /bots/{id})
+
Поле authorized_at в AccessTokenInfo — дата входа из CLI или выдачи доступа внешнему приложению, приходит в методе Информация о токене (GET /oauth/token/info)
+
Коды ошибок daily_invites_limit и restricted_bot_tag_denied
+
Swift: типы ответов, например CreateChatResponse и ListChatsResponse, создаются в коде публичным инициализатором — так заглушка сервиса в тесте возвращает ответ
~
Поле value в ApiErrorItem принимает любое JSON-значение, как его отдаёт API: строку, число, массив, а иногда логическое значение или объект, например список id ботов у кода bot_add_denied. Тип поля — unknown в TypeScript, Any в Python, any в Go, JsonElement в Kotlin, AnyCodable в Swift и object в C#.
~
Необязательны content в MessageCreateRequest — для сообщения из одних файлов — и emoji с title в StatusUpdateRequest — для продления статуса одним expires_at
~
Поле size у файла в MessageCreateRequest необязательно, как при правке сообщения и в черновике: черновик отправляют, передав key, name и file_type его файлов
~
Поля started_at и duration в VideoCallWebhookPayload и duration в AuditDetailsVideoCallFinished бывают null — у звонка, который завершился, так и не начавшись. В Go StartedAt — *string, как остальные даты, которые бывают null.
~
Python: запросы правки сотрудника, задачи, бота и сообщения, а также создания бота передают только те поля, которые вы задали
−
Python: поле-перечисление в ответе приходит элементом своего перечисления, как в аннотации типа
−
Python: необязательный список в ответе разбирается по типу своих элементов, например members в VideoCallWebhookPayload — список WebhookVideoCallMember
+
Модель ExportWebhookPayload — тело вебхука о готовой выгрузке
−
C# и Kotlin: загрузка файла в хранилище и обмен кода на токен идут без заголовка Authorization. В C# такой запрос через переданный HttpClient с токеном в DefaultRequestHeaders уходит через отдельный клиент.
Generatorv1.3.0
+
Заголовок запроса с единственным допустимым значением, например Prefer: return=representation, сгенерированный метод передаёт сам, а ответ 202 с телом становится его результатом
+
Ответ с файлом (application/octet-stream) становится результатом метода: сгенерированный метод возвращает содержимое файла в типе своего языка
~
Ответ { data: T, meta } с одним объектом в data сгенерированный метод возвращает целиком, как ответ списка: в типе ответа, например CreateChatResponse, есть data и meta. Описанный прямо в ответе meta становится отдельной моделью, например CreateChatResponseMeta.
+
Swift: у типов ответов есть публичный инициализатор, как у моделей
+
Тело application/x-www-form-urlencoded: сгенерированный метод передаёт поля запроса формой
+
Расширение x-oauth-authorize-url у операции: SDK получает функции, которые собирают ссылку авторизации и пару PKCE
~
Класс ошибки выбирается по телу ответа, если в спеке есть обе модели ошибок: ApiError для массива errors, OAuthError для кода в поле error
+
Перечисление, которое встречается в ответе, генерируется открытым: значение не из спеки разбирается без ошибки и сохраняется. Закрытыми остаются перечисления, которые встречаются только в запросах.
~
Если поле error в OAuthError ссылается на перечисление, поле получает тип этого перечисления во всех языках, кроме TypeScript
~
Go: ответ 401, тело которого не разбирается, приходит ошибкой HTTP 401: … с причиной через %w, как ответы с другими кодами
−
Python: поле-перечисление в ответе разбирается в элемент своего перечисления
−
Python: необязательный список (list[X] | None) в ответе разбирается по типу своих элементов
~
Массив в query уходит парами name[]=value по расширению x-query-array: brackets у параметра. Без расширения значение повторяется под тем же именем: name=a&name=b.
+
Ссылка на схему-скаляр с ограничениями, например целое от 0 до 6, становится примитивом своего языка, а не моделью
~
Объединение простых значений — anyOf из строк, чисел, логических значений, массивов и объектов без $ref — становится открытым JSON-значением: unknown в TypeScript, Any в Python, any без указателя в Go, JsonElement в Kotlin, AnyCodable в Swift и object в C#
−
Go: код успешного ответа берётся из спеки — 200, 201, 202 или 204
−
C# и Kotlin: операция без авторизации (x-requirements: { auth: false }) уходит без заголовка Authorization, даже если токен задан в заголовках клиента по умолчанию
−
Swift: необязательный meta в типе ответа разбирается из тела, когда ответ его содержит
−
Swift: пример вызова передаёт тело запроса с меткой request:, как в сигнатуре метода