Pular para o conteúdo principal
POST
/
api
/
message
/
carousel
/
:instance
Enviar Carrossel
curl --request POST \
  --url https://api.example.com/api/message/carousel/:instance \
  --header 'Content-Type: <content-type>' \
  --header 'token: <token>' \
  --data '
{
  "number": "<string>",
  "message": "<string>",
  "footer": "<string>",
  "cards": [
    {}
  ],
  "cards[].header": {},
  "cards[].body": {},
  "cards[].footer": "<string>",
  "cards[].buttons": [
    {}
  ],
  "delay": 123,
  "replyTo": "<string>",
  "replyPrivate": true,
  "source": "<string>"
}
'

Documentation Index

Fetch the complete documentation index at: https://docs.ryzeapi.cloud/llms.txt

Use this file to discover all available pages before exploring further.

Auth: TokenAccount ou TokenInstanceRate-limit: Global (100/min) • Idempotente: não

Descrição

Envia uma mensagem com carrossel de cards deslizáveis. Cada card tem header (título obrigatório, com mídia opcional via imageUrl ou videoUrl), body.text (obrigatório), footer opcional e até alguns botões interativos. Os botões aceitam quatro tipos: REPLY (padrão, retorna o ID quando clicado), URL (abre link), CALL (disca número) e COPY (copia código). É possível adicionar message (texto antes do carrossel) e footer (texto abaixo). Suporta delay, replyTo e replyPrivate.

Exemplos

Carrossel simples com botões REPLY

Dois cards apenas com texto e botões de resposta rápida.
curl -X POST "https://ryzeapi.cloud/api/message/carousel/$Instance_Name" \
  -H "token: $Token_Instance" \
  -H "Content-Type: application/json" \
  -d '{
    "number":  "5511999999999",
    "message": "Escolha um dos planos abaixo:",
    "footer":  "Promoção válida até o fim do mês.",
    "cards": [
      {
        "header": { "title": "Plano Básico" },
        "body":   { "text": "5 instâncias, suporte por e-mail." },
        "footer": "R$ 49/mês",
        "buttons": [
          { "displayText": "Quero o Básico", "id": "plan_basic", "type": "REPLY" }
        ]
      },
      {
        "header": { "title": "Plano Pro" },
        "body":   { "text": "20 instâncias, suporte prioritário, webhooks." },
        "footer": "R$ 149/mês",
        "buttons": [
          { "displayText": "Quero o Pro", "id": "plan_pro", "type": "REPLY" }
        ]
      }
    ]
  }'

Carrossel com header de imagem e botões URL

imageUrl no header e botões do tipo URL (o id recebe a URL a abrir).
curl -X POST "https://ryzeapi.cloud/api/message/carousel/$Instance_Name" \
  -H "token: $Token_Instance" \
  -H "Content-Type: application/json" \
  -d '{
    "number":  "5511999999999",
    "message": "Conheça nossos produtos:",
    "cards": [
      {
        "header": {
          "title":    "Tênis Runner X",
          "subtitle": "Edição limitada",
          "imageUrl": "https://exemplo.com/img/runner-x.jpg"
        },
        "body":   { "text": "Amortecimento de alta performance, ideal para corridas longas." },
        "buttons": [
          { "displayText": "Ver detalhes", "id": "https://loja.exemplo.com/runner-x", "type": "URL" },
          { "displayText": "Falar com vendedor", "id": "talk_seller_runner", "type": "REPLY" }
        ]
      }
    ]
  }'

Carrossel com header de vídeo

videoUrl substitui imageUrl no header. Use um dos dois, não os dois.
curl -X POST "https://ryzeapi.cloud/api/message/carousel/$Instance_Name" \
  -H "token: $Token_Instance" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "5511999999999",
    "cards": [
      {
        "header": {
          "title":    "Tutorial: como ativar",
          "videoUrl": "https://exemplo.com/videos/onboarding.mp4"
        },
        "body":   { "text": "Veja em 30 segundos como configurar sua primeira instância." },
        "buttons": [
          { "displayText": "Começar agora", "id": "start_onboarding", "type": "REPLY" },
          { "displayText": "Ligar para suporte", "id": "+551130000000", "type": "CALL" },
          { "displayText": "Copiar cupom", "id": "RYZE10", "type": "COPY" }
        ]
      }
    ]
  }'

Resposta de sucesso

