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/....
Параметры запроса
| Поле | Тип | Обязательно | Что указать |
|---|---|---|---|
| contact | string | Да | Номер получателя с кодом страны, без «+» |
| channel | integer | Да | Номер канала |
| senderId | string | Да | Имя отправителя из «Активы → Имена отправителей» |
| payload | object | Да* | Содержимое сообщения |
| template | object | Да* | Содержимое шаблона: id и params |
| webhook | string | Нет | URL для приёма статусов. Подробнее — Вебхуки |
| clientInfo | string | Нет | Произвольное поле, сохраняется в EDR |
| isOtp | boolean | Да (для OTP) | Указывайте true для одноразовых кодов |
| successOn | string | Нет | Только для каскада. sent, delivered, seen. По умолчанию sent |
| timeout | integer | Нет | Только для каскада. Секунды до перехода на следующий канал. По умолчанию 1200 |
| cooldown | integer | Нет | Только для каскада. Секунды блокировки контакта |
| ttl | integer | Нет | Время жизни кода |
*- нужен либо
payload, либоtemplate.
Для кодов верификации всегда указывайте isOtp: true. Тогда в EDR содержимое сообщения не сохраняется в открытом виде.
Как это работает:
- Получателю уходит настоящее сообщение с кодом, например:
Ваш код подтверждения: 1234. - В EDR это же сообщение сохраняется с заменой кода на маску:
Ваш код подтверждения: ******.
Так код остаётся доступен получателю, но не хранится в открытом виде в записях платформы.
Таблица каналов для OTP
| Номер | Канал | Подходит для OTP |
|---|---|---|
| 1 | SMS | ✅ |
| 2 | RCS | ✅ |
| 3 | Viber | ✅ |
| 4 | ✅ | |
| 5 | VK/OK | ❌ |
| 6 | ❌ | |
| 7 | ❌ | |
| 8 | Telegram Gateway | ✅ |
| 9 | Telegram | ❌ |
| 10 | Push | ✅ |
| 11 | TTS | ✅ |
| 12 | Voice | ❌ |
| 13 | Mobile Push | ✅ |
| 14 | FlashCall | ✅ |
Не все каналы доступны для каждой компании. Полный список можно получить через эндпоинт 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):
| Поле | Тип | Обязательно | Что указать |
|---|---|---|---|
| requestId | string | Да | ID запроса, полученный при отправке кода |
| code | string | Да | Код, введённый пользователем |
Пример:
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-интеграции — в статьях:
- Как настроить 2FA-интеграцию
- Принцип работы 2FA: на стороне платформы
- Принцип работы 2FA: на стороне клиента
- Проверка запроса 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" для каждого сообщения.
См. также
Нужна помощь?
- OTP-коды: support@otpcod.ru