Every Direct Send validation code, the Meta restriction mapping, and the asynchronous failures that arrive by webhook.
Direct Send Errors
Summary
Every Direct Send validation code, the Meta restriction mapping, and the asynchronous failures that arrive by webhook.
Prerequisites
- A Whats91 account
- A generated public API token
Whats91 performs deterministic validation before calling Meta. Anything Whats91 can decide on its own is rejected immediately with a Whats91 error code; access, category enforcement, and restriction decisions are returned after Meta responds.
Validation Errors
| Condition | Whats91-style result | Meta-compatible result |
|---|---|---|
| Category is not utility or authentication | INVALID_DIRECT_SEND_CATEGORY | Meta-shaped code 100 |
| ttlSeconds sent without category | DIRECT_SEND_TTL_REQUIRES_CATEGORY | Meta-shaped code 100 |
| TTL outside the category bounds | INVALID_DIRECT_SEND_TTL | Meta-shaped code 100 |
| Message type not allowed for the category | DIRECT_SEND_TYPE_UNSUPPORTED | Meta-shaped code 100 |
| Body longer than 1024 characters | DIRECT_SEND_BODY_TOO_LONG | Meta-shaped code 100 |
| Business template name on authentication | DIRECT_SEND_TEMPLATE_NAME_UTILITY_ONLY | Meta-shaped code 100 |
| Business template name fails the format rules | INVALID_DIRECT_SEND_TEMPLATE_NAME | Meta-shaped code 100 |
| Direct Send fields sent to /api/v3/send | DIRECT_SEND_NOT_SUPPORTED_ON_TEMPLATE_SEND | Not applicable |
Note
directSendTemplateName sent without a category is rejected as INVALID_DIRECT_SEND_TEMPLATE_NAME, because the field only has meaning inside a utility Direct Send request.
Meta Restriction Mapping
Two Meta errors are mapped onto dedicated Whats91 codes on the chat route so integrations can react without parsing provider payloads. Meta-compatible routes keep the Meta-shaped error object instead.
| Meta code | HTTP | Whats91 error_code | Meaning |
|---|---|---|---|
| 139200 | 403 | DIRECT_SEND_RESTRICTED | Direct Send access is blocked for the WABA. Inspect Session Health and the recorded Meta restriction evidence. |
| 131064 | 429 | DIRECT_SEND_RATE_LIMITED | The WABA hit the category-misclassification rate limit. Inspect the recorded expiry before retrying. |
{
"success": false,
"message": "Direct Send is currently restricted for this WhatsApp Business Account.",
"error_code": "DIRECT_SEND_RESTRICTED",
"details": {
"restrictionType": "restricted",
"expiresAt": "2026-08-14T00:00:00.000Z",
"meta": { "code": 139200, "subcode": null, "fbtrace_id": "trace-id" }
},
"metadata": {
"apiVersion": "v3",
"requestId": "request-uid"
}
}Warning
Both restriction errors are non-retryable at the request level. Retrying immediately will fail again and can extend the restriction. Wait for the recorded expiry.
Asynchronous Failures
Some Direct Send outcomes cannot be known when the request returns. They arrive later on a failed message-status webhook.
| Meta code | Meaning and action |
|---|---|
| 132015 | The matching generated template was paused for low quality. Review the message content against Meta utility guidelines. |
| 132021 | The business template name collides with a non-Direct-Send template. Choose another name. |
| 131000 | Generic asynchronous infrastructure failure, including exhausted business-name creation retries. |
| 100 | An invalid or unsupported Direct Send parameter or limit reached Meta. |
Tip
Subscribe to message.status.failed so asynchronous Direct Send failures reach your system. A successful send response is an acceptance receipt, not a delivery guarantee.
Category Integrity
Use utility only for content Meta allows in the utility category. Meta can detect a corrected category, pause a generated template, rate-limit the WABA, or revoke Direct Send access. Whats91 surfaces that evidence through All Messages, Template Manager, Session Health, exports, and customer webhook delivery.
If you believe a Meta categorisation is wrong, collect the WABA ID plus the affected Meta template names and IDs and contact Meta Direct Send support. Never include Whats91 or Meta access tokens in a support request.