Telegram Gateway
Коды подтверждения на номер телефона через сам Telegram — без бота, без chat id, без «Start» от человека. У контакта должен быть только телефон; сообщение с кодом собирает Telegram и показывает его как системное уведомление. Стоимость — $0,01 за доставленный код (недоставленный возвращается, когда истечёт срок), и код приходит туда, где SMS фильтруется или стоит в несколько раз дороже.
Канал — для одноразовых кодов: вход, подтверждение покупки, проверка телефона. Это не мессенджер: маркетинговый текст через него не отправить, шлюз принимает только код. Для сообщений людям есть Telegram (бот), MAX и VK.
Шаг 1 — Токен шлюза
- Откройте gateway.telegram.org, войдите через свой Telegram и пополните баланс
- Settings → API token — скопируйте токен
- Необязательно: верифицируйте там свой канал, чтобы код приходил «от него» (
sender_username)
Шаг 2 — Добавьте канал
Каналы → Новый канал → Telegram Gateway, вставьте токен и сохраните. Проверить связь спрашивает номер телефона и вызывает checkSendAbility: подтверждает, что номер может получить код, ничего не отправляя (для номера самого аккаунта — бесплатно). Три настройки:
| Поле | По умолчанию | Описание |
|---|---|---|
| Срок кода | 300 с | 30–3600. Недоставленный код истекает через этот срок, и деньги возвращаются |
| Длина кода | 6 | 4–8 цифр, если код генерирует шлюз |
| Канал-отправитель | — | Username верифицированного канала аккаунта, от чьего имени показывается код |
Шаг 3 — Отправьте код
Отправка — обычное уведомление с типом канала telegram_gateway одному контакту с телефоном. Два способа получить код:
Код знаете вы — передайте его в data.code (4–8 цифр). Сверяйте введённое человеком у себя:
curl -X POST https://api.pushdata.ru/api/v1/notifications \
-H "Authorization: Bearer pd_live_…" -H "Content-Type: application/json" \
-d '{ "channel_type": "telegram_gateway", "target": { "user_ids": ["user-42"] },
"title": "Код входа", "data": { "code": "482913" }, "transactional": true }'Код придумывает шлюз — отправьте без data.code (применится длина кода канала) и проверьте введённое через verify:
curl -X POST https://api.pushdata.ru/api/v1/notifications/<id>/verify \
-H "Authorization: Bearer pd_live_…" -H "Content-Type: application/json" \
-d '{ "code": "482913" }'
# → { "status": "code_valid" } или code_invalid · code_max_attempts_exceeded · expiredЗаголовок и текст уведомления не доставляются — сообщение собирает Telegram. transactional: true подразумевается: отправка не смотрит на отписки и реестр согласий (код, который человек запросил, — не реклама). Контакт без телефона пропускается с has no phone; несколько контактов в цели получают каждый свой запрос.
Отчёты о доставке
Шлюз присылает PushData отчёты (URL колбэка передаётся с каждым запросом): delivered и read помечают доставку доставленной (read — ещё и открытой), expired и revoked переводят её в ошибку с причиной. В журнале доставок request_id шлюза показан как id сообщения провайдера, а вебхуки срабатывают как для любого канала.
Соответствие закону
Канал — это Telegram: приложение с профилем 41-ФЗ (Настройки → Соответствие закону) отклоняет его с 400 channel_restricted, как и отправку через бота. Код через шлюз — не реклама, но закон называет мессенджер, а не сообщение.
Ошибки
| Текст в журнале | Значение |
|---|---|
recipient must be a phone number / has no phone | у контакта нет телефона в формате E.164 |
Telegram Gateway error: ACCESS_TOKEN_INVALID | токен отозван — пересохраните канал |
Telegram Gateway error: PHONE_NUMBER_INVALID | номер не известен Telegram как телефон |
Telegram Gateway error: BALANCE_NOT_ENOUGH | пополните баланс на gateway.telegram.org |
Telegram Gateway HTTP 429 / 5xx | шлюз занят — доставка будет повторена |
the code was expired before delivery | человек не получил код за его срок; деньги возвращены |