Messages
Send Carousel
Send a message with a carousel of cards (header, body, footer and buttons)
POST
Send Carousel
Auth:
Error envelope:
TokenAccount or TokenInstance • Rate-limit: Global (100/min) • Idempotent: no
Description
Sends a message with a carousel of swipeable cards. Each card has aheader (required title, with optional media via imageUrl or videoUrl), body.text (required), an optional footer and a few interactive buttons. Buttons accept four types: REPLY (default, returns the ID when clicked), URL (opens a link), CALL (dials a number) and COPY (copies a code). You can add message (text before the carousel) and footer (text below). Supports delay, replyTo and replyPrivate.
Examples
Simple carousel with REPLY buttons
Two cards with text and quick-reply buttons only.Carousel with image header and URL buttons
imageUrl in the header and buttons of type URL (the id receives the URL to open).
Carousel with video header
videoUrl replaces imageUrl in the header. Use one of the two, not both.
Success response
The returnedmessageType is interactive (a carousel is a variation of WhatsApp’s interactive message), and content carries an aggregated description ("<message> - Carousel with N card(s)") used by history. The individual cards do not come back in the response, store the messageId to correlate with clicks via webhook.
200 OK
When the user taps a
REPLY button, the response arrives as a text message containing the id of the clicked button, capture that via webhook to chain the flow.Path parameters
Instance name (e.g.,
$Instance_Name).Headers
TokenAccount or TokenInstance.application/jsonRequest body
Destination: phone (
5511999999999) or JID (@s.whatsapp.net, @lid, @g.us, @newsletter).Text displayed above the carousel (optional).
Text displayed below the carousel (optional).
List of carousel cards. Minimum 1. Each card is an object with
header, body, footer and buttons (described below).Card header. Sub-fields:
title(string, required), card title.subtitle(string), optional subtitle.imageUrl(string), image URL for the header.videoUrl(string), video URL for the header. Use one of the two media options per card.
Card body. Sub-field:
text(string, required), textual content of the card.
Optional text displayed at the footer of the individual card.
List of buttons for the card. Each button has:
displayText(string, required), visible text.id(string, required), semantics vary bytype: forREPLY, it is the ID returned when clicked; forURL, the URL to open; forCALL, the number to dial; forCOPY, the code to copy.type(string),REPLY(default),URL,CALLorCOPY. Other values return400 Card N, Button M: Type must be one of: REPLY, URL, CALL, COPY.
Time in seconds to wait before sending. During the interval, the server sends the “typing…” indicator and fires “paused” before the actual send.
ID of the message to be quoted (reply). The original message must belong to the same instance and have been saved in the database.
When
true and replyTo points to a message originating from a group, the carousel is redirected to the original author’s private chat (keeping the quote).Origin identifier for traceability (e.g.,
crm, bot-suporte, n8n). Saved on the message record and propagated to webhooks.Notes
delayis in seconds (not milliseconds).- In each
header, choose a single media: eitherimageUrlorvideoUrl. Sending both can result in inconsistent rendering on the client. - Server validation: each card needs non-empty
header.titleandbody.text; each button needs non-emptydisplayTextandid. Errors are returned with the index (Card N, Button M: ...) to make debugging easier. - Older WhatsApp devices may fall back to text and display the carousel as a regular message.
- For
URLbuttons, make sure the link starts withhttps://to avoid being blocked by the client.
Errors
| HTTP | Internal status | Message |
|---|---|---|
| 400 | , | Instance name is required |
| 400 | , | Invalid request body: <detail> |
| 400 | , | Number is required |
| 400 | , | At least one card is required |
| 400 | , | Card N: Header title is required |
| 400 | , | Card N: Body text is required |
| 400 | , | Card N, Button M: Display text is required |
| 400 | , | Card N, Button M: ID is required |
| 400 | , | Card N, Button M: Type must be one of: REPLY, URL, CALL, COPY |
| 400 | invalid_number | Invalid phone number format: <detail> |
| 400 | media_download_failed | (reason for the header media download failure) |
| 404 | , | Instance not found |
| 500 | media_upload_failed | (reason for the header media upload failure) |
| 500 | send_failed | Failed to send carousel: <reason> |
| 503 | disconnected | Instance is not connected to WhatsApp |