BroadNet
HTTP API & webhooksWebhook

Статус сообщения (DLR) и входящие (MO): полезные нагрузки webhook

Обновлено 5 мин чтенияна основе стандартов
Прямой ответ

Две полезные нагрузки webhook несут события сообщений. Событие статуса доставки (DLR) сообщает об исходе сообщения — message_id, enum статуса (accepted, delivered, undelivered, expired, rejected), причину ошибки и метки времени. Событие входящего (MO) сообщает о сообщении, которое абонент отправил вам. Оба являются HTTP-эквивалентами отчётов о доставке deliver_sm SMPP и сообщений mobile-originated.

СхемаКак сообщение A2P доходит до телефона
  1. Ваше приложениеОтправка через REST API или SMPP
  2. Платформа BroadNetВалидация, маршрутизация и тарификация каждого сообщения
  3. SMSC оператораПрямое соединение с оператором
  4. Телефон абонентаСообщение доставлено
Отчет о доставке (DLR) возвращается по тому же пути на ваш webhook
§01

Два семейства событий: статус и входящие

Платформа сообщений выдаёт два принципиально разных callback. Событие статуса доставки (DLR, отчёт о доставке) — это асинхронное продолжение отправленного вами сообщения: оно говорит, что в итоге с ним произошло в сети оператора. Событие входящего (MO, mobile-originated) — незапрошенное: сообщение, отправленное абонентом на один из ваших номеров, или ответ на кампанию. Они разделяют транспорт webhook и подпись, но их схемы и смысл различаются, поэтому надёжный потребитель ветвится по дискриминатору типа события перед разбором остального. Оба — это HTTP-выражение того, что SMPP доставляет как PDU deliver_sm: на уровне провода флаг отчёта о доставке отличает DLR от MO, и то же различие на HTTP является явным полем события.

§02

Полезная нагрузка статуса доставки (DLR)

Полезная нагрузка статуса доставки соотносится с исходной отправкой по назначенному сервером message_id и сообщает статус, взятый из небольшого перечисления, плюс причину и метки времени, которые позволяют измерить задержку и сверить биллинг. Enum статуса — его сердце: он отличает промежуточное состояние accepted/enroute от терминальных состояний и отделяет положительное delivered от нескольких способов, которыми сообщение может отказать. Терминальные отрицательные состояния несут код ошибки и человекочитаемую причину, чтобы потребитель мог решить, постоянно ли плох получатель (подавить его) или сбой был временным (безопасно переотправить). Метки времени обычно включают момент, когда платформа приняла сообщение, и момент, когда наступил терминальный статус.

Тело webhook статуса доставки (DLR)json
{
  "event": "message.delivered",
  "message_id": "01HZY8Q3M6",
  "to": "+15551234567",
  "status": "delivered",
  "error": null,
  "reason": null,
  "submitted_at": "2026-07-19T09:15:22Z",
  "done_at": "2026-07-19T09:15:25Z",
  "sequence": 3
}
§03

Перечисление статусов доставки

Стандартизация значений статуса — это то, что позволяет одному потребителю обрабатывать каждого оператора, поскольку сырые сетевые ответы сильно различаются. Канонический enum отображает их на горстку состояний с ясной семантикой: терминально ли состояние и является ли оно успехом. Промежуточные состояния (accepted, enroute) могут быть вытеснены более поздним событием для того же message id, что и есть причина, по которой полезные нагрузки несут sequence или метку времени и по которой потребители применяют правило самоупорядочивания из надёжности webhook — позднее accepted никогда не должно перезаписывать более раннее delivered.

Канонические значения статуса доставки
statusТерминалЗначение
acceptedNoПлатформа приняла сообщение к доставке
enrouteNoПередано оператору, ожидается отчёт о доставке
deliveredДаПодтверждена доставка на телефон
undeliveredДаОператор не смог доставить (см. ошибку/причину)
expiredДаСрок действия истек до доставки
rejectedДаОтклонено (неверный номер, заблокирован отправитель, спам-фильтр)
unknownДаОператор не вернул окончательного состояния
§04

Полезная нагрузка входящего (MO) сообщения

Событие входящего несёт содержимое сообщения плюс маршрутизацию, необходимую для ответа и для сопоставления диалога. Критические поля — from (MSISDN абонента в формате E.164), to (номер или короткий/длинный код, на который он написал) и text; рядом с ними — message id самого входящего сообщения, метка времени получения и — поскольку входящие SMS подчиняются тем же правилам кодирования и сегментации, что и исходящие, — encoding и, для многочастного сообщения, референс конкатенации и индексы частей, чтобы потребитель мог собрать полный текст. Входящие события — это то, чем управляются кампании с ключевыми словами, двусторонние диалоги и потоки соответствия STOP/HELP.

Тело webhook входящего (MO)json
{
  "event": "message.inbound",
  "message_id": "01HZY8R7T0",
  "from": "+15551234567",
  "to": "44160",
  "text": "STOP",
  "encoding": "GSM7",
  "received_at": "2026-07-19T09:20:11Z",
  "concat": { "ref": null, "part": 1, "total": 1 }
}
§05

Таксономия типов событий

