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.
Set your endpoint once, in the portal: Settings → Webhooks → RCS. Every RCS
event for the account is posted there — delivery outcomes and replies alike.
One URL per account, and that is the only place it is set — the send endpoints
take no callback_url of their own. Leave it empty and events are still
recorded and visible in the reports, just not pushed.
raw is the provider’s original body, passed through untouched. Read it if you
need something we do not surface yet — but do not build on its shape: it belongs
to the RBM platform and changes without notice.
# Always 200, even for an event you do not recognise.
return"", 200
Three things your endpoint must do:
Return 2xx quickly. A non-2xx is retried — five attempts, a minute apart —
after which the event is abandoned and the outcome is only in the reports.
Acknowledge first, process after.
Be idempotent. Retries and repeated receipts both mean the same event can
arrive more than once. Key on message_id and ignore an outcome for a
message already in a terminal state.
Tolerate unknown event values. Ignore what you do not recognise rather
than erroring on it — an error costs you the retry budget for events you do
care about.
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.