Status details
A status says what happened to a message; a status detail says why. It is a two-level code source.reason returned next to the status:
status_detailfield — JSON status and webhook;status_detailattribute — XML status;status_detail:line — HTTP status;status_detailparameter — delivery report.
The first level names where the reason is, not the status: recipient — the recipient's side, sender — the sender, template — the template, content — the message content, policy — the messenger's rules, channel — the delivery channel. So REJECTED with recipient.no_viber_user reads as "rejected because the recipient has no Viber".
Rules:
- The detail is present only when the reason is known. Otherwise there is no such field, and the response is exactly as before.
- The status itself does not change: the detail is added next to the status the message already has.
- A detail belongs to the channel the message is on. If an undelivered Viber message is resent by SMS, the Viber reason no longer applies and the detail disappears.
- New codes are added over time, existing ones are never renamed. Treat an unknown code as "no detail" and keep processing the status.
| Code | Description |
|---|---|
recipient.no_viber_user | The number has no Viber |
recipient.no_whatsapp_user | The number cannot receive WhatsApp: no account or an outdated app |
recipient.blocked_sender | The recipient has blocked the sender |
recipient.opted_out | The recipient has opted out of marketing messages |
recipient.no_suitable_device | No device of the recipient can receive the message |
policy.marketing_limit | The messenger limited marketing messages to this recipient |
policy.outside_service_window | WhatsApp: 24 hours have passed since the recipient last wrote — send a template |
sender.not_permitted | The sender is not approved or not allowed to send |
sender.message_type_not_allowed | This message type is not allowed for the sender |
template.not_found | Template not found |
template.unavailable | The template is paused or disabled |
template.parameters_mismatch | The parameters do not match the template |
content.spam | Blocked as spam |
content.blacklisted_word | The text contains a forbidden word |
content.invalid_text | The text is empty or too long |
content.invalid_media | Invalid attachment: image, video, file or its caption |
content.invalid_button | Invalid button or button link |
content.invalid_carousel | Invalid carousel |
content.invalid_parameters | Other invalid message parameters |
channel.no_route | No delivery route to the number |
channel.provider_error | Failure on the side of the delivery channel |
Example — JSON status of a Viber message that was not delivered because the number has no Viber:
{
"msg_id": 123456789,
"type": "viber",
"status": "REJECTED",
"success": false,
"updated": "2026-10-20T12:34:00+03:00",
"status_detail": "recipient.no_viber_user"
}