Text
Работаетmessage.type = text, provider = max, data.chat.external_id используется для ответа.
max
Канал подключает пользовательскую MAX-сессию через номер телефона, SMS code и optional password_2fa. Adapter работает как отдельный transport listener.
Connect
Клиент подключает канал в кабинете. После статуса connected входящие события идут в webhook, а outbound API начинает принимать отправку в этот канал.
Шаг 1
Пользователь создает MAX-канал в /my/channels и вводит номер телефона.
Шаг 2
Bridge отправляет challenge в transport adapter MAX.
Шаг 3
Пользователь вводит SMS code, затем password_2fa, если MAX запросил пароль.
Шаг 4
После успешного входа channel session переходит в connected.
Inbound
message.type = text, provider = max, data.chat.external_id используется для ответа.
Скачиваются из MAX, сохраняются в Bridge storage и отдаются через signed URL.
Bridge сохраняет файл и добавляет duration/voice metadata, если MAX отдал поля.
Нормализуются в общий attachments[] контракт, когда MAX отдает download source.
Событие приходит с распознанным message.type, но file-like download есть только для вложений.
first_name, last_name, display_name, avatar подтягиваются best-effort из contact cache. phone обычно недоступен.
Bridge best-effort извлекает message.reply_to и message.forwarded из raw message.link. На prod подтверждено, что current MAX update stream часто отдает только linked text пересланного сообщения, а comment пользователя при forward может вообще не приходить.
Outbound
Для outbound используйте POST /v1/messages, bearer API key со scope messages:send, channel_id подключенного канала и provider chat id из inbound webhook.
POST /v1/messages с content.type = text отправляет текст в MAX chat id.
content.type = media, до 10 вложений, типы photo, video, file, optional caption в text.
Отправляйте как file, пока отдельные voice/audio semantics не выделены в публичном API.
Проверка
message.reply_to и message.forwarded на реальных reply/forward сообщениях.API notes
Пример recipient
31398414
Для private dialog отвечайте в data.chat.external_id, а не в data.from.external_id.
Если provider не отдал стабильный download source, вложение придет со status = failed и error_code = attachment_download_not_supported.
Для MAX Bridge теперь best-effort смотрит в raw message.link, чтобы заполнить message.reply_to и message.forwarded. До отдельного prod smoke это остается partial contract, а не гарантированный yes.
Для MAX Bridge сначала пытается взять text/comment из wrapper самого сообщения, и только потом падает в linked payload. На 29 апреля 2026 года prod probe показывает wrapper shape id,time,type,sender,cid,text,attaches,link: если text пустой, Bridge видит только linked text пересланного сообщения, а comment пользователя в этом surface может быть недоступен.
Channels