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

Как получать статусы отправленных кодов OTP — через push (вебхук) или pull (запрос к API)

Коротко: статусы показывают, что произошло с отправленным кодом: доставлен, прочитан, была ошибка. Есть два способа их получать — push (мы отправляем) и pull (вы запрашиваете сами).

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

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

Что это

После отправки кода важно знать его дальнейшую судьбу:

  • Дошёл ли код до получателя.
  • Прочитал ли он его.
  • Была ли ошибка и какая.
  • Сколько стоила отправка.

Эти данные и есть статусы. Они помогают обновлять состояние в вашей CRM, или другой системе, уведомлять менеджера, считать стоимость, запускать резервный канал (запускается автоматически в каскадной отправке сообщений).

Два способа получения статусов

СпособКто инициируетКогда использовать
PushПлатформа отправляет статусы вамКогда нужны статусы в реальном времени
PullВы запрашиваете статусы самиКогда нужны статусы пачкой — например, или вам удобно запрашивать статусы самостоятельно

Можно использовать один способ или оба одновременно.

Push — платформа отправляет статусы

Платформа сама отправляет статус на ваш URL по мере изменения состояния сообщения: отправлено, доставлено, прочитано.

Что нужно с вашей стороны

  1. Поднять эндпоинт, который принимает POST-запросы и отвечает кодом 200 OK. Например: https://ваш-сайт.com/webhook/iba.
  2. Указать этот URL одним из способов:
    • в поле webhook в каждом запросе;
    • в настройках имени отправителя;
    • в настройках API-ключа.
  3. Обрабатывать входящие статусы на своей стороне.

Пример: запрос от платформы на ваш вебхук

{
  "event": "messageStatus",
  "message": {
    "messageId": "4aab1947-7a34-4efe-8c51-e9c8f9b1412b",
    "omniTransactionId": "57f29fdd-1127-45b3-a7d5-260a831a4662",
    "channel": 1,
    "senderId": "sender_name",
    "status": "delivered",
    "timestamp": "2023-09-08T15:30:00Z",
    "contact": "905324546496",
    "cost": "1.00"
  }
}

Возможные статусы

СтатусЧто означает
sentСообщение отправлено
deliveredСообщение доставлено
displayedСообщение прочитано (статус доступен не во всех каналах)
failedОшибка отправки
undeliverableСообщение не доставлено
unknownНеизвестный статус

Если от провайдера приходит ошибка (недоступен абонент, неверный номер и т. п.), статус придёт как failed или undeliverable. В поле reason будет описание ошибки.

Pull — запрашиваете статусы сами

Вы обращаетесь к API и запрашиваете статусы по нужным фильтрам. Это удобно, когда статусы нужны не сразу, или вам удобно запрашивать статусы самостоятельно.

Эндпоинт: GET /api/v1/edrs

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

ПараметрТипЧто указать
messageIdsstringСписок ID сообщений через запятую (1–10 штук)
timeFromstringНачало периода (например, 2024-01-01T00:00:00Z)
timeTostringКонец периода. Указывается обязательно вместе с timeFrom
phoneNumbersstringСписок номеров телефонов через запятую (1–10 штук)
broadcastRunIdintegerID запуска рассылки
offsetintegerСмещение
limitintegerМаксимум записей. По умолчанию 100

Указывайте либо messageIds, либо timeFrom + timeTo. Остальные параметры — опциональны.

Пример 1. Запрос по ID сообщений

curl --location 'https://web.otpcod.ru/api/v1/edrs?messageIds=6719b5f4-36af-4fba-b111-49ff07f4f96b,75bb9087-fc19-4940-a004-c2723337cb2f' \
  --header 'X-API-Key: <ваш-ключ>'

Пример 2. Запрос за период

curl --location 'https://web.otpcod.ru/api/v1/edrs?timeFrom=2024-01-01T00:00:00Z&timeTo=2024-01-02T00:00:00Z&limit=50' \
  --header 'X-API-Key: <ваш-ключ>'

Пример 3. Запрос по номеру телефона

curl --location 'https://web.otpcod.ru/api/v1/edrs?phoneNumbers=905324546496&limit=20' \
  --header 'X-API-Key: <ваш-ключ>'

Формат ответа

{
  "count": 2,
  "limit": 100,
  "offset": 0,
  "data": [
    {
      "messageId": "6719b5f4-36af-4fba-b111-49ff07f4f96b",
      "channelType": 1,
      "senderId": "sender_name",
      "isSent": true,
      "isDelivered": true,
      "isSeen": false,
      "mdnStatus": "DELIVRD",
      "timeSent": "2024-01-01T10:00:00Z",
      "timeDelivered": "2024-01-01T10:00:05Z",
      "timeSeen": null,
      "finalCost": 0.0248,
      "country": "RU",
      "network": "MTS",
      "errorMessage": null
    }
  ]
}

Поля ответа

ПолеЧто означает
messageIdID сообщения
channelTypeНомер канала
senderIdИмя отправителя
isSentОтправлено
isDeliveredДоставлено
isSeenПрочитано (статус доступен не во всех каналах)
mdnStatusСтатус от оператора
timeSentВремя отправки
timeDeliveredВремя доставки
timeSeenВремя прочтения
finalCostИтоговая стоимость
country / networkСтрана и оператор
errorMessageОшибка (если есть)

Что можно делать со статусами

  • Обновлять состояние кода в вашей CRM, или другой системе.
  • Уведомлять менеджера о недоставке.
  • Считать стоимость отправки.

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

Причина: ваш эндпоинт не отвечает кодом 200 OK или недоступен.

Решение: проверьте, что URL открыт из интернета и возвращает 200 OK. Платформа повторяет отправку при ошибке.

Причина: стоимость может быть не рассчитана на момент отправки статуса.

Решение: запросите статус повторно через GET /edrs — там поле finalCost заполняется.

Причина: по указанным фильтрам нет сообщений, или период указан неверно.

Решение: проверьте messageIds, период или номер телефона. Если запрашиваете по периоду — оба поля timeFrom и timeTo обязательны.

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

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

См. также

Подключение к API

Аутентификация и базовый URL

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

Отправка кодов, каскад, шаблоны

Вебхуки

Все типы вебхуков платформы

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

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

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