Skip to main content

Sending cascade messages to WhatsApp

Last updated: 16 October 2026

Use the /api/cascade/schedule method to send cascade messages to the WhatsApp channel.

info

This article describes sending cascade messages by using the /api/cascade/schedule method and the whatsappContent object.

For detailed information about the /api/cascade/schedule method, see:

File IconSending messages through a cascade
info

WhatsApp
The method supports sending WhatsApp messages by phone number and user identifier — BSUID.

warning

WhatsApp
If you’ve registered two WhatsApp templates with identical content that differ only by the Track clicks on link buttons setting, we don’t recommend sending messages with this content through the API. Use your edna Pulse account to send them.

Otherwise, we can’t guarantee that link button click statistics display correctly.

Calling the method​

To send a cascade message to the WhatsApp channel using the /api/cascade/schedule method, send a POST request to https://app.edna.io/api/cascade/schedule.

tip

WhatsApp
You can test sending messages through the edna Pulse API for the WhatsApp channel without connecting the channel first.

File IconTesting WhatsApp channel API

Request examples with non-template WhatsApp messages​

info

WhatsApp documentation calls this message type free-form messages.

Message with text​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello! We are pleased to introduce you to our new customer communication channel. Here you can ask all the questions you are interested in."
}
}
}

Message with text, sent using the BSUID​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "DE.1234567890123456789",
"type": "WHATSAPP_BSUID"
},
"startTime": "2026-04-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Good afternoon! This message was sent using a new ID."
}
}
}

Message with an image​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "IMAGE",
"attachment": {
"url": "https://www.gstatic.com/webp/gallery/1.jpg",
"name": "Lorem Ipsum"
}
}
}
}

Message with a document​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "DOCUMENT",
"attachment": {
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"name": "Lorem Ipsum"
}
}
}
}

Message with a video​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "VIDEO",
"attachment": {
"url": "https://file-examples.com/wp-content/uploads/2017/04/file_example_MP4_480_1_5MG.mp4",
"name": "Lorem Ipsum"
}
}
}
}

Message with audio​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "AUDIO",
"attachment": {
"url": "https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.aac",
"name": "Lorem Ipsum"
}
}
}
}

Message with a location​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "LOCATION",
"location": {
"longitude": "33.022617",
"latitude": "34.707130",
"address": "10 Parni, Limassol, Cyprus",
"name": "Company LTD"
}
}
}
}

Message with an interactive menu​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "LIST_PICKER",
"text": "Hello! Please choose a hoodie color",
"listPicker": {
"button": "Hoodie color",
"sections": [
{
"title": "Choose a color",
"items": [
{
"identifier": "1",
"title": "Red",
"subtitle": "Red hoodie"
},
{
"identifier": "2",
"title": "Blue",
"subtitle": "Blue hoodie"
}
]
}
]
}
}
}
}

Message with response buttons​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello! Please choose a hoodie color",
"keyboard": {
"rows": [
{
"buttons": [
{
"text": "Red",
"payload": "1"
},
{
"text": "Blue",
"payload": "2"
},
{
"text": "Green",
"payload": "3"
}
]
}
]
}
}
}
}

Message with one product​

{
"requestId": "test-001",
"cascadeId": "3",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "PRODUCT",
"header": {
"text": "Footer"
},
"text": "Choose the best offer",
"catalog": {
"id": "377932094379589",
"product": {
"id": "yxtgwrkdy9"
}
}
}
}
}

Message with a group of products​

{
"requestId": "test-001",
"cascadeId": "8",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "PRODUCT_LIST",
"header": {
"text": "Footer"
},
"text": "Choose the best offer",
"catalog": {
"id": "377932094379589",
"sections": [
{
"title": "Shoes",
"products": [
{
"id": "yxtgwrkdy9"
},
{
"id": "5k0l3pwczd"
}
]
},
{
"title": "T-shirts",
"products": [
{
"id": "5k0l3pwczd"
}
]
}
]
}
}
}
}

Message with WhatsApp Flows​

{
"requestId": "test-001",
"cascadeId": "3",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "FLOW",
"caption": "Buy",
"text": "Buy discount products",
"flowId": 3779320943795899,
"action": "navigate"
}
}
}

Request examples with WhatsApp template messages​

info

WhatsApp documentation calls this message type template messages.

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Write to us to learn more about the capabilities of edna Pulse",
"footer": {
"text": "edna company"
}
}
}
}
{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Write to us to learn more about the capabilities of edna Pulse",
"header": {
"text": "Your chat with edna"
},
"footer": {
"text": "edna company"
}
}
}
}

Message with text and an image header​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Write to us to learn more about the capabilities of edna Pulse",
"header": {
"imageUrl": "https://cdn.maikoapp.com/3d4b/4qgko/200.jpg"
}
}
}
}
{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Text, image header, signature",
"header": {
"imageUrl": "https://www.gstatic.com/webp/gallery/1.jpg"
},
"footer": {
"text": "We look forward to seeing you!"
}
}
}
}

