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

> **For AI agents:** the complete documentation index is at [llms.txt](/llms.txt). Append `.md` to any page URL for its markdown version.



> **Коротко:** 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 для приёма статусов. Подробнее — [Вебхуки](/06-reference/01-api/api-webhooks) |
| clientInfo | string | Нет | Произвольное поле, сохраняется в EDR |
| isOtp | boolean | Да (для OTP) | Указывайте `true` для одноразовых кодов |
| successOn | string | Нет | Только для каскада. `sent`, `delivered`, `seen`. По умолчанию `sent` |
| timeout | integer | Нет | Только для каскада. Секунды до перехода на следующий канал. По умолчанию 1200 |
| cooldown | integer | Нет | Только для каскада. Секунды блокировки контакта |
| ttl | integer | Нет | Время жизни кода |

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

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

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

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

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

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

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

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

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

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

```bash
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-кода через шаблон:**

```bash
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"
      }
    }
  }'
```

<Note>
Форматы `payload` для каждого канала смотрите в статье [Форматы payload по каналам](/03-multiapi/02-api/mapi-104-omni-payload) — они одинаковые для всех сервисов.
</Note>

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

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

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

```bash
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"
          }
        }
      }
    ]
  }'
```

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

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

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

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

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

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

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

**Пример:**

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

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

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

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

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

**Пример:**

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

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

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

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

- [Как настроить 2FA-интеграцию](/02-otp/01-turnkey/otp-102-setup-2fa)
- [Принцип работы 2FA: на стороне платформы](/02-otp/01-turnkey/otp-106-platform-side)
- [Принцип работы 2FA: на стороне клиента](/02-otp/01-turnkey/otp-107-client-side)
- [Проверка запроса 2FA](/02-otp/01-turnkey/otp-109-check-request)

## Коды ответов

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

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

<Accordion title="Ошибка «Template not found»">
**Причина:** неверный ID шаблона.

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

<Accordion title="Код виден в EDR">
**Причина:** не указан `isOtp: true`.

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

<Accordion title="401 Unauthorized">
**Причина:** неверный или отсутствующий API-ключ.

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

<Accordion title="400 Bad Request: sender not found">
**Причина:** в запросе указано имя отправителя, которое не привязано к этому ключу.

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

<Accordion title="Каскад не переключается на следующий канал">
**Причина:** статус из `successOn` уже наступил (например, `sent`, а вы ждали `delivered`).

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

## См. также

<Columns cols={2}>
  <Card title="Форматы payload по каналам" icon="code" href="/03-multiapi/02-api/mapi-104-omni-payload">
    JSON-примеры для каждого канала
  </Card>
  <Card title="Broadcasts API" icon="bullhorn" href="/02-otp/08-api/otp-api-broadcasts">
    Запуск рассылок
  </Card>
  <Card title="Вебхуки" icon="link" href="/06-reference/01-api/api-webhooks">
    Статусы сообщений
  </Card>
  <Card title="Обработка ошибок API" icon="triangle-exclamation" href="/06-reference/01-api/api-errors">
    HTTP-коды и форматы ответов
  </Card>
</Columns>

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

- OTP-коды: support@otpcod.ru
