curl --request POST \
--url https://api.zapfy.io/v1/messages/send-carousel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to": "5511999998888",
"cards": [
{
"header": {
"title": "Deal of the day",
"subtitle": "Today only",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": {
"text": "Card 1 — special offer"
},
"footer": "Limited time",
"buttons": [
{
"displayText": "Learn more",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Check our news!",
"footer": "Zapfy",
"delay": 123
}
'import requests
url = "https://api.zapfy.io/v1/messages/send-carousel"
payload = {
"to": "5511999998888",
"cards": [
{
"header": {
"title": "Deal of the day",
"subtitle": "Today only",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": { "text": "Card 1 — special offer" },
"footer": "Limited time",
"buttons": [
{
"displayText": "Learn more",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Check our news!",
"footer": "Zapfy",
"delay": 123
}
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({
to: '5511999998888',
cards: [
{
header: {
title: 'Deal of the day',
subtitle: 'Today only',
imageUrl: 'https://example.com/card1.jpg',
videoUrl: 'https://example.com/card1.mp4'
},
body: JSON.stringify({text: 'Card 1 — special offer'}),
footer: 'Limited time',
buttons: [{displayText: 'Learn more', id: 'card1_info', copyCode: 'PROMO2026'}]
}
],
body: JSON.stringify('Check our news!'),
footer: 'Zapfy',
delay: 123
})
};
fetch('https://api.zapfy.io/v1/messages/send-carousel', 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://api.zapfy.io/v1/messages/send-carousel",
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([
'to' => '5511999998888',
'cards' => [
[
'header' => [
'title' => 'Deal of the day',
'subtitle' => 'Today only',
'imageUrl' => 'https://example.com/card1.jpg',
'videoUrl' => 'https://example.com/card1.mp4'
],
'body' => [
'text' => 'Card 1 — special offer'
],
'footer' => 'Limited time',
'buttons' => [
[
'displayText' => 'Learn more',
'id' => 'card1_info',
'copyCode' => 'PROMO2026'
]
]
]
],
'body' => 'Check our news!',
'footer' => 'Zapfy',
'delay' => 123
]),
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://api.zapfy.io/v1/messages/send-carousel"
payload := strings.NewReader("{\n \"to\": \"5511999998888\",\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Deal of the day\",\n \"subtitle\": \"Today only\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — special offer\"\n },\n \"footer\": \"Limited time\",\n \"buttons\": [\n {\n \"displayText\": \"Learn more\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Check our news!\",\n \"footer\": \"Zapfy\",\n \"delay\": 123\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://api.zapfy.io/v1/messages/send-carousel")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"5511999998888\",\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Deal of the day\",\n \"subtitle\": \"Today only\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — special offer\"\n },\n \"footer\": \"Limited time\",\n \"buttons\": [\n {\n \"displayText\": \"Learn more\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Check our news!\",\n \"footer\": \"Zapfy\",\n \"delay\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zapfy.io/v1/messages/send-carousel")
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 \"to\": \"5511999998888\",\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Deal of the day\",\n \"subtitle\": \"Today only\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — special offer\"\n },\n \"footer\": \"Limited time\",\n \"buttons\": [\n {\n \"displayText\": \"Learn more\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Check our news!\",\n \"footer\": \"Zapfy\",\n \"delay\": 123\n}"
response = http.request(request)
puts response.read_body{
"data": {
"messageId": "3EB0C767D4..."
}
}{
"error": "Instance not found"
}{
"error": "Instance not found"
}{
"error": "Instance not found"
}{
"error": "Instance not found"
}Send carousel
Sends a carousel of swipeable cards, each with its own image or video, body text and buttons. Returns { messageId }.
curl --request POST \
--url https://api.zapfy.io/v1/messages/send-carousel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"to": "5511999998888",
"cards": [
{
"header": {
"title": "Deal of the day",
"subtitle": "Today only",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": {
"text": "Card 1 — special offer"
},
"footer": "Limited time",
"buttons": [
{
"displayText": "Learn more",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Check our news!",
"footer": "Zapfy",
"delay": 123
}
'import requests
url = "https://api.zapfy.io/v1/messages/send-carousel"
payload = {
"to": "5511999998888",
"cards": [
{
"header": {
"title": "Deal of the day",
"subtitle": "Today only",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": { "text": "Card 1 — special offer" },
"footer": "Limited time",
"buttons": [
{
"displayText": "Learn more",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Check our news!",
"footer": "Zapfy",
"delay": 123
}
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({
to: '5511999998888',
cards: [
{
header: {
title: 'Deal of the day',
subtitle: 'Today only',
imageUrl: 'https://example.com/card1.jpg',
videoUrl: 'https://example.com/card1.mp4'
},
body: JSON.stringify({text: 'Card 1 — special offer'}),
footer: 'Limited time',
buttons: [{displayText: 'Learn more', id: 'card1_info', copyCode: 'PROMO2026'}]
}
],
body: JSON.stringify('Check our news!'),
footer: 'Zapfy',
delay: 123
})
};
fetch('https://api.zapfy.io/v1/messages/send-carousel', 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://api.zapfy.io/v1/messages/send-carousel",
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([
'to' => '5511999998888',
'cards' => [
[
'header' => [
'title' => 'Deal of the day',
'subtitle' => 'Today only',
'imageUrl' => 'https://example.com/card1.jpg',
'videoUrl' => 'https://example.com/card1.mp4'
],
'body' => [
'text' => 'Card 1 — special offer'
],
'footer' => 'Limited time',
'buttons' => [
[
'displayText' => 'Learn more',
'id' => 'card1_info',
'copyCode' => 'PROMO2026'
]
]
]
],
'body' => 'Check our news!',
'footer' => 'Zapfy',
'delay' => 123
]),
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://api.zapfy.io/v1/messages/send-carousel"
payload := strings.NewReader("{\n \"to\": \"5511999998888\",\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Deal of the day\",\n \"subtitle\": \"Today only\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — special offer\"\n },\n \"footer\": \"Limited time\",\n \"buttons\": [\n {\n \"displayText\": \"Learn more\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Check our news!\",\n \"footer\": \"Zapfy\",\n \"delay\": 123\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://api.zapfy.io/v1/messages/send-carousel")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"5511999998888\",\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Deal of the day\",\n \"subtitle\": \"Today only\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — special offer\"\n },\n \"footer\": \"Limited time\",\n \"buttons\": [\n {\n \"displayText\": \"Learn more\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Check our news!\",\n \"footer\": \"Zapfy\",\n \"delay\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zapfy.io/v1/messages/send-carousel")
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 \"to\": \"5511999998888\",\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Deal of the day\",\n \"subtitle\": \"Today only\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — special offer\"\n },\n \"footer\": \"Limited time\",\n \"buttons\": [\n {\n \"displayText\": \"Learn more\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Check our news!\",\n \"footer\": \"Zapfy\",\n \"delay\": 123\n}"
response = http.request(request)
puts response.read_body{
"data": {
"messageId": "3EB0C767D4..."
}
}{
"error": "Instance not found"
}{
"error": "Instance not found"
}{
"error": "Instance not found"
}{
"error": "Instance not found"
}Authorizations
Instance token (zpfy_inst_...) — sends messages.
Body
Message recipient: phone in E.164 (e.g. 5511999998888) or a group id.
"5511999998888"
Cards displayed in order. At least one card is required.
1Show child attributes
Show child attributes
Optional message body shown above the cards.
"Check our news!"
Optional message footer shown below the cards.
"Zapfy"
Optional delay in milliseconds before sending; WhatsApp shows "typing…" during this interval.
Quotes (replies to) a previous message.
Show child attributes
Show child attributes
Response
Message accepted by WhatsApp.
Identifier of the sent message. Store the messageId: together with the same to you sent to, it is what /messages/delete and /messages/edit need.
Show child attributes
Show child attributes