Message with text and a document header​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Write to us to learn more about the capabilities of edna Pulse",
"header": {
"documentUrl": "https://cdn.maikoapp.com/3d4b/4qgko/200.jpg"
}
}
}
}
{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Write to us to learn more about the capabilities of edna Pulse",
"header": {
"documentUrl": "https://cdn.maikoapp.com/3d4b/4qgko/200.jpg"
},
"footer": {
"text": "edna company"
}
}
}
}
{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Text, video header, signature",
"header": {
"videoUrl": "https://file-examples.com/wp-content/uploads/2017/04/file_example_MP4_480_1_5MG.mp4"
},
"footer": {
"text": "We look forward to seeing you!"
}
}
}
}

Message with text and two chat buttons​

{
"requestId": "test-001",
"cascadeId": "11",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Write to us to learn more about the capabilities of edna Pulse",
"keyboard": {
"rows": {
"buttons": [
{
"text": "Write",
"type": "QUICK_REPLY",
"payload": "1"
},
{
"text": "Later",
"type": "QUICK_REPLY",
"payload": "2"
}
]
}
}
}
}
}
{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello! Visit the edna Knowledge Base to learn more about the features of edna Pulse",
"keyboard": {
"rows": {
"buttons": [
{
"text": "Open",
"type": "URL",
"url": "https://docs-pulse.edna.io/"
}
]
}
}
}
}
}

Message with text and a call button​

{
"requestId": "test-001",
"cascadeId": "1",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Hello there! Call us to learn more about the capabilities of edna Pulse",
"keyboard": {
"rows": {
"buttons": [
{
"text": "Call",
"type": "PHONE",
"phone": "35700000000"
}
]
}
}
}
}
}

Authentication message with a one-time password copy button​

{
"requestId": "test-001",
"cascadeId": "71",
"subscriberFilter": {
"address": "35700000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "AUTHENTICATION",
"messageMatcherId": 4601,
"text": "1234"
}
}
}

whatsappContent parameters​

info

For detailed information about the common /api/cascade/schedule method parameters, see:

