Authorization Code flow, QR для десктопа, кросс-девайс polling. Пользователь кликает ссылку, подтверждает в боте — у вас на руках его имя, username и subscriber_id.
· Rate limit 5 сессий/час, коды TTL 300 сек, GETDEL атомарно
Без нас
Параметр state для CSRF, хранилище с TTL, одноразовые коды, атомарное GETDEL против TOCTOU — реализовать корректно непросто.
Пользователь на десктопе, бот на мобильном. Нужен механизм: показать QR, ждать подтверждения, не падать после 5 минут — сессии, polling, экспирация.
Без лимитов на создание сессий сайт превратится в генератор ссылок. Нужен sliding window rate limit на проект и на IP.
Что внутри
Простой случай — ссылка t.me/bot?start=auth_SLUG. Один клик → подтверждение → ваш callback_url?code=...
POST /v1/auth/session с вашим state. Возвращает session_id и ссылки на ботов. state дойдёт обратно с кодом — привяжете к своей браузерной сессии.
Desktop-логин: QR со ссылкой + polling GET /v1/auth/session/:id/status каждые 2-3 секунды. Когда пользователь подтвердит на телефоне — получите code.
ensure_subscribed() после подтверждения добавляет пользователя в подписчики проекта — дальше можно отправлять ему уведомления без доп. действий.
Lua-скрипт GET+DEL предотвращает повторное использование кода между двумя запросами (TOCTOU-safe).
Событие прилетает сразу после подтверждения. Не обязаны ждать, пока пользователь вернётся на сайт — можете разблокировать его бэкенд немедленно.
Как это работает
Ссылка ведёт в @zapnotybot или Max-бот с deep link auth_SLUG. Бот показывает «Войти в ваш проект?» с кнопками Да/Отмена.
Нажатие «Да» → автоподписка на уведомления + генерация одноразового кода в Redis. Бот редактирует сообщение на «Авторизация подтверждена ✅».
Ваш callback_url?code=CODE. POST /v1/auth/verify атомарно съедает код и возвращает данные: subscriber_id, first_name, username, lang.
FAQ
Telegram Login Widget требует собственного бота, настройки домена и не поддерживает Max. Zapnoty — SaaS-слой: вы получаете оба канала, автоподписку на ваши уведомления и готовый API сессий.
Max работает без VPN в РФ. Если пользователь на десктопе без Telegram — даём ему QR для Max и ссылку в браузере. Авторизация проходит в любом случае.
subscriber_id (UUID), channel (telegram/max), first_name, username, lang (ru/en), tags (массив). Email и телефон — не передаются (их нет у Telegram/Max).
Код одноразовый — GETDEL через Lua-скрипт делает его невалидным сразу после verify. TTL 300 секунд. Rate limit 5 сессий в час на проект.
1 кредит за успешную авторизацию (подтверждение в боте). На бесплатном тарифе — до 100 в месяц, на базовом — до 700.
Да. Если сотрудники уже в Telegram или Max — логин через мессенджер быстрее и удобнее классических корпоративных OAuth.
Без привязки карты. 100 кредитов в месяц бесплатно — этого хватит, чтобы попробовать все возможности.
Решения и кейсы
Частые сценарии, в которых Zapnoty заменяет связку из 3-4 отдельных сервисов.
В 10 раз дешевле SMS, доходчивее email
OTP, статусы заказов, брошенные корзины, промо
Формы с уведомлением сразу в Telegram, без забытых ящиков
Drip-уроки, напоминания, Q&A и вход через бот
Поддержка в Telegram/Max без тяжёлого чат-виджета