Outbound Notifications API (WhatsApp Channel)
Outbound Notifications API
The Outbound Notifications API, a Talkdesk Digital Engagement™ solution, allows you to send notification messages at scale through multiple channels using different message types. You can proactively reach your customers by sending WhatsApp messages to multiple recipients in a single batch request.
Use Case
Send bulk notifications such as:
- Order confirmations
- Appointment reminders
- Promotional messages
Messages are sent from a WhatsApp sender you control and can:
- Target multiple recipients
- Use free-form content (within a 24-hour window)
- Use pre-approved WhatsApp templates
Access & Authentication
Supported Channels
WHATSAPP
The current request schema supports the WHATSAPP channel and allows either:
- direct content messages
- template-based messages
For contacts without a reply in the last 24 hours, only WhatsApp template messages are permitted. See this process to register templates.
The sender identifier needs to be configured as a WhatsApp touchpoint in the Channels App, following this process.
This operation is asynchronous. A successful call returns 202 Accepted with provider message identifiers and an initial delivery status.
Endpoint
POST https://api.talkdeskapp.com/outbound/notifications
| Property | Value |
|---|---|
| Method | POST |
| Path | /outbound/notifications |
| Operation ID | SendOutboundNotificationMessage |
| Tag | Outbound Messaging |
Request Body
Content-Type: application/json
Top-level Schema
| Field | Type | Required | Description |
|---|---|---|---|
channel | string | Yes | Channel used. Allowed value: WHATSAPP |
sender | string | Yes | Sender identifier applied to all messages in the request. |
messages | array | Yes | Messages to send. Minimum 1, maximum 500. |
options | object | No | Optional batch-level settings, such as grouping metadata and conversation binding. |
messages[]
| Field | Type | Required | Description |
|---|---|---|---|
destinations | array | Yes | At least one recipient |
content | object | Conditionally | Required for direct messages |
template | object | Conditionally | Required for template messages |
Each message must include exactly one of:
contenttemplate
destinations[]
| Field | Type | Required | Description |
|---|---|---|---|
to | string | Yes | Recipient destination identifier, such as a phone number. |
message_id | string | No | Optional client-provided message identifier for tracking. |
Direct Content Messages
Due to Meta restrictions, this only applies to contact numbers that have sent messages to the touchpoint sender within the last 24 hours.
When using content, the payload shape follows the WhatsApp content model.
Example
{
"content": {
"body": {
"type": "TEXT",
"text": "Hello, how can I help you?"
}
}
}Supported Direct Body Variants
| Field | Type | Required | Notes |
|---|---|---|---|
content.body.type | string | Yes | TEXT |
content.body.text | string | Depends | Required for TEXT |
Template Messages
Templates must be approved by Meta.
The sending success rate depends on the quality of the sender and the template.
Template Fields
| Field | Type | Required | Description |
|---|---|---|---|
template.name | string | Yes | Template name |
template.language | string | Yes | Language code (e.g., en) |
template.variables | object\<string,string> | No | Variables for personalization |
Available Language Codes
Here’s the available language code for the template:
| Language | Code | Language | Code |
|---|---|---|---|
| Afrikaans | af | Arabic | ar |
| Arabic (UAE) | ar_AE | Arabic (EGY) | ar_EG |
| Arabic (LBN) | ar_LB | Arabic (MAR) | ar_MA |
| Arabic (QAT) | ar_QA | Azerbaijani | az |
| Belarusian | be_BY | Bulgarian | bg |
| Bengali | bn | Bengali (IND) | bn_IN |
| Catalan | ca | Czech | cs |
| Danish | da | German | de |
| German (AUT) | de_AT | German (CHE) | de_CH |
| Greek | el | English | en |
| English (UAE) | en_AE | English (AUS) | en_AU |
| English (CAN) | en_CA | English (UK) | en_GB |
| English (GHA) | en_GH | English (IRL) | en_IE |
| English (IND) | en_IN | English (JAM) | en_JM |
| English (MYS) | en_MY | English (NZL) | en_NZ |
| English (QAT) | en_QA | English (SGP) | en_SG |
| English (UGA) | en_UG | English (US) | en_US |
| English (ZAF) | en_ZA | Spanish | es |
| Spanish (ARG) | es_AR | Spanish (CHL) | es_CL |
| Spanish (COL) | es_CO | Spanish (CRI) | es_CR |
| Spanish (DOM) | es_DO | Spanish (ECU) | es_EC |
| Spanish (SPA) | es_ES | Spanish (HND) | es_HN |
| Spanish (MEX) | es_MX | Spanish (PAN) | es_PA |
| Spanish (PER) | es_PE | Spanish (URY) | es_UY |
| Estonian | et | Persian | fa |
| Finnish | fi | Filipino | fil |
| French | fr | French (BEL) | fr_BE |
| French (CAN) | fr_CA | French (CHE) | fr_CH |
| French (CIV) | fr_CI | French (MAR) | fr_MA |
| Irish | ga | Gujarati | gu |
| Hausa | ha | Hebrew | he |
| Hindi | hi | Croatian | hr |
| Hungarian | hu | Indonesian | id |
| Italian | it | Japanese | ja |
| Georgian | ka | Kazakh | kk |
| Kannada | kn | Korean | ko |
| Kyrgyz (Kyrgyzstan) | ky_KG | Lao | lo |
| Lithuanian | lt | Latvian | lv |
| Macedonian | mk | Malayalam | ml |
| Marathi | mr | Malay | ms |
| Norwegian | nb | Dutch | nl |
| Dutch (BEL) | nl_BE | Punjabi | pa |
| Polish | pl | Dari | prs_AF |
| Pashto | ps_AF | Portuguese (BR) | pt_BR |
| Portuguese (POR) | pt_PT | Romanian | ro |
| Russian | ru | Kinyarwanda | rw_RW |
| Sinhala | si_LK | Slovak | sk |
| Slovenian | sl | Albanian | sq |
| Serbian | sr | Swedish | sv |
| Swahili | sw | Tamil | ta |
| Telugu | te | Thai | th |
| Turkish | tr | Ukrainian | uk |
| Urdu | ur | Uzbek | uz |
| Vietnamese | vi | Chinese (CHN) | zh_CN |
| Chinese (HKG) | zh_HK | Chinese (TAI) | zh_TW |
| Zulu | zu |
🌐 Template Example
{
"template": {
"name": "welcome_message",
"language": "en",
"variables": {
"1": "Talkdesk",
"2": "Support Team"
}
}
}Request Options
The optional options object applies settings to the whole request:
| Field | Type | Required | Description |
|---|---|---|---|
bulk_id | string | No | Custom bulk ID |
group_id | string | No | Logical group ID |
group_name | string | No | Group name |
group_info | object<string,string> | No | Metadata |
bind_conversation | object | No | Conversation binding |
options.bind_conversation
options.bind_conversation| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | No | Default false |
Example Request
{
"channel": "WHATSAPP",
"sender": "+123456789",
"messages": [
{
"destinations": [
{
"to": "+987654321",
"message_id": "client-msg-1"
},
{
"to": "+5551234567"
}
],
"template": {
"name": "welcome_message",
"language": "en",
"variables": {
"1": "Talkdesk",
"2": "Support Team"
}
}
}
],
"options": {
"bulk_id": "bulk-123",
"group_id": "campaign-42",
"group_name": "Spring promo",
"group_info": {
"source": "crm",
"segment": "vip"
},
"bind_conversation": {
"enabled": true
}
}
}Success Response
Status: 202 Accepted
Response Schema
| Field | Type | Required | Description |
|---|---|---|---|
bulk_id | string | Yes | Unique request ID |
messages | array | Yes | Per-destination results |
messages[]
| Field | Type | Description |
|---|---|---|
message_id | string | Unique provider message identifier. |
destination | string | Destination that the message was accepted for. |
status | string | Initial message status. Current documented value: PENDING. |
Example Response
{
"bulk_id": "0f0d3c86-2355-4409-9968-ac871cdf88d0",
"messages": [
{
"message_id": "infobip-msg-id-123",
"destination": "+987654321",
"status": "PENDING"
}
]
}Error Responses
| Status | Meaning | Example |
|---|---|---|
400 | Bad Request | {"code":"2140001","message":"Bad Request"} |
401 | Unauthorized | {"code":"2140002","message":"Unauthorized"} |
403 | Forbidden | {"code":"2140003","message":"Forbidden"} |
500 | Internal Server Error | {"code":"2140007","message":"Internal Server Error"} |
Notes
- The request is batch-oriented: One call can submit up to 500 messages.
- The response confirms acceptance, not final delivery.
- A destination can include a client-side
message_idfor correlation. - Grouping and binding are controlled via
options.
Updated about 8 hours ago