Direct Send API
You can now send business-initiated Utility messages directly through the WhatsApp Business Platform without opening a conversation with your end-users. Utility messages do not require prior template approval, enabling faster communication for transactional and account-related updates.
This feature is currently in beta and not yet publicly available to all customers. To participate in the beta program, your WhatsApp Business Account (WABA) must first be verified for eligibility by Meta. If you want to be involved in the beta testing, please ask your CM contact person to reach out to the WhatsApp product team.
This section outlines the features available to business and partner participants during the beta testing phase.
Supported Messages Type
- Text messages – Send plain text messages.
- Interactive Call-to-Action (CTA) URL button messages – Include clickable URL buttons to drive end-user actions.
- Interactive reply button messages – Add quick reply buttons for end-user responses.
How to send Direct Send Api Messages
A new category field has been introduced to specify the message category. When using Direct Send functionality, set the category parameter to utility.
{
"messages": {
"msg": [
{
"RichContent": {
"conversation": [
{
"content": "text",
"text": "MT message",
"category": "utility" //category is necessary for Direct Send API usage
}
]
},
"allowedChannels": [
"WhatsApp"
],
"body": {
"content": "text"
},
"from": "00316098765432",
"to": [
{
"number": "00316012345678"
}
]
}
]
}
}
{
"messages": {
"msg": [
{
"from": "00316098765432",
"to": [
{
"number": "00316012345678"
}
],
"body": {
"type": "auto",
"content": "This is a WhatsApp message"
},
"allowedChannels": [
"WhatsApp"
],
"richContent": {
"conversation": [
{
"category": "utility", //category is necessary for Direct Send API usage
"interactive": {
"type": "button",
"header": {
"type": "image",
"media": {
"mediaName": "CM.com - Be part of it.",
"mediaUri": "https://www.cm.com/cdn/web/blog/content/logo-cmcom.png",
"mimeType": "image/jpeg"
}
},
"body": {
"text": "your-text-body-content"
},
"footer": {
"text": "your-text-footer-content"
},
"action": {
"buttons": [
{
"type": "openurl",
"id": "unique-postback-id",
"title": "Button",
"url": "your url"
}
]
}
}
}
]
}
}
]
}
}
{
"messages": {
"msg": [
{
"from": "00316098765432",
"to": [
{
"number": "00316012345678"
}
],
"body": {
"type": "auto",
"content": "This is a WhatsApp message"
},
"validity": "2026-04-21T18:00:00.0Z",
"allowedChannels": [
"WhatsApp"
],
"richContent": {
"conversation": [
{
"category": "utility", //category is necessary for Direct Send API usage
"interactive": {
"type": "button",
"body": {
"text": "button_text"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "1",
"title": "reply button here!"
}
},
{
"type": "reply",
"reply": {
"id": "2",
"title": "reply button 2 here!"
}
}
]
}
}
}
]
}
}
]
}
}
Warning
The only way to determine a Direct Send API message is by adding the category parameter.
Time To Live (TTL) Messages
The Direct Send API Beta now supports custom message expiration times for Utility messages. Custom TTL is only available for Direct Send API with category=utility. This is the amount of time that Meta will use to deliver the message to end-users.
Allowed values:
- Minimum TTL: 30 seconds from now.
- Maximum TTL: 12 hours from now.
If not provided or left empty, it will be 30 days by default.
Error Handling for TTL
Invalid TTL Values
Minimum Value Not Met
The validity parameter requires a minimum value of 30 seconds from now. Requests with values below this threshold will be rejected by Meta.
Maximum Value Exceeded
The validity parameter accepts a maximum value of 43,200 seconds (12 hours) from now. Requests with values exceeding this limit will be rejected by Meta.
Message Expiration Behavior
When a message cannot be delivered to the recipient within the configured TTL period (either default or custom), Meta will automatically drop the message. This message will not be sent.
Important Considerations from Meta
No error or notification is generated when a message is dropped due to TTL expiration from Meta.
Messages are permanently removed from the queue once the TTL expires on Meta side.
This behavior applies to both default (30 days) and custom TTL values
Please refer to Validity Period section to see how to configure the validity parameter correctly. Validity Period.
{
"messages": {
"msg": [
{
"RichContent": {
"conversation": [
{
"content": "text",
"text": "MT message",
"category": "utility" //only for Direct Send API
}
]
},
"allowedChannels": [
"WhatsApp"
],
"body": {
"content": "text"
},
"validity": "2026-04-21T18:00:00.0Z", //validity for TTL. Current time 2026-04-21T12:00:00.0Z
"from": "00316098765432",
"to": [
{
"number": "00316012345678"
}
]
}
]
}
}
{
"messages": {
"msg": [
{
"from": "00316098765432",
"to": [
{
"number": "00316012345678"
}
],
"body": {
"type": "auto",
"content": "This is a WhatsApp message"
},
"validity": "2026-04-21T18:00:00.0Z", //validity for TTL. Current time 2026-04-21T12:00:00.0Z
"allowedChannels": [
"WhatsApp"
],
"richContent": {
"conversation": [
{
"category": "utility", //only for Direct Send API
"interactive": {
"type": "button",
"header": {
"type": "image",
"media": {
"mediaName": "CM.com - Be part of it.",
"mediaUri": "https://www.cm.com/cdn/web/blog/content/logo-cmcom.png",
"mimeType": "image/jpeg"
}
},
"body": {
"text": "your-text-body-content"
},
"footer": {
"text": "your-text-footer-content"
},
"action": {
"buttons": [
{
"type": "openurl",
"id": "unique-postback-id",
"title": "Button",
"url": "your url"
}
]
}
}
}
]
}
}
]
}
}
{
"messages": {
"msg": [
{
"from": "00316098765432",
"to": [
{
"number": "00316012345678"
}
],
"body": {
"type": "auto",
"content": "This is a WhatsApp message"
},
"validity": "2026-04-21T18:00:00.0Z", //validity for TTL. Current time 2026-04-21T12:00:00.0Z
"allowedChannels": [
"WhatsApp"
],
"richContent": {
"conversation": [
{
"category": "utility", //only for Direct Send API
"interactive": {
"type": "button",
"body": {
"text": "button_text"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "1",
"title": "reply button here!"
}
},
{
"type": "reply",
"reply": {
"id": "2",
"title": "reply button 2 here!"
}
}
]
}
}
}
]
}
}
]
}
}
Validity Example
If the current date and time is
2026-04-21T12:00:00.0Zand you want to configure a custom TTL for your Direct Send API to expire 6 hours later, the validity should be set to2026-04-21T18:00:00.0Z.
Updated 1 day ago