Технологии

Надёжная и экономная OTP-верификация для бизнеса

← Все статьи

Верификация по номеру телефона — самая незаметная строка в бюджете продукта. Пока пользователей сотня, её никто не считает. Когда их десятки тысяч, выясняется, что компания платит миллионы тенге в год за то, чтобы люди просто входили в собственный аккаунт.

Самое обидное: платит она за это по привычке. Почти все интеграции верификации в Казахстане начинаются и заканчиваются одним каналом — SMS. Хотя код можно доставить и вчетверо, и в тридцать раз дешевле.

Сколько на самом деле стоит «просто отправить код»

На популярном льготном тарифе AutoCall.kz одно SMS стоит 23.25 ₸. Умножьте на свой месячный объём — цифра получается неприятная:

Верификаций в месяц Только SMS В год
1 000 23 250 ₸ 279 000 ₸
10 000 232 500 ₸ 2 790 000 ₸
50 000 1 162 500 ₸ 13 950 000 ₸

И это расход, который растёт ровно вместе с успехом продукта. Чем больше у вас пользователей, тем больше вы платите за право их узнавать.

Первая мысль обычно такая: «раз SMS дорого — заменим его целиком на что-то дешёвое». Это ловушка. Любой дешёвый канал доставляет чуть хуже дорогого, и экономия на верификации оборачивается потерянными регистрациями — а это стоит гораздо больше разницы в тарифах.

Правильный вопрос не «какой канал выбрать», а «в каком порядке их пробовать». Дешёвый канал должен быть первым, дорогой — последним. И платить за дорогой вы будете только тогда, когда дешёвый действительно не сработал.

Трёхступенчатая верификация

Принцип простой: пользователь получает код самым дешёвым способом. Если код не дошёл, он нажимает «Отправить ещё раз» — и вы поднимаетесь на ступень выше. Так продолжается до SMS, который дойдёт почти наверняка.

Ключевая мысль в том, что до верхних ступеней доходит меньшинство. Платит бизнес за первую ступень для всех и за дорогую — для единиц.

1
Flash Call
1 ₸ за верификацию

Пользователю поступает входящий звонок, который тут же сбрасывается. Код — последние цифры номера звонящего. Отвечать не нужно, платить абоненту не за что, приходит за 3–10 секунд. Самый дешёвый способ доставить код в принципе.

2
Голосовой звонок
~8.92 ₸ за верификацию

Робот звонит и проговаривает код голосом, дважды. Работает там, где Flash Call не подошёл: пользователь не увидел экран, у него включён антиспам-фильтр на неизвестные номера или он просто не понял, что за пропущенный. Плюс это единственный метод, доступный слабовидящим и удобный за рулём.

3
SMS
23.25 ₸ за верификацию

Самый дорогой и самый надёжный канал. Сообщение остаётся в телефоне, его можно перечитать и скопировать, iOS и Android подставляют код автоматически. Именно поэтому SMS — не первая ступень, а страховка на случай, когда всё остальное не сработало.

Ступень 1: Flash Call

Один запрос. В ответе приходит code — сохраните его у себя и сравните с тем, что введёт пользователь.

POST 1 ₸
/api/v1/flash-calls
POST /api/v1/flash-calls
Authorization: Bearer {ваш_токен}
Content-Type: application/json

{
  "number": "+77010000000",
  "digits": 4 // длина кода, 3–6 цифр
}
201 Created
response
← 201 Created

{
  "id": 11223,
  "code": "7482", // это и есть код — сохраните у себя
  "number": "+77010000000"
}

Пользователь видит входящий вызов с номера, скажем, +7 708 123 7482 — и вводит последние четыре цифры. Всё.

Используйте авто-код. Есть второй режим, где вы задаёте код сами ("code": "7482"), но тогда мы должны найти в пуле свободный номер, который заканчивается ровно на эти цифры, — и можем не найти. Авто-код работает всегда и стоит дешевле.

Ступень 2: голосовой звонок

Пользователь нажал «Отправить код ещё раз» — поднимаемся на ступень выше. Здесь мы синтезируем короткую запись с кодом и звоним.

POST ~8.92 ₸
/api/v1/autocalls
POST /api/v1/autocalls
Authorization: Bearer {ваш_токен}
Content-Type: application/json