File IconSending messages through a cascade: General parameters
ParameterData typeRequiredDescription
contentTypestringRequiredMessage content type. Possible values are uppercase:
- TEXT — text message;
- IMAGE — image;
- DOCUMENT — document attached to a message;
- VIDEO — message containing a video;
- AUDIO — message containing audio;
- LOCATION — message with coordinates, an address, and a location description. The coordinates are converted into a Google Maps image;
- LIST_PICKER — WhatsApp interactive menu buttons;
- AUTHENTICATION — message with a one-time password and a copy button;
- FLOW — message containing WhatsApp Flows. File IconHow to use WhatsApp Flows developers.facebook.com
textstringRequired if contentType = TEXT, AUTHENTICATION, or FLOW- Message text if contentType = TEXT.
- Text of the message that contains the Flow if contentType = FLOW.
- One-time password if contentType = AUTHENTICATION.
warning
If you specify the attachment field when sending a WhatsApp message, the text field is ignored and only the attachment is sent.
File IconText formatting
flowIdintegerRequired if contentType = FLOWFlow identifier assigned in WhatsApp Manager when you create the Flow.
screenstringOptionalIdentifier of the screen that first appears in the Flow.
captionstringRequired if contentType = FLOWText of the button that starts the Flow when clicked.
actionstringOptionalFlow interaction type.
Possible values:
- navigate — the Flow doesn’t send a request to the endpoint. Default value.
- data_exchange — the Flow sends a request to the endpoint. developers.facebook.com
attachmentobjectRequiredContains attachment information.
warning
If you specify the attachment field when sending a WhatsApp message, the text field is ignored and only the attachment is sent.
File IconAttachment requirements
attachment.urlstringRequired if the attachment object isn’t emptyLink to an attachment: image, file, video, or audio.
attachment.namestringRequiredName of the image, file, video, or audio. Maximum length: 70 characters.
headerobjectRequiredMessage header. You can select one of the following header types: text, image, or document. For a text header, specify the header text; it can contain one variable. The header displays in bold before the message. For a multimedia header, you can specify a link to a document or image.
footerstringRequiredFooter. It displays below the message in a muted text color.
locationobjectRequiredContains geolocation information. You can send a message with a location only within a 24-hour conversation.
location.longitudestringRequiredCoordinates (longitude). Value range: -180 to 180.
location.latitudestringRequiredCoordinates (latitude). Value range: -90 to 90.
location.addressstringOptionalAddress on the map.
location.name stringOptionalName of the object whose address is provided.
header.textstringRequired for a text headerHeader text.
header.imageUrl stringRequired for an image headerLink to the image in the header.
header.documentUrlstringRequired for a document headerLink to the document in the header.
header.documentNamestringRequired for a document headerName of the document in the header. It displays to the message recipient.
header.videoUrlstringRequired for a video headerLink to the video in the header.
header.videoNamestringRequired for a video headerName of the video in the header. It displays to the message recipient.
buttonsobjectRequiredArray of objects, each of which defines a button.
buttons.textstringRequiredButton text. Maximum length: 20 characters.
buttons.urlstringRequired for a link buttonURL that opens when you click the button.
buttons.urlPostfixstringRequired if the template has a dynamic link or it isn’t zeroDynamic part of the button URL.
buttons.phonestringRequired for a call buttonPhone number dialed when you click the button.
buttons.payloadstringRequired for a text buttonCode or text of the quick reply button.
Maximum number of characters:
- for HSM messages — 128.
- for CHAT messages — 128.
buttons.typestringRequiredButton type:
- URL — opens the specified link;
- PHONE — dials the specified phone number;
- QUICK_REPLY — sends a prepared reply;
- OTP — copies the one-time password.
A message can contain up to three QUICK_REPLY buttons or up to one each of the URL and PHONE buttons. QUICK_REPLY buttons can’t be in the same message as other buttons.
Possible options:
- QUICK_REPLY
- QUICK_REPLY QUICK_REPLY
- QUICK_REPLY QUICK_REPLY QUICK_REPLY
- URL
- PHONE
- URL PHONE
buttons.otpTypebooleanOptionalButton type in an authentication WhatsApp message. Only for an authentication WhatsApp template message.
Possible values:
- COPY_CODE — copy the code;
- ONE_TAP — automatic fill-in button.
buttons.autofillTextstringOptionalText of the automatic fill-in button. Only for automatic fill-in buttons in an authentication WhatsApp template message. Maximum number of characters: 25.
buttons.packageNamestringOptionalAndroid application package name in an authentication WhatsApp message. Only for automatic fill-in buttons in an authentication WhatsApp template message.
listPickerobjectRequiredList item object. It contains the button parameter and the sections object, which contains section objects.
listPicker.buttonstringRequired if the listPicker object isn’t emptyName of the interactive list button.
listPicker.sections.titlestringRequired if the listPicker object isn’t emptyTitle of the section with items that displays to the user.
listPicker.sections.itemsarray of objectsOptionalList of item objects.
listPicker.sections.​items.identifierstringRequired if the listPicker object isn’t emptyItem ID unique throughout the message, which returns in the user’s response message.
listPicker.sections.​items.titlestringRequired if the listPicker object isn’t emptyItem name. Maximum length: 24 characters, including spaces.
listPicker.sections.​items.subtitlestringRequired if the listPicker object isn’t emptyItem subtitle. Maximum length: 24 characters, including spaces.
messageMatcherIdintegerRequired if contentType = AUTHENTICATIONTemplate identifier for this authentication message.
useMarketingMessagesApibooleanOptionalThe parameter defines the delivery method for a marketing message — Marketing Messages API or Cloud API.
Possible values:
- true — through Marketing Messages API;
- false — through Cloud API. File IconHow to activate Marketing Messages API for WhatsApp
messageActivitySharingbooleanOptionalThe parameter enables marketing message delivery optimization through Marketing Messages API and defines whether Meta* can analyze message data.
Possible values:
- true — optimization is enabled: Meta* can read the message and decide whether to deliver it to the recipient.
- false — optimization is disabled: Meta* can’t access the message content and doesn’t participate in the delivery decision. File IconHow to activate Marketing Messages API for WhatsApp

Text formatting​

The text formatting option for WhatsApp messages is enabled by default and can’t be disabled.

Text formattingExample
_Italic_Italic
*Bold*Bold
~Strikethrough~Strikethrough
`Monospace`Monospace

Rules for escaping quotation marks in text​

Separate the “ or ‘ quotation marks with \ in the sent message.

Example of correct formatting:

"text": "Maria! We’re expecting you at the master class \"Cooking together with Tefal\" on 01/25/2020 at 1:00 PM. Don’t miss this event! Our phone number is (22)00-00-00"

"text": "Maria! We’re expecting you at the master class “Cooking together with Tefal” on 01/25/2020 at 1:00 PM. Don’t miss this event! Our phone number is (22)00-00-00"

Example of incorrect formatting:

"text": "Maria! We’re expecting you at the master class "Cooking together with Tefal" on 01/25/2020 at 1:00 PM. Don’t miss this event! Our phone number is (22)00-00-00"

Attachment requirements​

Sent attachments should meet the following requirements:

Attachment typeSupported formatAllowed size
documentAny valid MIME type.100 MB
imageimage/jpeg, image/png.5 MB
audioaudio/aac, audio/mp4, audio/amr, audio/mpeg, audio/ogg.
Codec=opus (NWB) and ACC.
16 MB
videovideo/mp4, video/3gpp.
Only MPEG 4 and 3GPP formats with the H.264 (MPEG-4 Part 10) codec and AAC for audio are supported.
16 MB

developers.facebook.com

Response format​

{
"requestId": "string"
}

Response example​

{
"requestId": "test-001"
}

Response parameters​

ParameterData typeDescription
requestIdstringInternal identifier of an outgoing message. The customer’s external system generates it when sending the message.