O messageType retornado é interactive (carrossel é uma variação de mensagem interativa do WhatsApp), e o content traz uma descrição agregada ("<message> - Carousel with N card(s)") usada pelo histórico. Os cards individuais não vêm na resposta, guarde o messageId para correlacionar com cliques via webhook.
200 OK
{
  "success": true,
  "message": "Carousel sent successfully",
  "status":  "sent",
  "data": {
    "messageId":   "3EB08FCF27E532F1E4E4",
    "direction":   "sent",
    "messageType": "interactive",
    "content":     "Escolha um dos planos abaixo: - Carousel with 3 card(s)",
    "source":      "api",
    "timestamp":   "2026-04-30T14:30:00Z",
    "chat": {
      "jid":     "5511999999999@s.whatsapp.net",
      "isGroup": false
    },
    "sender": {
      "jid":      "5511777777777@s.whatsapp.net",
      "instance": "minha-instancia"
    }
  }
}
Quando o usuário toca em um botão REPLY, a resposta chega como mensagem de texto contendo o id do botão clicado, capture isso pelo webhook para encadear o fluxo.

Parâmetros de rota

instance
string
obrigatório
Nome da instância (ex.: $Instance_Name).

Headers

token
string
obrigatório
TokenAccount ou TokenInstance.
Content-Type
string
obrigatório
application/json

Request body

number
string
obrigatório
Destino: telefone (5511999999999) ou JID (@s.whatsapp.net, @lid, @g.us, @newsletter).
message
string
Texto exibido acima do carrossel (opcional).
Texto exibido abaixo do carrossel (opcional).
cards
CarouselCard[]
obrigatório
Lista de cards do carrossel. Mínimo 1. Cada card é um objeto com header, body, footer e buttons (descritos abaixo).
cards[].header
object
obrigatório
Header do card. Sub-campos:
  • title (string, obrigatório), título do card.
  • subtitle (string), subtítulo opcional.
  • imageUrl (string), URL de imagem para o header.
  • videoUrl (string), URL de vídeo para o header. Use uma das duas mídias por card.
cards[].body
object
obrigatório
Corpo do card. Sub-campo:
  • text (string, obrigatório), conteúdo textual do card.
Texto opcional exibido no rodapé do card individual.
cards[].buttons
CarouselButton[]
Lista de botões do card. Cada botão tem:
  • displayText (string, obrigatório), texto visível.
  • id (string, obrigatório), semântica varia conforme type: para REPLY, é o ID retornado quando clicado; para URL, a URL a abrir; para CALL, o número a discar; para COPY, o código a copiar.
  • type (string), REPLY (padrão), URL, CALL ou COPY. Valores diferentes retornam 400 Card N, Button M: Type must be one of: REPLY, URL, CALL, COPY.
delay
int
padrão:"0"
Tempo em segundos para aguardar antes de enviar. Durante o intervalo, o servidor envia o indicador de “digitando…” e dispara o “paused” antes do envio real.
replyTo
string
ID da mensagem a ser citada (reply). A mensagem original precisa pertencer à mesma instância e ter sido salva no banco.
replyPrivate
boolean
padrão:"false"
Quando true e replyTo aponta para uma mensagem originária de um grupo, o carrossel é redirecionado para o privado do autor original (mantendo a citação).
source
string
padrão:"api"
Identificador de origem para rastreabilidade (ex.: crm, bot-suporte, n8n). Salvo no registro da mensagem e propagado para webhooks.

Notas

  • delay é em segundos (não milissegundos).
  • Em cada header, escolha uma única mídia: ou imageUrl ou videoUrl. Enviar ambas pode resultar em renderização inconsistente no cliente.
  • Validação do servidor: cada card precisa de header.title e body.text não vazios; cada botão precisa de displayText e id não vazios. Erros são retornados com o índice (Card N, Button M: ...) para facilitar debug.
  • Aparelhos antigos do WhatsApp podem cair em fallback de texto e exibir o carrossel como mensagem comum.
  • Para botões URL, garanta que o link comece com https:// para evitar ser bloqueado pelo cliente.

Erros

HTTPStatus internoMensagem
400Instance name is required
400Invalid request body: <detalhe>
400Number is required
400At least one card is required
400Card N: Header title is required
400Card N: Body text is required
400Card N, Button M: Display text is required
400Card N, Button M: ID is required
400Card N, Button M: Type must be one of: REPLY, URL, CALL, COPY
400invalid_numberInvalid phone number format: <detalhe>
400media_download_failed(motivo do download de mídia do header falhar)
404Instance not found
500media_upload_failed(motivo do upload de mídia do header falhar)
500send_failedFailed to send carousel: <reason>
503disconnectedInstance is not connected to WhatsApp
Envelope de erro:
{
  "success": false,
  "error": { "message": "Card 1: Header title is required" }
}