{
  "name": "OTP verification",
  "type": "regular",
  "audio_id": [{
    "type": "synthesis",
    "data": {
      "text": "Код подтверждения: 7, 4, 8, 2. Повторяю: 7, 4, 8, 2."
    }
  }],
  "list_id": [
    { "number": "+77010000000" }
  ]
}

Обратите внимание на текст: цифры перечислены через запятую и повторены дважды. Так синтез произносит их раздельно, а не как число «семь тысяч четыреста восемьдесят два», и у пользователя есть второй шанс расслышать.

Из чего складывается цена: ~7 секунд разговора по 0.56 ₸ плюс 5 ₸ за синтез записи. Синтез отдельной строкой потому, что код у каждого пользователя свой — запись приходится генерировать заново под каждый звонок.

Ступень 3: SMS

Если код не дошёл и голосом — отправляем SMS. На этой ступени экономить уже незачем: важно, чтобы человек наконец вошёл.

POST 23.25 ₸
/api/v1/bulks
POST /api/v1/bulks
Authorization: Bearer {ваш_токен}
Content-Type: application/json

{
  "name": "OTP verification",
  "text": "Код подтверждения: 7482. Никому не сообщайте код.",
  "list_id": [
    { "number": "+77010000000" }
  ]
}

Следите за длиной текста. SMS с кириллицей вмещает 70 символов; всё, что длиннее, тарифицируется как два сообщения и больше. «Код подтверждения: 7482. Никому не сообщайте код.» укладывается в одно — а вот развёрнутое приветствие с названием компании уже нет.

Считаем экономию

Подставьте свои цифры. Доли — это то, что вы легко померите у себя в аналитике: сколько пользователей нажимают «отправить ещё раз» на каждом шаге.

Тариф
Верификаций в месяц
Дошли до ступени 2, %
Из них до ступени 3, %
Только SMS
Каскад
Экономия в месяц

Значения по умолчанию — просто круглые числа для примера, не наша статистика. Но даже при пессимистичных долях каскад выигрывает: на первой ступени вы платите единицы тенге за всех, а десятки — за небольшой остаток.

Как это выглядит со стороны кода

Логика целиком на вашей стороне и умещается в несколько строк:

  1. Сгенерировали запрос на верификацию — заведите счётчик попыток для этого номера (в Redis, в сессии, где удобно).
  2. Попытка 1 → POST /api/v1/flash-calls. Сохраните code из ответа.
  3. Попытка 2 → POST /api/v1/autocalls с тем же кодом.
  4. Попытка 3 и далее → POST /api/v1/bulks.
  5. Код живёт 3–5 минут, попыток ввода не больше пяти — дальше начинайте заново.

Пара практических мелочей, которые экономят нервы:

  • Кнопку «отправить ещё раз» блокируйте на 60 секунд. Иначе пользователь нажмёт её трижды подряд и вы оплатите три ступени за одну верификацию.
  • Код между ступенями не меняйте. Человек мог всё-таки разглядеть номер Flash Call и вводить именно те цифры — новый код собьёт его с толку.
  • На Flash Call действует ограничение: не больше 3 запросов на один номер за 5 минут. Это защита от перебора, и она же убережёт вас от кривого ретрая в собственном коде.
  • Объясните пользователю, что происходит. «Вам поступит короткий звонок, отвечать не нужно — введите последние 4 цифры номера» снимает почти все вопросы к первой ступени.

Когда каскад не нужен

Честно: не всем. Если верификаций у вас пара сотен в месяц, разница в деньгах не окупит день работы разработчика — оставайтесь на SMS. Каскад начинает окупаться примерно с нескольких тысяч верификаций в месяц, а с десятков тысяч становится очевидным решением.

Ещё один случай, когда первую ступень стоит пропустить, — если ваша аудитория совсем не техническая и звонок с незнакомого номера её пугает. Тогда начинайте сразу с голосового: он всё равно дешевле SMS.

Вывод

Верификация — это не «канал», это последовательность. Один и тот же код можно доставить за 1 ₸ и за 23.25 ₸ — вопрос лишь в том, начинаете вы с дешёвого или с дорогого.

В AutoCall.kz все три метода живут в одном сервисе, за одним API-токеном и на одном балансе. Не нужно подключать трёх провайдеров и сводить три счёта — достаточно поменять эндпоинт в зависимости от номера попытки.

Подробное описание каждого метода — на странице кодов подтверждения, полная спецификация — в OpenAPI.

Три метода OTP — один API

Подключение занимает вечер. Первые верификации — бесплатно.

Попробовать бесплатно →