OTP-коды подтверждения
без SMS-шлюзов

6-значный код приходит в Telegram или Max за миллисекунды. Ноль рублей за отправку, атомарная верификация, защита от race condition и перебора — встроены.

· TTL 5 минут, до 5 попыток, 1 активный код на пользователя

@zapnotybot
OTP-код
→ Нажмите «Отправить код»
POST /v1/otp/send TTL 5 min · 5 attempts
≈ 0 ₽
за OTP vs 4-7 ₽ за SMS
< 2 сек
от отправки до прочтения
100%
доставляемость vs ~95% у SMS
6
цифр, FOR UPDATE против race

Почему SMS больше не работает

Проблемы классических SMS-шлюзов

4-7 ₽ за каждый код

При 10 000 регистраций в месяц — 40-70 тысяч рублей только на SMS. Растёт с аудиторией линейно, давит на unit-экономику.

Не всегда доходит

Операторы фильтруют маркетинговый траффик, коды пропадают в роуминге, задержки 30-60 секунд. Пользователь уходит не зарегистрировавшись.

Фрод и SIM-swap

SMS перехватывается социальной инженерией и подменой SIM. Telegram и Max защищены двухфакторкой самого мессенджера.

Что внутри

Всё, что нужно для production-grade OTP

Атомарная верификация

SQL-запрос с FOR UPDATE и CTE проверяет код + инкрементит попытки в одной транзакции. Race condition невозможен.

Кастомный шаблон

Переменные {{code}}, {{minutes}}, HTML-форматирование, мультиязычность. Бренд сообщения — ваш, не Zapnoty.

Защита от перебора

Максимум 5 попыток ввода, один активный код на подписчика, TTL 5 минут. При исчерпании — автоматическое аннулирование.

Rate limit на отправку

300 запросов в минуту на проект, встроенный sliding window через Redis. Не нужно городить Redis-счётчики у себя.

Поддержка тестовых UUID

subscriber_id = 00000000-... — тестовый OTP без реального пользователя. Удобно для автотестов и CI.

Webhook по факту отправки

delivery.success / delivery.failed с причиной. Логируйте OTP-потоки на своей стороне без отдельного трекинга.

Как это работает

Два эндпоинта и вся OTP-логика

01

POST /v1/otp/send

Передайте subscriber_id. Zapnoty сгенерирует 6-значный код, сохранит SHA-256 хеш в БД, отправит в мессенджер по шаблону.

02

Пользователь получает код

Код приходит в Telegram или Max за миллисекунды. Формат HTML — <code>482916</code> — копируется одним тапом.

03

POST /v1/otp/verify

Передаёте subscriber_id + code. Zapnoty атомарно сравнит хеши, увеличит счётчик попыток, вернёт verified: true/false.

FAQ

Частые вопросы

Рекомендуем связку — при регистрации дайте выбор Telegram или Max. Кто не использует мессенджеры — откатывайтесь на SMS через свой шлюз. Zapnoty не исключает SMS, а снижает его долю до 10-15%.

Да. Верификация — атомарный CTE с FOR UPDATE: проверка кода и инкремент попыток выполняются в одной транзакции. Два одновременных запроса с разными кодами корректно обрабатываются.

Сейчас — 6 цифр, это стандарт для OTP. Если нужна другая длина (4 или 8) — напишите в поддержку, добавим настройку.

Подписка автоматически деактивируется. Вы получите delivery.failed webhook — можно показать пользователю «разблокируйте @zapnotybot и попробуйте снова».

Нет. В БД только SHA-256 хеш. Сам код существует только в памяти на момент отправки и в чате пользователя.

1 кредит за OTP-код. На тарифе «Базовый» (700 кредитов за 590 ₽/мес) это ≈ 0.84 ₽ за код — в 5-7 раз дешевле SMS. На больших тарифах — до 0.14 ₽.

Бесплатный старт

Подключите за 5 минут

Без привязки карты. 100 кредитов в месяц бесплатно — этого хватит, чтобы попробовать все возможности.