any pre-wire failure ─────────────────────▶ Failed
Status
Meaning
Terminal
Queued
Accepted, billed, waiting for a worker.
—
Dispatched
Handed to the gateway, awaiting a receipt.
—
Sent
Submitted, but no response came back. Indeterminate.
—
Delivered
It reached the handset.
✅
Undelivered
It did not, and will not — expired, deleted, unreachable.
✅
Rejected
Refused by the network or the platform.
✅
Failed
Failed before it ever went out.
✅
`Sent` is not `Delivered`, and not a failure either
Sent is reserved for one specific case: the message reached the wire but no
acknowledgement came back, so nobody knows whether it landed.
Such a message is never re-sent and never refunded — re-sending risks
delivering twice, and refunding risks giving away a message that arrived. A late
receipt resolves it.
Treat it as “in flight” in your UI, not as an error. In the reports it is
grouped with Dispatched under the sent filter for exactly this reason: from
your side, both mean gone, not yet confirmed.
# Always 200, even for a code you don't recognise.
return"", 200
Three things your endpoint must do:
Return 2xx quickly. A non-2xx is treated as a failure and logged; the
report is not queued for a later retry, so a slow or erroring endpoint loses
the notification.
Be idempotent. Key on message_id and ignore a report for a message
already in a terminal state.
Tolerate unknown status values. Codes you have not seen are
intermediate, not failures.
selectedStatus accepts all, delivered, undelivered, sent, queued,
rejected and failed. An unrecognised value shows everything rather than
nothing — so a typo produces a confusingly large result set, not an empty one.
Companion endpoints:
Endpoint
Returns
POST /ng/v1/rcs/reports/messages/kpi
Summary counts across the whole filter, not just the page.