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": "Oferta do dia",
"subtitle": "Somente hoje",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": {
"text": "Card 1 — oferta especial"
},
"footer": "Por tempo limitado",
"buttons": [
{
"displayText": "Quero saber mais",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Confira nossas novidades!",
"footer": "Zapfy",
"delay": 123
}
'import requests
url = "https://api.zapfy.io/v1/messages/send-carousel"
payload = {
"to": "5511999998888",
"cards": [
{
"header": {
"title": "Oferta do dia",
"subtitle": "Somente hoje",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": { "text": "Card 1 — oferta especial" },
"footer": "Por tempo limitado",
"buttons": [
{
"displayText": "Quero saber mais",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Confira nossas novidades!",
"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: 'Oferta do dia',
subtitle: 'Somente hoje',
imageUrl: 'https://example.com/card1.jpg',
videoUrl: 'https://example.com/card1.mp4'
},
body: JSON.stringify({text: 'Card 1 — oferta especial'}),
footer: 'Por tempo limitado',
buttons: [{displayText: 'Quero saber mais', id: 'card1_info', copyCode: 'PROMO2026'}]
}
],
body: JSON.stringify('Confira nossas novidades!'),
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' => 'Oferta do dia',
'subtitle' => 'Somente hoje',
'imageUrl' => 'https://example.com/card1.jpg',
'videoUrl' => 'https://example.com/card1.mp4'
],
'body' => [
'text' => 'Card 1 — oferta especial'
],
'footer' => 'Por tempo limitado',
'buttons' => [
[
'displayText' => 'Quero saber mais',
'id' => 'card1_info',
'copyCode' => 'PROMO2026'
]
]
]
],
'body' => 'Confira nossas novidades!',
'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\": \"Oferta do dia\",\n \"subtitle\": \"Somente hoje\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — oferta especial\"\n },\n \"footer\": \"Por tempo limitado\",\n \"buttons\": [\n {\n \"displayText\": \"Quero saber mais\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Confira nossas novidades!\",\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\": \"Oferta do dia\",\n \"subtitle\": \"Somente hoje\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — oferta especial\"\n },\n \"footer\": \"Por tempo limitado\",\n \"buttons\": [\n {\n \"displayText\": \"Quero saber mais\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Confira nossas novidades!\",\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\": \"Oferta do dia\",\n \"subtitle\": \"Somente hoje\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — oferta especial\"\n },\n \"footer\": \"Por tempo limitado\",\n \"buttons\": [\n {\n \"displayText\": \"Quero saber mais\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Confira nossas novidades!\",\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"
}Enviar carrossel
Envia um carrossel de cards deslizáveis, cada um com sua própria imagem ou vídeo, texto e botões. Retorna { 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": "Oferta do dia",
"subtitle": "Somente hoje",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": {
"text": "Card 1 — oferta especial"
},
"footer": "Por tempo limitado",
"buttons": [
{
"displayText": "Quero saber mais",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Confira nossas novidades!",
"footer": "Zapfy",
"delay": 123
}
'import requests
url = "https://api.zapfy.io/v1/messages/send-carousel"
payload = {
"to": "5511999998888",
"cards": [
{
"header": {
"title": "Oferta do dia",
"subtitle": "Somente hoje",
"imageUrl": "https://example.com/card1.jpg",
"videoUrl": "https://example.com/card1.mp4"
},
"body": { "text": "Card 1 — oferta especial" },
"footer": "Por tempo limitado",
"buttons": [
{
"displayText": "Quero saber mais",
"id": "card1_info",
"copyCode": "PROMO2026"
}
]
}
],
"body": "Confira nossas novidades!",
"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: 'Oferta do dia',
subtitle: 'Somente hoje',
imageUrl: 'https://example.com/card1.jpg',
videoUrl: 'https://example.com/card1.mp4'
},
body: JSON.stringify({text: 'Card 1 — oferta especial'}),
footer: 'Por tempo limitado',
buttons: [{displayText: 'Quero saber mais', id: 'card1_info', copyCode: 'PROMO2026'}]
}
],
body: JSON.stringify('Confira nossas novidades!'),
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' => 'Oferta do dia',
'subtitle' => 'Somente hoje',
'imageUrl' => 'https://example.com/card1.jpg',
'videoUrl' => 'https://example.com/card1.mp4'
],
'body' => [
'text' => 'Card 1 — oferta especial'
],
'footer' => 'Por tempo limitado',
'buttons' => [
[
'displayText' => 'Quero saber mais',
'id' => 'card1_info',
'copyCode' => 'PROMO2026'
]
]
]
],
'body' => 'Confira nossas novidades!',
'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\": \"Oferta do dia\",\n \"subtitle\": \"Somente hoje\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — oferta especial\"\n },\n \"footer\": \"Por tempo limitado\",\n \"buttons\": [\n {\n \"displayText\": \"Quero saber mais\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Confira nossas novidades!\",\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\": \"Oferta do dia\",\n \"subtitle\": \"Somente hoje\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — oferta especial\"\n },\n \"footer\": \"Por tempo limitado\",\n \"buttons\": [\n {\n \"displayText\": \"Quero saber mais\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Confira nossas novidades!\",\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\": \"Oferta do dia\",\n \"subtitle\": \"Somente hoje\",\n \"imageUrl\": \"https://example.com/card1.jpg\",\n \"videoUrl\": \"https://example.com/card1.mp4\"\n },\n \"body\": {\n \"text\": \"Card 1 — oferta especial\"\n },\n \"footer\": \"Por tempo limitado\",\n \"buttons\": [\n {\n \"displayText\": \"Quero saber mais\",\n \"id\": \"card1_info\",\n \"copyCode\": \"PROMO2026\"\n }\n ]\n }\n ],\n \"body\": \"Confira nossas novidades!\",\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"
}Autorizações
Token de instância (zpfy_inst_...) — envia mensagens.
Corpo
Destinatário da mensagem: telefone em E.164 (ex.: 5511999998888) ou id de grupo.
"5511999998888"
Cards exibidos em ordem. É obrigatório pelo menos um card.
1Show child attributes
Show child attributes
Corpo opcional da mensagem exibido acima dos cards.
"Confira nossas novidades!"
Rodapé opcional da mensagem exibido abaixo dos cards.
"Zapfy"
Atraso opcional em milissegundos antes do envio; o WhatsApp mostra "digitando…" nesse intervalo.
Cita (responde) uma mensagem anterior.
Show child attributes
Show child attributes
Resposta
Mensagem aceita pelo WhatsApp.
Identificador da mensagem enviada. Guarde o messageId: com o mesmo to do envio, é o que /messages/delete e /messages/edit pedem.
Show child attributes
Show child attributes