Send Carousel Messages
curl --request POST \
--url https://api.example.com/api/whatsapp/v1/Send \
--header 'Content-Type: application/json' \
--data '
{
"CarouselCards": [
{}
],
"CarouselCards[].MediaFilePath": "<string>"
}
'import requests
url = "https://api.example.com/api/whatsapp/v1/Send"
payload = {
"CarouselCards": [{}],
"CarouselCards[].MediaFilePath": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({CarouselCards: [{}], 'CarouselCards[].MediaFilePath': '<string>'})
};
fetch('https://api.example.com/api/whatsapp/v1/Send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));Send Messages
Send Carousel Messages
Send WhatsApp template carousels with media cards and dynamic values
Send Carousel Messages
curl --request POST \
--url https://api.example.com/api/whatsapp/v1/Send \
--header 'Content-Type: application/json' \
--data '
{
"CarouselCards": [
{}
],
"CarouselCards[].MediaFilePath": "<string>"
}
'import requests
url = "https://api.example.com/api/whatsapp/v1/Send"
payload = {
"CarouselCards": [{}],
"CarouselCards[].MediaFilePath": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({CarouselCards: [{}], 'CarouselCards[].MediaFilePath': '<string>'})
};
fetch('https://api.example.com/api/whatsapp/v1/Send', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));Carousel templates contain ordered cards. Each request must include one
CarouselCards entry for every card in the approved template, in the same order.
Card fields
object[]
required
Ordered card values. The number of entries must match the approved template.
string
required
Public image or video URL. Its media type must match the corresponding template card.
string[]
Values for placeholders in the card body, in template order.
string[]
Dynamic URL-button suffix values used by the card, in template order.
Same carousel for multiple recipients
PlaceCarouselCards inside BulkPayload to send the same card content to every recipient.
{
"SenderNumber": "15551234567",
"MetaTemplateId": "19999001",
"BulkPayload": {
"RecieverNumber": "15559876543,15557654321",
"BodyVariables": ["Summer Collection"],
"CarouselCards": [
{
"MediaFilePath": "https://cdn.example.com/summer-1.jpg",
"BodyVariables": ["20% off"],
"UrlButtonVariables": ["summer-deal-1"]
},
{
"MediaFilePath": "https://cdn.example.com/summer-2.jpg",
"BodyVariables": ["30% off"],
"UrlButtonVariables": ["summer-deal-2"]
}
]
}
}
Per-recipient carousels
PlaceCarouselCards inside each CustomPayload entry to send different cards or values to each recipient.
curl --request POST \
--url "https://app.notify.ng/api/whatsapp/v1/Send" \
--user "$CLIENT_ID:$API_KEY" \
--header "Content-Type: application/json" \
--data '{
"SenderNumber": "15551234567",
"MetaTemplateId": "19999001",
"CustomPayload": [
{
"RecieverNumber": "15559876543",
"BodyVariables": ["Summer Collection"],
"CarouselCards": [
{
"MediaFilePath": "https://cdn.example.com/summer-1.jpg",
"BodyVariables": ["20% off"]
},
{
"MediaFilePath": "https://cdn.example.com/summer-2.jpg",
"BodyVariables": ["30% off"]
}
]
},
{
"RecieverNumber": "15557654321",
"BodyVariables": ["Winter Collection"],
"CarouselCards": [
{
"MediaFilePath": "https://cdn.example.com/winter-1.jpg",
"BodyVariables": ["10% off"]
},
{
"MediaFilePath": "https://cdn.example.com/winter-2.jpg",
"BodyVariables": ["15% off"]
}
]
}
]
}'
Success response
{
"statusCode": 0,
"status": "Success",
"messages": [
{
"messageId": "11111111-2222-4333-8444-555566667777",
"receiverNumber": "15559876543"
},
{
"messageId": "88888888-9999-4aaa-8bbb-ccccddddeeee",
"receiverNumber": "15557654321"
}
]
}
Parameter mismatch
When the number of cards or card values does not match the template, the API returns HTTP400:
{
"statusCode": 1035,
"status": "Carousel card parameters are missing or do not match the template. Provide one 'CarouselCards' entry per template card, each supplying the card's media and any body/URL variables.",
"messages": null
}

