Text
Работаетmessage.type = text, message.text содержит текст сообщения. Это уже работает и для telegram_qr_bridge, и для telegram_bot.
telegram
Telegram в Bridge сейчас доступен в двух режимах: user session через QR (telegram_qr_bridge) и bot token через Bot API (telegram_bot). Для QR-подключения platform admin заранее заполняет runtime settings telegram_api_id и telegram_api_hash; для bot mode достаточно токена из BotFather.
Connect
Клиент подключает канал в кабинете. После статуса connected входящие события идут в webhook, а outbound API начинает принимать отправку в этот канал.
Шаг 1
Пользователь создает Telegram-канал в /my/channels.
Шаг 2
Для telegram_qr_bridge Bridge показывает QR-код; пользователь сканирует его в Telegram и при необходимости вводит 2FA password.
Шаг 3
Для telegram_bot пользователь вставляет bot token из BotFather, Bridge проверяет getMe, отключает внешний Telegram webhook и дальше сам забирает updates в polling-режиме.
Шаг 4
После успешного входа или подключения канал переходит в connected и начинает принимать inbound events.
Inbound
message.type = text, message.text содержит текст сообщения. Это уже работает и для telegram_qr_bridge, и для telegram_bot.
Для telegram_qr_bridge и telegram_bot Bridge сохраняет файл в storage и отдает его в attachments[] со signed URL. Для telegram_bot transport использует Bot API getFile, а полная live-smoke матрица по всем media типам остается отдельной задачей.
Bridge нормализует тип, длительность и is_voice для telegram_qr_bridge и telegram_bot, если Telegram отдал metadata. Для bot mode это уже идет в тот же attachments[] contract.
File-like сообщения уже проходят в общий attachments[] contract и для telegram_qr_bridge, и для telegram_bot. Animated/video sticker semantics пока считаются best-effort поверх Bot API metadata.
Для telegram_bot Bridge теперь best-effort отдает message.type = contact | share | location | poll | dice вместо unsupported. Это пока не file/media contract: attachments[] остается пустым, а часть данных может приходить best-effort в message.text.
username, first_name, last_name, display_name, avatar заполняются best-effort. phone обычно недоступен.
Outbound
Для outbound используйте POST /v1/messages, bearer API key со scope messages:send, channel_id подключенного канала и provider chat id из inbound webhook.
POST /v1/messages с content.type = text отправляет сообщение и в telegram_qr_bridge, и в telegram_bot.
Для telegram_qr_bridge и telegram_bot content.type = media уже работает для photo, video, audio, voice, animation, file. Bridge скачивает attachments[].url и отправляет файл через Telegram user session или Bot API. Для telegram_bot voice дополнительно зависит от ограничений самого Telegram Bot API и в отдельных чатах может вернуться VOICE_MESSAGES_FORBIDDEN. Sticker outbound для Telegram пока не включен, поэтому общий статус остается partial.
Проверка
getMe, перевод telegram_bot в polling transport и хранение подключенного канала.message.inbound для telegram_qr_bridge и telegram_bot./v1/attachments/:id URL для telegram_bot./v1/messages для telegram_bot: photo, video, audio, animation и file; voice в bot-mode зависит от ограничений Telegram Bot API и может быть отклонен.contact, share, location, poll, dice в webhook message.inbound для telegram_bot.telegram_bot через Bot API forward_origin./v1/attachments/:id URL для telegram_qr_bridge.telegram_qr_bridge, ни в telegram_bot.telegram_bot.unsupported; Bridge теперь логирует их отдельно для дожима.message.interaction для Telegram reactions пока не подключен.API notes
Пример recipient
227657777
Для ответа используйте data.chat.external_id из inbound webhook.
Для telegram_bot поле message.forwarded заполняется best-effort из Bot API forward_origin или legacy forward fields, если Telegram реально отдал origin metadata.
В колонке TG общей матрицы учтены оба режима: telegram_qr_bridge и telegram_bot.
В поле подключения можно вставлять plain token, bot<token> или полный Bot API URL; Bridge сам нормализует значение перед getMe.
В production Bridge может отправлять Bot API запросы через внутренний VPN proxy bridge_vpn_gateway; внешний API contract от этого не меняется.
Для telegram_bot Bridge не ждет входящий webhook от Telegram: в production bot updates забираются самим Bridge через polling transport.
Для telegram_bot outbound media идет через Bot API методы sendPhoto, sendVideo, sendDocument, sendAudio, sendVoice, sendAnimation; для sendVoice Telegram может вернуть VOICE_MESSAGES_FORBIDDEN в конкретном чате.
attachments[].url всегда является ссылкой Bridge, а не прямой ссылкой Telegram.
Channels