Skip to main content
POST
Send Carousel
Auth: TokenAccount or TokenInstanceRate-limit: Global (100/min) • Idempotent: no

Description

Sends a message with a carousel of swipeable cards. Each card has a header (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

Two cards with text and quick-reply buttons only.
imageUrl in the header and buttons of type URL (the id receives the URL to open).
videoUrl replaces imageUrl in the header. Use one of the two, not both.

Success response

The returned messageType 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 at the webhook with message.type set to template_button_reply and the clicked button id in message.content (and also in message.interactive.selectedButtonId). Capture that via webhook to chain the flow. In carousels, message.interactive.selectedCarouselCardIndex tells which card was tapped.

Path parameters

string
required
Instance name (e.g., $Instance_Name).

Headers

string
required
TokenAccount or TokenInstance.
string
required
application/json

Request body

string
required
Destination: phone (5511999999999) or JID (@s.whatsapp.net, @lid, @g.us, @newsletter).
string
Text displayed above the carousel (optional).
Text displayed below the carousel (optional).
CarouselCard[]
required
List of carousel cards. Minimum 1. Each card is an object with header, body, footer and buttons (described below).
object
required
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.
object
required
Card body. Sub-field:
  • text (string, required), textual content of the card.
Optional text displayed at the footer of the individual card.
CarouselButton[]
List of buttons for the card. Each button has:
  • displayText (string, required), visible text.
  • id (string, required), semantics vary by type: for REPLY, it is the ID returned when clicked; for URL, the URL to open; for CALL, the number to dial; for COPY, the code to copy.
  • type (string), REPLY (default), URL, CALL or COPY. Other values return 400 Card N, Button M: Type must be one of: REPLY, URL, CALL, COPY.
int
default:"0"
Time in seconds to wait before sending. During the interval, the server sends the “typing…” indicator and fires “paused” before the actual send.
string
ID of the message to be quoted (reply). The original message must belong to the same instance and have been saved in the database.
boolean
default:"false"
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).
string
default:"api"
Origin identifier for traceability (e.g., crm, bot-suporte, n8n). Saved on the message record and propagated to webhooks.

Notes

  • delay is in seconds (not milliseconds).
  • In each header, choose a single media: either imageUrl or videoUrl. Sending both can result in inconsistent rendering on the client.
  • Server validation: each card needs non-empty header.title and body.text; each button needs non-empty displayText and id. 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 URL buttons, make sure the link starts with https:// to avoid being blocked by the client.

Errors

Error envelope: