Telegram OTP присылает код подтверждения прямо в мессенджер через официальный Telegram Gateway — без SMS и без собственных ботов. Соберём рабочую верификацию номера на Next.js App Router: два серверных Route Handler и один клиентский компонент. Секрет при этом остаётся на бэкенде.
Telegram OTP — метод верификации, при котором одноразовый код приходит пользователю в Telegram. Verificahub отправляет его через официальный сервис Telegram Gateway («Verification Codes»), поэтому вам не нужны собственные боты, номера или отдельный договор с Telegram — достаточно одного вызова API.
В этом гайде соберём верификацию на Next.js (App Router). Логика делится на две части: серверные Route Handlers, которые ходят в api.verificahub.ru с секретом, и клиентский компонент с двумя шагами — ввод номера и ввод кода. Ключевое правило: api_secret никогда не покидает сервер.
В отличие от обратного flash-call, который подтверждается автоматически по звонку, Telegram OTP работает как классический одноразовый пароль: пользователь читает цифры в мессенджере и вводит их в форму. Поэтому весь поток — это два запроса к API.
POST /v1/verify с method: "telegram_otp" инициирует отправку. В ответ приходят request_id и code_length (сколько цифр в коде). Сам код API не возвращает — его видит только пользователь в Telegram.POST /v1/verify/check с request_id и введённым code сверяет код. При успехе возвращает status: "verified" и маскированный номер.api_secret — это пароль от вашего аккаунта. Внешний API строго server-to-server: держите ключи в переменных окружения и вызывайте Verificahub только из Route Handlers, никогда из клиентского кода или мобильного приложения.
app/).api_key / api_secret из личного кабинета и включённый на аккаунте метод telegram_otp.VH_KEY и VH_SECRET в .env.local.+7….Метод telegram_otp включается на аккаунте по запросу — пока он не активирован, запросы этим методом не пройдут; напишите в поддержку, чтобы открыть канал. Если Telegram недоступен для конкретного номера, POST /v1/verify вернёт delivery_unavailable — на этот случай стоит держать запасной способ подтверждения.
Первый обработчик принимает номер от клиента и вызывает POST /v1/verify. Авторизация — HTTP Basic: api_key как логин и api_secret как пароль, склеенные через двоеточие и закодированные в base64. Route Handlers по умолчанию исполняются в Node-рантайме, поэтому Buffer доступен.
Ответ 201 Created содержит request_id и code_length. Возвращаем клиенту только эти два поля.
Второй обработчик принимает request_id и введённый пользователем код и передаёт их в POST /v1/verify/check. Важно аккуратно пробросить и статус, и тело ответа обратно на клиент — в нём лежит как успех, так и коды ошибок.
При верном коде приходит 200 OK со status: "verified" и маскированным номером:
При неверном коде — 400 с error_code: "invalid_code" и полем attempts_remaining: сколько попыток осталось до блокировки сессии.
Компонент помечен 'use client' и хранит два состояния: текущий шаг и данные формы. Он общается только с вашими Route Handlers (/api/verify/*), а не с Verificahub напрямую. Поле для кода ограничиваем по code_length, который вернул сервер.
Клиент не знает ни api_key, ни api_secret, ни даже адреса api.verificahub.ru. Он видит только /api/verify/start и /api/verify/check — это и есть правильная граница безопасности.
Ошибки Verificahub возвращает в формате RFC-7807 (application/problem+json) со стабильным полем error_code. Ветвитесь по нему, а не по человекочитаемому detail, который может меняться. При неудачной инициации деньги не списываются.
| error_code | HTTP | Что делать |
|---|---|---|
invalid_code | 400 | Показать attempts_remaining и дать повторить ввод. |
validation_error | 400 | Код должен быть 4–8 цифр, номер — в формате E.164 +7…. |
not_pending | 409 | Сессия уже подтверждена, истекла или провалена — начните новую. |
not_found | 404 | Неверный request_id или он не принадлежит аккаунту. |
delivery_unavailable | 400 | Telegram недоступен для номера — переключитесь на запасной канал. |
insufficient_balance | 402 | Пополните баланс в кабинете. |
rate_limit_exceeded | 429 | Учтите заголовок Retry-After и снизьте частоту запросов. |
При Telegram OTP результат вы получаете синхронно — прямо в ответе POST /v1/verify/check. Поэтому опрашивать статус или ждать вебхук, как при reverse flash call, не требуется: check сразу говорит verified или invalid_code.
Вебхуки тут — необязательное дополнение. События verification.delivered и verification.verified (подпись HMAC-SHA256, заголовок X-Verificahub-Signature) удобно использовать для аудита и аналитики доставки. Настраиваются они в кабинете; детали — в документации API.
Telegram OTP стоит от 0,90 ₽ за подтверждение. Модель — оплата за результат (charge-on-delivery): списание происходит за доставленный код, а неудачная инициация не тарифицируется. Подписок и пакетов нет — вы платите только за факт доставки. Полное сравнение методов и актуальные цены смотрите на странице тарифов.
Не у всех пользователей есть Telegram. Чтобы не терять конверсию, добавьте запасной канал: если POST /v1/verify вернул delivery_unavailable, переключитесь на обратный flash-call или SMS. Как выстроить автоматическую цепочку «Telegram → звонок → SMS» на своей стороне, разбираем в гайде про каскадную доставку OTP.
Нет. Код Verificahub не возвращает никогда — его видит только пользователь в Telegram. Ваш сервер получает лишь request_id и code_length, а сверку делает POST /v1/verify/check.
Нет. Код отправляется через официальный Telegram Gateway от сервиса «Verification Codes». Ботов, номеров и отдельного договора с Telegram не требуется — вы вызываете только API Verificahub.
Ответ 400 с error_code: "invalid_code" содержит поле attempts_remaining. Покажите пользователю, сколько попыток осталось, и дайте повторно ввести код. Когда попытки закончатся, начните новую проверку через POST /v1/verify.
Для авторизации нужен api_secret — это пароль от аккаунта, и в браузере или мобильном приложении его украдут. Все вызовы идут через серверные Route Handlers, а ключи лежат в переменных окружения.
По умолчанию 300 секунд; задаётся полем expiry_seconds (диапазон 1–600) в POST /v1/verify. У кодов Telegram Gateway короткий TTL, поэтому большое значение ставить не стоит.