Номер выгрузки в ответе, аватар бота и 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Информация о токене.
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 AtFile: операция Create передаёт в форме загрузки acl и bucket, только если они пришли: в части пространств метод Получение подписи, ключа и других параметров отдаёт bucket вместо aclpachca 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-atpachca upload передаёт в форме загрузки acl и bucket, только если они пришли, а у pachca files direct-url флаг --acl необязателен и есть флаг --bucket: в части пространств метод Получение подписи, ключа и других параметров отдаёт bucket вместо aclЭкспорт сообщений (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.ApiError — для ответа с массивом errors, OAuthError — для ответа с кодом в поле error, в том числе 403 с insufficient_scope или role_forbiddenvalue 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, а метод Загрузка файла передаёт в форме только заданные поля401, тело которого не разбирается, приходит обычной ошибкой HTTP 401: …, как ответы с другими кодамиОбмен кода на токен (POST /oauth/token) и Отзыв токена (POST /oauth/revoke) в сервисе oauth — для бота, который получает токен сотрудника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_deniedCreateChatResponse и 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_atsize у файла в MessageCreateRequest необязательно, как при правке сообщения и в черновике: черновик отправляют, передав key, name и file_type его файловstarted_at и duration в VideoCallWebhookPayload и duration в AuditDetailsVideoCallFinished бывают null — у звонка, который завершился, так и не начавшись. В Go StartedAt — *string, как остальные даты, которые бывают null.members в VideoCallWebhookPayload — список WebhookVideoCallMemberExportWebhookPayload — тело вебхука о готовой выгрузкеAuthorization. В C# такой запрос через переданный HttpClient с токеном в DefaultRequestHeaders уходит через отдельный клиент.Prefer: return=representation, сгенерированный метод передаёт сам, а ответ 202 с телом становится его результатомapplication/octet-stream) становится результатом метода: сгенерированный метод возвращает содержимое файла в типе своего языка{ data: T, meta } с одним объектом в data сгенерированный метод возвращает целиком, как ответ списка: в типе ответа, например CreateChatResponse, есть data и meta. Описанный прямо в ответе meta становится отдельной моделью, например CreateChatResponseMeta.application/x-www-form-urlencoded: сгенерированный метод передаёт поля запроса формойx-oauth-authorize-url у операции: SDK получает функции, которые собирают ссылку авторизации и пару PKCEApiError для массива errors, OAuthError для кода в поле errorerror в OAuthError ссылается на перечисление, поле получает тип этого перечисления во всех языках, кроме TypeScript401, тело которого не разбирается, приходит ошибкой HTTP 401: … с причиной через %w, как ответы с другими кодамиlist[X] | None) в ответе разбирается по типу своих элементовname[]=value по расширению x-query-array: brackets у параметра. Без расширения значение повторяется под тем же именем: name=a&name=b.anyOf из строк, чисел, логических значений, массивов и объектов без $ref — становится открытым JSON-значением: unknown в TypeScript, Any в Python, any без указателя в Go, JsonElement в Kotlin, AnyCodable в Swift и object в C#200, 201, 202 или 204x-requirements: { auth: false }) уходит без заголовка Authorization, даже если токен задан в заголовках клиента по умолчаниюmeta в типе ответа разбирается из тела, когда ответ его содержитrequest:, как в сигнатуре метода