Skip to main content

WhatsApp Status Codes

Delivery status codes returned in the exo_status_code field of the status callback webhook.

Delivery Statuses

CodeExoDetailedStatusDescription
30001EX_MESSAGE_SENTMessage sent to the recipient
30002EX_MESSAGE_DELIVEREDMessage delivered to the recipient's device
30003EX_MESSAGE_SEENMessage read by the recipient

Error Statuses

CodeExoDetailedStatusDescription
30004EX_SYSTEM_ERRORFailed — system issue (authentication, access token, permission, or service unavailability)
30005EX_NUMBER_ERRORFailed — issue with the recipient phone number
30006EX_SETUP_ERRORFailed — account or configuration setup error
30007EX_RATE_LIMIT_HITFailed — rate limit breached
30008EX_SPAM_RATE_LIMIT_HITFailed — spam rate limit breached
30009EX_TOO_MANY_REQUESTFailed — too many requests in a short time span
30010EX_INVALID_REQUESTFailed — request is invalid
30011EX_UNKNOWN_ERRORFailed — unknown error
30012EX_INVALID_RECIPIENTFailed — recipient is invalid
30013EX_INCAPABLE_RECIPIENTFailed — recipient is unable to receive the message type
30014EX_RECIPIENT_BLOCKEDFailed — recipient is not in the allowed list
30015EX_UNSUPPORTED_MESSAGEFailed — unsupported message type in the request
30016EX_MEDIA_DOWNLOAD_ERRORFailed — WhatsApp could not download the sender's media
30017EX_MEDIA_UPLOAD_ERRORFailed — unsupported media type in the request
30018EX_REENGAGEMENT_ERRORFailed — 24-hour conversation window has expired
30019EX_INVALID_PARAMFailed — invalid parameter in the request body
30020EX_MISSING_PARAMFailed — mandatory parameter missing from the request body
30021EX_INVALID_PARAM_VALUEFailed — invalid parameter value in the request body
30022EX_TEMPLATE_ERRORFailed — template format character policy violated
30023EX_TEMPLATE_PARAM_ERRORFailed — mismatch in template parameter count
30024EX_TEMPLATE_NOT_FOUNDFailed — template does not exist
30025EX_TEMPLATE_TEXT_TOO_LONGFailed — translated text from template is too long
30026EX_INVALID_TEMPLATE_NAMESPACEFailed — invalid template namespace
30027EX_MESSAGE_PENDING_TOO_LONGFailed — message was pending for too long
30028EX_MESSAGE_EXPIREDFailed — message expired
30029EX_MESSAGE_TOO_LONGFailed — message body exceeds 4096 characters
30030EX_WEBHOOK_ERRORFailed — webhook is not configured
30031EX_SECTION_COUNT_ERRORFailed — invalid number of sections in interactive message
30032EX_ROWS_COUNT_ERRORFailed — invalid number of rows in interactive message
30033EX_PRODUCT_COUNT_ERRORFailed — invalid number of products
30034EX_CATALOGUE_NOT_FOUNDFailed — catalog ID not found
30035EX_CATALOGUE_NOT_LINKEDFailed — catalog ID not linked to the API number
30036EX_MISSING_PRODUCTFailed — product missing in the catalog
30037EX_PRODUCT_NOT_FOUNDFailed — product(s) from the request not found in catalog
30038EX_PRODUCT_COMPLIANCE_ERRORFailed — listed products failed compliance
30039EX_INVALID_HEADERFailed — invalid header structure
30040EX_MISSING_COMPLIANCEFailed — compliance information missing
30041EX_CHAR_POLICY_VIOLATIONFailed — character policy violated

HTTP Status Codes

CodeDescription
202Message accepted for delivery
400Malformed request body, or more than 100 messages in a single request
401Authentication failed — credentials missing or invalid
402Plan limit exceeded or usage limits reached
403Valid credentials but access to the resource denied
404Resource not found
5xxServer error — retry the request

Status Callback Payload

When a message reaches a terminal state, Exotel sends a POST to your status_callback URL:

{
"whatsapp": {
"messages": [
{
"callback_type": "dlr",
"sid": "2FdiiEQUosckPhpZfuVwfjxiSlc16a4",
"to": "919876543210",
"exo_status_code": 30002,
"exo_detailed_status": "EX_MESSAGE_DELIVERED",
"description": "Message delivered",
"timestamp": "2024-01-15T10:30:05.000+05:30",
"custom_data": "Order12"
}
]
}
}

Callback Fields

FieldTypeDescription
callback_typeStringType of callback: dlr (delivery report) or icm (incoming message)
sidStringUnique identifier of the message
toStringRecipient phone number
exo_status_codeIntegerExotel status code (see tables above)
exo_detailed_statusStringDetailed status string corresponding to the code
descriptionStringHuman-readable description of the status
timestampStringISO 8601 timestamp of when the event occurred
custom_dataStringCustom data passed in the original API request (if any)
note

status_callback can be set per-message in the API request, or configured as a default during onboarding. If both are set, the per-message URL takes precedence. A callback can only be delivered to one URL at a time.