Outbound Notifications API
Outbound Notifications API
The Outbound Notifications API, a Talkdesk Digital Engagement™ solution, allows you to send notification messages at scale through multiple channels, utilizing various message types. You can proactively reach your customers by sending messages via WhatsApp or SMS 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 or SMS sender you control and can:
- Target multiple recipients in a single request
- Use free-form content for WhatsApp (within a 24-hour reply window)
- Use pre-approved WhatsApp templates
- Send plain text for SMS
Access and Authentication
Channel Support
The API supports the following channels:
-
WhatsApp: Two message types:
- 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.
-
SMS: One message type:
- Plain text messages via the
bodyfield
- Plain text messages via the
Sender Configuration
| Channel | Sender Requirement |
|---|---|
| Must be configured as a WhatsApp touchpoint in Channels App, following this process. | |
| SMS | SMS sender identifier. Must be a valid Talkdesk touchpoint (phone number) registered with the PROACTIVE use type. |
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 |
| Authentication Scope | outbound-notifications:write |
Request Body
Content-Type: application/json
Top-level Schema
| Field | Type | Required | Description |
|---|---|---|---|
channel | string | Yes | The channel used to send the notification. Allowed values: WHATSAPP, SMS. |
sender | string | Yes | Sender identifier applied to all messages in the request. |
messages | array | Yes | Messages to send. Minimum 1, maximum 500. The message schema depends on the channel. |
options | object | No | Optional batch-level settings, such as grouping metadata and conversation binding |
messages[].destinations[] (Common)
messages[].destinations[] (Common)Each message must include a destinations array with at least one recipient. This schema is shared across all channels:
| 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 |
WhatsApp message format
When channel is WHATSAPP, each item in messages[] must include exactly one of:
content: Direct content messagetemplate: Template-based message
| Field | Type | Required | Description |
|---|---|---|---|
destinations | array | Yes | Recipient list. See destinations[] above. |
content | object | Conditionally | Required when sending a direct content message. |
template | object | Conditionally | Required when sending a template-based message. |
Direct Content Messages
Due to Meta restrictions, direct content messages only apply 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.
When using template, provide the WhatsApp template metadata:
| Field | Type | Required | Description |
|---|---|---|---|
template.name | string | Yes | Template name. |
template.language | string | Yes | Template language code (e.g., en). |
template.variables | object<string,string> | No | Optional variables keyed by numeric string (e.g., "1", "2"). |
Example:
{
"template": {
"name": "welcome_message",
"language": "en",
"variables": {
"1": "Talkdesk",
"2": "Support Team"
}
}
}Available Language Codes
| 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 |
WhatsApp 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,
"ttl_in_minutes": 1440
}
}
}SMS Message Format
When channel is SMS, each item in messages[] must include a body field with the plain text content.
| Field | Type | Required | Description |
|---|---|---|---|
destinations | array | Yes | Recipient list. See destinations[] above. |
body | string | Yes | The text content of the SMS message. Must not be empty. |
SMS does not supportcontentortemplatefields. Usebodyonly.
SMS Example Request
{
"channel": "SMS",
"sender": "+123456789",
"messages": [
{
"destinations": [
{
"to": "+987654321",
"message_id": "sms-msg-1"
}
],
"body": "Your order #12345 has been shipped. Track at: https://example.com/track/12345"
}
],
"options": {
"bulk_id": "sms-bulk-456",
"group_id": "shipping-notifications",
"group_name": "Order updates"
}
}Request Options
The optional options object applies settings to the whole request:
| Field | Type | Required | Description |
|---|---|---|---|
bulk_id | string | No | Optional bulk identifier. If omitted, the service generates a UUID. |
group_id | string | No | Optional logical group identifier. If omitted, bulk_id is used. |
group_name | string | No | Optional logical group name. |
group_info | object<string,string> | No | Optional metadata map for the group. |
bind_conversation | object | No | Optional conversation binding settings (WhatsApp only). Has no effect for SMS. |
options.bind_conversation
options.bind_conversation| Field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | No | Whether sent messages should be bound to conversations. Default: false (WhatsApp only). |
ttl_in_minutes | integer | No | Time-to-live for the conversation binding, in minutes. Valid range: 30–21600 (30 minutes to 15 days). Only applicable when enabled is true (WhatsApp only). |
Success Response
Status code: 202 Accepted
| Field | Type | Required | Description |
|---|---|---|---|
bulk_id | string | Yes | Unique bulk identifier for the accepted request. |
messages | array | Yes | Per-destination acceptance results. |
messages[] in the Response
messages[] in the Response| 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:
{
"bulk_id": "0f0d3c86-2355-4409-9968-ac871cdf88d0",
"messages": [
{
"message_id": "infobip-msg-id-123",
"destination": "+987654321",
"status": "PENDING"
}
]
}Error Responses
| Status | Meaning | Example Body |
|---|---|---|
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. - Message grouping and conversation binding are controlled at the request level via
options. - WhatsApp messages are delivered via the Infobip provider. SMS messages are delivered via the Twilio provider.
- SMS does not support template-based messages or direct content messages (
content). Use thebodyfield for SMS. - The
bind_conversationoption only applies to WhatsApp. It has no effect for SMS.
Updated 1 day ago