OMNI API — отправка кодов

OMNI API OTP-кодов — отправка одноразовых кодов, каскад, 2FA-эндпоинты, параметры запроса, таблица каналов

Коротко: OMNI API отправляет одноразовые коды через SMS, WhatsApp, TTS и другие каналы. Поддерживает каскад и интеграцию с 2FA-сервисом.

Кому подходит

  • Роль: Разработчик, Интегратор
  • Уровень: Опытный

Эндпоинты

МетодЭндпоинтДля чего
POST/messagesОтправка одного кода
POST/omnimessagesКаскадная отправка
POST/2fa/verifyПроверить код 2FA
GET/2fa/requests/{requestId}Получить статус 2FA-запроса

Полный URL: https://web.otpcod.ru/api/v1/....

Параметры запроса

ПолеТипОбязательноЧто указать
contactstringДаНомер получателя с кодом страны, без «+»
channelintegerДаНомер канала
senderIdstringДаИмя отправителя из «Активы → Имена отправителей»
payloadobjectДа*Содержимое сообщения
templateobjectДа*Содержимое шаблона: id и params
webhookstringНетURL для приёма статусов. Подробнее — Вебхуки
clientInfostringНетПроизвольное поле, сохраняется в EDR
isOtpbooleanДа (для OTP)Указывайте true для одноразовых кодов
successOnstringНетТолько для каскада. sent, delivered, seen. По умолчанию sent
timeoutintegerНетТолько для каскада. Секунды до перехода на следующий канал. По умолчанию 1200
cooldownintegerНетТолько для каскада. Секунды блокировки контакта
ttlintegerНетВремя жизни кода

*- нужен либо payload, либо template.

Для кодов верификации всегда указывайте isOtp: true. Тогда в EDR содержимое сообщения не сохраняется в открытом виде.

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

  • Получателю уходит настоящее сообщение с кодом, например: Ваш код подтверждения: 1234.
  • В EDR это же сообщение сохраняется с заменой кода на маску: Ваш код подтверждения: ******.

Так код остаётся доступен получателю, но не хранится в открытом виде в записях платформы.

Таблица каналов для OTP

НомерКаналПодходит для OTP
1SMS✅
2RCS✅
3Viber✅
4WhatsApp✅
5VK/OK❌
6WeChat❌
7Email❌
8Telegram Gateway✅
9Telegram❌
10Push✅
11TTS✅
12Voice❌
13Mobile Push✅
14FlashCall✅

Не все каналы доступны для каждой компании. Полный список можно получить через эндпоинт GET /channels.

Отправка одного кода

Пример SMS с кодом:

curl --location 'https://web.otpcod.ru/api/v1/messages' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <ваш-ключ>' \
  --data-raw '{
    "contact": "905063565285",
    "channel": 1,
    "senderId": "<senderID>",
    "isOtp": true,
    "payload": {
      "text": "Ваш код: 1234"
    }
  }'

Пример WhatsApp-кода через шаблон:

curl --location 'https://web.otpcod.ru/api/v1/messages' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <ваш-ключ>' \
  --data-raw '{
    "contact": "905063565285",
    "channel": 4,
    "senderId": "<senderID>",
    "isOtp": true,
    "template": {
      "id": <templateID>,
      "params": {
        "attribute.phoneNumber": "905063565285",
        "attribute.code": "1234"
      }
    }
  }'

Форматы payload для каждого канала смотрите в статье Форматы payload по каналам — они одинаковые для всех сервисов.

Каскадная отправка

Запрос POST /omnimessages принимает массив messages.

Пример: WhatsApp → SMS с двумя шаблонами

curl --location 'https://web.otpcod.ru/api/v1/omnimessages' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <ваш-ключ>' \
  --data-raw '{
    "contact": "<dnis>",
    "webhook": "<webhookURL>",
    "isOtp": true,
    "cooldown": 86400,
    "messages": [
      {
        "channel": 4,
        "senderId": "<senderID>",
        "successOn": "delivered",
        "timeout": 60,
        "template": {
          "id": <waTemplateID>,
          "params": {
            "attribute.code": "1234"
          }
        }
      },
      {
        "channel": 1,
        "senderId": "<senderID>",
        "template": {
          "id": <smsTemplateID>,
          "params": {
            "attribute.code": "1234"
          }
        }
      }
    ]
  }'

SMS отправится, если WhatsApp не получит статус delivered в течение 60 секунд или если от провайдера сразу придёт статус failed / undeliverable.

2FA-эндпоинты

Эти эндпоинты используются только при интеграции с 2FA-сервисом. Они используют Basic Auth и отдельный API-ключ интеграции.

Проверка кода

Эндпоинт: POST /2fa/verify

Параметры (form-data):

ПолеТипОбязательноЧто указать
requestIdstringДаID запроса, полученный при отправке кода
codestringДаКод, введённый пользователем

Пример:

curl -X POST https://<домен-OTP>/api/v1/2fa/verify \
  -u <API-ключ> \
  -d requestId=<requestId> \
  -d code=<код>

Успешный ответ:

{
  "number": "12345678910",
  "verifiedAt": 1234567890
}

Статус запроса

Эндпоинт: GET /2fa/requests/{requestId}

Пример:

curl https://<домен-OTP>/api/v1/2fa/requests/<requestId> \
  -u <API-ключ>

Успешный ответ:

{
  "id": "<requestId>",
  "number": "<номер>",
  "rate": 0.0248,
  "status": "SUBMIT",
  "sender": "<имя отправителя>",
  "goals": ["NUMBER_VERIFIED"],
  "createdAt": 1234567891011
}

Подробнее о настройке 2FA-интеграции — в статьях:

Коды ответов

КодЧто означает
200 OKУспешно
202 AcceptedЗапрос принят
400Ошибка параметров
401Неверный ключ
404Ресурс не найден
500Внутренняя ошибка сервера

Частые проблемы

Причина: неверный ID шаблона.

Решение: откройте раздел Активы → Шаблоны сообщений, скопируйте точный ID.

Причина: не указан isOtp: true.

Решение: добавьте isOtp: true в запрос — содержимое будет скрыто в EDR.

Причина: неверный или отсутствующий API-ключ.

Решение: проверьте заголовок X-API-Key (для OMNI API) или Basic Auth (для 2FA).

Причина: в запросе указано имя отправителя, которое не привязано к этому ключу.

Решение: откройте ключ в разделе API Подключения и добавьте имя отправителя.

Причина: статус из successOn уже наступил (например, sent, а вы ждали delivered).

Решение: явно укажите successOn: "delivered" для каждого сообщения.

См. также

Форматы payload по каналам

JSON-примеры для каждого канала

Broadcasts API

Запуск рассылок

Вебхуки

Статусы сообщений

Обработка ошибок API

HTTP-коды и форматы ответов

Нужна помощь?