Transactional WhatsApp
curl --request POST \
--url https://webhook.cocoonmail.com/webhook/whatsapp_message/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_number": "<string>",
"type": "template",
"content": {
"template_name": "<string>",
"template_language": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
}
]
}
'import requests
url = "https://webhook.cocoonmail.com/webhook/whatsapp_message/send"
payload = {
"from_number": "<string>",
"type": "template",
"content": {
"template_name": "<string>",
"template_language": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
from_number: '<string>',
type: 'template',
content: {template_name: '<string>', template_language: '<string>'},
recipient: [{whatsapp_number: '<string>', first_name: '<string>', email: '<string>'}]
})
};
fetch('https://webhook.cocoonmail.com/webhook/whatsapp_message/send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://webhook.cocoonmail.com/webhook/whatsapp_message/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from_number' => '<string>',
'type' => 'template',
'content' => [
'template_name' => '<string>',
'template_language' => '<string>'
],
'recipient' => [
[
'whatsapp_number' => '<string>',
'first_name' => '<string>',
'email' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://webhook.cocoonmail.com/webhook/whatsapp_message/send"
payload := strings.NewReader("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://webhook.cocoonmail.com/webhook/whatsapp_message/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://webhook.cocoonmail.com/webhook/whatsapp_message/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyusing RestSharp;
var options = new RestClientOptions("https://webhook.cocoonmail.com/webhook/whatsapp_message/send");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);using RestSharp;
var options = new RestClientOptions("https://webhook.cocoonmail.com/webhook/whatsapp_message/send");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);{
"success": true,
"failed_recipients": [],
"report": [
{
"to": "whatsapp_number",
"message_id": "message_id"
}
],
"quotas": {
"MAX_WHATSAPP_SEND_PER_MONTH": {
"limit": "usage",
"usage": "usage"
}
},
"message": "Transactional WhatsApp messages sent successfully."
}
{
"success": false,
"message": "Bad request"
}
Whatsapp
Send message
Send transactional WhatsApp messages using templates.
POST
/
webhook
/
whatsapp_message
/
send
Transactional WhatsApp
curl --request POST \
--url https://webhook.cocoonmail.com/webhook/whatsapp_message/send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from_number": "<string>",
"type": "template",
"content": {
"template_name": "<string>",
"template_language": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
}
]
}
'import requests
url = "https://webhook.cocoonmail.com/webhook/whatsapp_message/send"
payload = {
"from_number": "<string>",
"type": "template",
"content": {
"template_name": "<string>",
"template_language": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
from_number: '<string>',
type: 'template',
content: {template_name: '<string>', template_language: '<string>'},
recipient: [{whatsapp_number: '<string>', first_name: '<string>', email: '<string>'}]
})
};
fetch('https://webhook.cocoonmail.com/webhook/whatsapp_message/send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://webhook.cocoonmail.com/webhook/whatsapp_message/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from_number' => '<string>',
'type' => 'template',
'content' => [
'template_name' => '<string>',
'template_language' => '<string>'
],
'recipient' => [
[
'whatsapp_number' => '<string>',
'first_name' => '<string>',
'email' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://webhook.cocoonmail.com/webhook/whatsapp_message/send"
payload := strings.NewReader("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://webhook.cocoonmail.com/webhook/whatsapp_message/send")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://webhook.cocoonmail.com/webhook/whatsapp_message/send")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyusing RestSharp;
var options = new RestClientOptions("https://webhook.cocoonmail.com/webhook/whatsapp_message/send");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);using RestSharp;
var options = new RestClientOptions("https://webhook.cocoonmail.com/webhook/whatsapp_message/send");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"from_number\": \"<string>\",\n \"type\": \"template\",\n \"content\": {\n \"template_name\": \"<string>\",\n \"template_language\": \"<string>\"\n },\n \"recipient\": [\n {\n \"whatsapp_number\": \"<string>\",\n \"first_name\": \"<string>\",\n \"email\": \"<string>\"\n }\n ]\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);{
"success": true,
"failed_recipients": [],
"report": [
{
"to": "whatsapp_number",
"message_id": "message_id"
}
],
"quotas": {
"MAX_WHATSAPP_SEND_PER_MONTH": {
"limit": "usage",
"usage": "usage"
}
},
"message": "Transactional WhatsApp messages sent successfully."
}
{
"success": false,
"message": "Bad request"
}
Send WhatsApp messages to one or more recipients using pre-approved templates. This endpoint supports personalization through
parameterized_variables and event data.
Request Body
The request body must include the sender’s phone number, template details, and recipient information.force_send: (Optional) A boolean flag to force send the WhatsApp message, bypassing duplicate message detection or sending limits (default isfalse).parameterized_variables: An object containing key-value pairs used to replace dynamic variables or merge tags within the WhatsApp message body or template.event: (Optional) Event-related data for tracking or triggering specific workflows.
Example Payloads
- Template Message
- Template media
- Media
- Text Message
- OTP
Send a message using a pre-approved WhatsApp template with custom parameters and event data.
{
"from_number": "<string>",
"type": "template",
"content": {
"template_name": "<string>",
"template_language": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
},
{
"whatsapp_number": "<string>",
"name": "<string>",
"email": "<string>"
}
],
"add_recipient_to_contacts": true,
"force_send": false,
"parameterized_variables": {
"organization.company_name": "<string>",
"organization.business_type": "<string>",
"organization_address.street": "<string>",
"organization_social.instagram": "<string>"
},
"event": {
"code": "START",
"name": "start",
"data": {
"date_time": "2026-01-27T01:30:21.311Z",
"event_name": "24hr marathon run",
"bib_number": "101",
"start_time": "2026-01-15T01:30:03.588Z"
}
},
"tags": ["tag1"]
}
Send an image file with an optional caption using pre-approved template media.
{
"from_number": "<string>",
"type": "template",
"content": {
"template_name": "<string>",
"template_language": "<string>"
},
"parameterized_media": {
"type": "document",
"link": "https://pix8.agoda.net/hotelImages/{{contact.image_path}}"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
},
{
"whatsapp_number": "<string>",
"name": "<string>",
"email": "<string>"
}
],
"force_send": false,
"tags": ["tag1"]
}
Send a media file (document, video, or image) with an optional caption.Note: The
{
"from_number": "<string>",
"type": "document",
"content": {
"media_url": "https://example.com/media.file",
"caption": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
},
{
"whatsapp_number": "<string>",
"name": "<string>",
"email": "<string>",
}
],
"force_send": false,
"tags": ["tag1"]
}
type field can be set to document, video, or image depending on the media being sent.Send a simple text message to recipients.
{
"from_number": "<string>",
"type": "text",
"content": {
"body": "<string>"
},
"recipient": [
{
"whatsapp_number": "<string>",
"first_name": "<string>",
"email": "<string>"
}
],
"add_recipient_to_contacts": true,
"force_send": false,
"parameterized_variables": {
"organization.company_name": "John Doe"
},
"tags": ["tag1"]
}
Send a verification OTP to recipients via a pre-approved WhatsApp template.
{
"from_number": "+91 81399 99903",
"type": "template",
"content": {
"template_name": "lecturer_registration_otp_v1",
"template_language": "en"
},
"recipient": [
{
"whatsapp_number": "+917021883216",
"first_name": "John",
"email": "john@example.com"
}
],
"force_send": true,
"parameterized_variables": {
"otp": "123445"
}
}
{
"success": true,
"failed_recipients": [],
"report": [
{
"to": "whatsapp_number",
"message_id": "message_id"
}
],
"quotas": {
"MAX_WHATSAPP_SEND_PER_MONTH": {
"limit": "usage",
"usage": "usage"
}
},
"message": "Transactional WhatsApp messages sent successfully."
}
{
"success": false,
"message": "Bad request"
}
Authorizations
Use your API key with the 'Bearer ' prefix
Body
application/json
- Template Message
- Template media
- Media
- Text Message
- OTP
Send a message using a pre-approved WhatsApp template
Available options:
template Show child attributes
Show child attributes
Show child attributes
Show child attributes
Add recipient to contacts
Force send message bypassing any limits or duplicate checks
An object containing key-value pairs used to replace dynamic variables or merge tags within the WhatsApp message body or template.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Array of strings to tag the message with.
Response
WhatsApp message(s) sent successfully.
⌘I