Status details
A status says what happened to a message; a status detail says why. It is a two-level code category.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.
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: a message with
undelivered.no_viber_userkeeps its undelivered status. - 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.
Categories: undelivered — the message did not reach the recipient; rejected — it was refused before delivery because of the sender, the template or the content.
| Code | Description |
|---|---|
undelivered.no_viber_user | The number has no Viber |
undelivered.no_whatsapp_user | The number cannot receive WhatsApp: no account or an outdated app |
undelivered.blocked_by_user | The recipient has blocked the sender |
undelivered.opted_out | The recipient has opted out of marketing messages |
undelivered.marketing_limit | The messenger limited marketing messages to this recipient |
undelivered.no_suitable_device | No device of the recipient can receive the message |
undelivered.no_route | No delivery route to the number |
undelivered.provider_error | Failure on the side of the delivery channel |
rejected.spam | Blocked as spam |
rejected.blacklisted_word | The text contains a forbidden word |
rejected.sender_not_permitted | The sender is not approved or not allowed to send |
rejected.message_type_blocked | This message type is not allowed for the sender |
rejected.outside_service_window | WhatsApp: 24 hours have passed since the recipient last wrote — send a template |
rejected.template_not_found | Template not found |
rejected.template_unavailable | The template is paused or disabled |
rejected.template_parameters | The parameters do not match the template |
rejected.invalid_text | The text is empty or too long |
rejected.invalid_media | Invalid attachment: image, video, file or its caption |
rejected.invalid_button | Invalid button or button link |
rejected.invalid_carousel | Invalid carousel |
rejected.invalid_parameters | Other invalid message parameters |
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": "undelivered.no_viber_user"
}