Помимо DLR и MO платформа выдаёт события жизненного цикла и аккаунта, и последовательная схема именования — строка resource.action через точку — позволяет потребителю подписываться на них и маршрутизировать их чисто. События статуса доставки — это вариации message.<status>; событие входящего — message.inbound. Группировка по префиксу ресурса означает, что потребитель может сопоставлять message.* для всего, что касается сообщения, и резервировать другие префиксы для событий аккаунта или номеров. Каждое событие также должно нести стабильный event id (используемый как nonce подписи и ключ дедупликации) и строку типа, чтобы дискриминатор и ключ идемпотентности всегда присутствовали.

Распространённые типы событий сообщений
Тип событияСемействоСрабатывает, когда
message.acceptedСтатус (DLR)Сообщение принято к доставке
message.deliveredСтатус (DLR)Доставка на телефон подтверждена
message.undeliveredСтатус (DLR)Оператор не выполнил доставку
message.expiredСтатус (DLR)Срок действия истек
message.rejectedСтатус (DLR)Сообщение отклонено на вышестоящем узле
message.inboundВходящие (MO)Абонент отправил вам сообщение
§06

Отображение HTTP-DLR на SMPP deliver_sm

HTTP-callback статуса доставки и отчёт о доставке SMPP — это одна и та же информация в двух кодировках, и платформа, мостящая REST и SMPP, транслирует между ними. В SMPP отчёт о доставке приходит как PDU deliver_sm, чей esm_class помечает его как отчёт о доставке; поле short-message несёт текстовый отчёт с полями id, stat и err, а TLV message_state несёт числовое состояние. HTTP-DLR поднимает их в JSON: токен stat из SMPP отображается на канонический enum статуса, значение err — на поле error, а времена submit/done отчёта — на submitted_at/done_at. Понимание этого отображения — то, что позволяет одному пути обработки доставки обслуживать оба транспорта; формат отчёта о доставке SMPP и PDU deliver_sm подробно задокументированы в справочнике SMPP.

Отображение полей отчёта о доставке SMPP на HTTP-DLR
Поле отчёта SMPPПоле HTTP DLRПримечание
id (отчёт)message_idСоответствует исходному submit_sm / POST
stat (DELIVRD/UNDELIV/EXPIRED/REJECTD)statusТокен соответствует каноническому перечислению
errerrorКод ошибки оператора/сети
message_state TLVstatus (числовое представление)Числовое состояние SMPP, стоящее за токеном
дата отправки / дата завершенияsubmitted_at / done_atВременные метки задержки и согласования
Часто задаваемые вопросы

Часто задаваемые вопросы

Что содержит полезная нагрузка webhook статуса доставки (DLR)?

Назначенный сервером message_id, соотносящий её с вашей отправкой, статус из канонического enum (accepted, enroute, delivered, undelivered, expired, rejected, unknown), код ошибки и человекочитаемую причину для сбоев, а также метки времени того, когда сообщение было отправлено и когда наступил терминальный статус.

Чем событие входящего (MO) отличается от DLR?

DLR — это асинхронный исход отправленного вами сообщения. Событие входящего (MO) незапрошено — это сообщение, отправленное абонентом на ваш номер, или ответ на кампанию, — несущее from, to, text, encoding и, для многочастных сообщений, поля конкатенации. Они разделяют транспорт и подпись, но имеют разные схемы, поэтому потребители сначала ветвятся по типу события.

Зачем стандартизировать enum статуса доставки?

Потому что сырые ответы операторов колоссально различаются. Отображение их на небольшой канонический enum с ясной семантикой терминальности и успеха позволяет одному потребителю единообразно обрабатывать каждого оператора и решать по одному лишь статусу, подавить ли плохого получателя, переотправить временный сбой или зафиксировать подтверждённую доставку.

Как не дать позднему «accepted» перезаписать более раннее «delivered»?

Используйте поля самоупорядочивания. Полезные нагрузки DLR несут метку времени и часто номер последовательности; потребитель сравнивает их с последним состоянием, записанным для этого message id, и отбрасывает любое событие старше того, что у него уже есть, — так промежуточное состояние вне порядка никогда не затрёт терминальное.

Как HTTP-DLR отображается на отчёт о доставке SMPP deliver_sm?

Они несут одну и ту же информацию. В SMPP отчёт о доставке — это PDU deliver_sm, помеченный в esm_class, с полями id, stat и err и TLV message_state. HTTP-DLR отображает stat на enum статуса, err на error, а метки времени отчёта на submitted_at/done_at — так один путь обработки доставки может обслуживать оба транспорта.

Какие поля позволяют собрать многочастное входящее SMS?

Поля конкатенации: референс, связывающий части вместе, индекс части и общее число. Поскольку входящие SMS подчиняются тем же правилам кодирования и сегментации, что и исходящие, длинное входящее сообщение приходит как несколько событий MO, которые потребитель сшивает по порядку с помощью этих полей.

Ссылки

Технические характеристики источника

На этой странице представлены опубликованные стандарты, на которых они основаны. (Открывается в новой вкладке)

BNПоддерживается инженерной командой BroadNet·Обмен сообщениями операторского класса с 2003 года.
Прикрепите это к проводу

Разработано с использованием реального SMPP подключения и REST API.

Запросите тестовый доступ с реальными тестовыми ключами: сначала отправьте их на свой подтвержденный номер, а затем, после утверждения вашей личности отправителя и маршрутов, переходите к использованию в производственной среде более чем в 200 странах.