OMNI API — отправка сообщений

OMNI API Multi API — отправка одиночных сообщений и каскадов, параметры запроса, таблица каналов, отправка шаблонов

Коротко: OMNI API — единый интерфейс для отправки сообщений. Поддерживает отправку одного сообщения и каскадную отправку с автоматическим переключением между каналами.

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

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

Что такое OMNI API

OMNI API отправляет сообщения через единый эндпоинт. Не важно, какой канал вы используете — SMS, RCS, WhatsApp, Viber, Telegram и так далее, — структура запроса одна.

Два режима отправки:

  • Одиночное сообщение — POST /messages — отправка через один канал.
  • Каскад — POST /omnimessages — последовательная отправка через несколько каналов с автоматическим переключением.

Эндпоинты

МетодЭндпоинтДля чего
POST/messagesОтправка одного сообщения
POST/omnimessagesКаскадная отправка

Полный URL: https://web.multiapi.ru/api/v1/messages и https://web.multiapi.ru/api/v1/omnimessages.

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

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

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

isOtp: true указывайте, только если сообщение содержит одноразовый код (OTP, 2FA, код верификации). Для обычных сообщений — не указывайте.

Таблица каналов

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

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

Отправка одного сообщения

Запрос POST /messages отправляет сообщение через один канал.

Пример SMS:

curl --location 'https://web.multiapi.ru/api/v1/messages' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <ваш-ключ>' \
  --data-raw '{
    "contact": "905063565285",
    "channel": 1,
    "senderId": "<senderID>",
    "payload": {
      "text": "Тестовое сообщение"
    }
  }'

Полный ответ придёт кодом 202 Accepted с messageId. Факт доставки придёт асинхронно через вебхук.

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

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

Запрос POST /omnimessages принимает массив messages — по объекту на каждый канал.

Для каждого сообщения (кроме последнего) можно указать:

  • successOn — статус, при котором сообщение считается успешным. Если он не наступит — платформа перейдёт к следующему сообщению.
  • timeout — секунды ожидания successOn. По умолчанию 1200 (20 минут).

На верхнем уровне можно указать cooldown — секунды блокировки контакта при неудаче всего каскада.

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

curl --location 'https://web.multiapi.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": 2,
        "senderId": "<senderID>",
        "successOn": "delivered",
        "timeout": 60,
        "template": {
          "id": <rcsTemplateID>,
          "params": {
            "attribute.phoneNumber": "112332",
            "attribute.name": "test-name"
          }
        }
      },
      {
        "channel": 1,
        "senderId": "<senderID>",
        "template": {
          "id": <smsTemplateID>,
          "params": {
            "attribute.phoneNumber": "112332",
            "attribute.code": "1234"
          }
        }
      }
    ]
  }'

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

У каждого канала в каскаде может быть свой шаблон или произвольный текст через payload. Комбинации любые.

Отправка шаблонов

Для отправки сообщения по шаблону используйте параметр template вместо payload.

ПолеТипОбязательноЧто указать
idintegerДаID шаблона из раздела «Активы» → «Шаблоны сообщений»
paramsobjectДаАтрибуты шаблона. Если шаблон без переменных — передайте пустой объект {}

Пример отправки шаблона через RCS:

curl --location 'https://web.multiapi.ru/api/v1/messages' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <ваш-ключ>' \
  --data-raw '{
    "contact": "<dnis>",
    "webhook": "<webhookURL>",
    "channel": 2,
    "senderId": "<senderID>",
    "template": {
      "id": <templateID>,
      "params": {
        "attribute.phoneNumber": "112332",
        "attribute.name": "test-name"
      }
    }
  }'

Коды ответов

КодЧто означает
202 AcceptedЗапрос принят. Тело содержит error: false и объект data
400Ошибка параметров запроса
401Неверный или отсутствующий API-ключ
404Ресурс не найден
500Внутренняя ошибка сервера

Пример успешного ответа:

{
  "error": false,
  "data": {
    "channel": 4,
    "transactionId": "95e3e0da-9684-4ba4-88a3-e9207ddeca05",
    "messageId": "6719b5f4-36af-4fba-b111-49ff07f4f96b"
  }
}

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

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

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

Причина: неверный ключ атрибута в template.params.

Решение: проверьте формат — например, attribute.name.

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

Решение: проверьте заголовок X-API-Key.

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

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

Причина: статус, указанный в successOn, уже наступил — например, sent, а вы ждали delivered. По умолчанию successOn = sent, поэтому переход не происходит.

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

См. также

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

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

Broadcasts API

Запуск рассылок, шаблоны рассылок

Вебхуки

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

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

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

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