API de Mensagens Interativas

April 17, 2026 · View on GitHub

Documentação completa dos endpoints para enviar mensagens interativas no WhatsApp: botões, listas e carrosséis. Todos os endpoints são compatíveis com Android, iOS (iPhone) e WhatsApp Web/Desktop.

📋 Índice


Enviar Botões

Envia uma mensagem com botões interativos. Suporta botões de resposta rápida (reply), URL, ligação (call), cópia (copy) e PIX.

Endpoint: POST /send/button

Headers:

Content-Type: application/json
apikey: SUA-CHAVE-API

Body:

{
  "number": "5511999999999",
  "title": "Título da Mensagem",
  "description": "Texto do corpo da mensagem",
  "footer": "Texto do rodapé",
  "buttons": [
    {
      "type": "reply",
      "displayText": "Texto do Botão",
      "id": "identificador_unico"
    }
  ],
  "delay": 1000,
  "quoted": {
    "messageId": "BAE5..."
  }
}

Parâmetros:

CampoTipoObrigatórioDescrição
numberstring✅ SimNúmero do destinatário (formato: DDI + DDD + número)
descriptionstring✅ SimTexto do corpo da mensagem
buttonsarray✅ SimArray de botões (ver Tipos de Botões)
titlestring❌ NãoTítulo exibido em negrito acima do corpo
footerstring❌ NãoTexto pequeno no rodapé. Não enviar vazio
delayint32❌ NãoDelay em milissegundos antes de enviar
mentionedJidstring❌ NãoJID do usuário a mencionar
mentionAllbool❌ NãoMencionar todos os participantes (apenas grupos)
formatJidbool❌ NãoFormatar número automaticamente (padrão: true)
quotedobject❌ NãoMensagem a ser citada

Resposta de Sucesso (200):

{
  "message": "success",
  "data": {
    "Info": {
      "ID": "3EB034D434158AD2CC0B9A",
      "Chat": "5511999999999@s.whatsapp.net",
      "Type": "ButtonMessage",
      "Timestamp": "2026-04-01T17:54:09Z"
    }
  }
}

Resposta de Erro (400):

{
  "error": "phone number is required"
}

Exemplo 1: Botões Quick Reply

Máximo 3 botões. Não pode misturar com outros tipos.

curl -X POST http://localhost:4000/send/button \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "title": "Atendimento",
    "description": "Como podemos ajudar você hoje?",
    "footer": "Responda clicando em um botão",
    "buttons": [
      {"type": "reply", "displayText": "Suporte Técnico", "id": "suporte"},
      {"type": "reply", "displayText": "Financeiro", "id": "financeiro"},
      {"type": "reply", "displayText": "Vendas", "id": "vendas"}
    ]
  }'

Exemplo 2: Botões Mistos (URL + Call + Copy)

Podem ser combinados entre si livremente.

curl -X POST http://localhost:4000/send/button \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "title": "Nossos Canais",
    "description": "Escolha como deseja entrar em contato:",
    "footer": "Empresa XYZ",
    "buttons": [
      {"type": "url", "displayText": "Acessar Site", "url": "https://empresa.com"},
      {"type": "call", "displayText": "Ligar para Nós", "phoneNumber": "+5511999999999"},
      {"type": "copy", "displayText": "Copiar Email", "copyCode": "contato@empresa.com"}
    ]
  }'

Exemplo 3: Botão PIX

Deve ser enviado sozinho, sem outros botões.

curl -X POST http://localhost:4000/send/button \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "title": "Pagamento PIX",
    "description": "Realize o pagamento via PIX:",
    "buttons": [
      {
        "type": "pix",
        "currency": "BRL",
        "name": "Empresa XYZ LTDA",
        "keyType": "CNPJ",
        "key": "12345678000199"
      }
    ]
  }'

Enviar Lista

Envia uma mensagem com lista de opções organizadas em seções. O usuário toca no botão para abrir a lista e seleciona uma opção.

Endpoint: POST /send/list

Headers:

Content-Type: application/json
apikey: SUA-CHAVE-API

Body:

{
  "number": "5511999999999",
  "title": "Título da Lista",
  "description": "Texto do corpo da mensagem",
  "buttonText": "Texto do botão que abre a lista",
  "footerText": "Texto do rodapé",
  "sections": [
    {
      "title": "Nome da Seção",
      "rows": [
        {
          "title": "Título da Opção",
          "description": "Descrição da opção",
          "rowId": "identificador_unico"
        }
      ]
    }
  ],
  "delay": 1000,
  "quoted": {
    "messageId": "BAE5..."
  }
}

Parâmetros:

CampoTipoObrigatórioDescrição
numberstring✅ SimNúmero do destinatário
descriptionstring✅ SimTexto do corpo da mensagem
sectionsarray✅ SimArray de seções contendo rows
buttonTextstring❌ NãoTexto do botão que abre a lista (padrão: "Ver Menu")
titlestring❌ NãoTítulo em negrito no topo
footerTextstring❌ NãoTexto do rodapé
delayint32❌ NãoDelay em milissegundos antes de enviar
mentionedJidstring❌ NãoJID do usuário a mencionar
mentionAllbool❌ NãoMencionar todos (apenas grupos)
formatJidbool❌ NãoFormatar número automaticamente
quotedobject❌ NãoMensagem a ser citada

Parâmetros da Seção:

CampoTipoObrigatórioDescrição
titlestring✅ SimNome da seção
rowsarray✅ SimArray de opções da seção

Parâmetros da Row:

CampoTipoObrigatórioDescrição
titlestring✅ SimTexto da opção
descriptionstring❌ NãoDescrição da opção
rowIdstring✅ SimID único para rastreio do clique

Resposta de Sucesso (200):

{
  "message": "success",
  "data": {
    "Info": {
      "ID": "3EB0C5A277F7F9B6C599",
      "Chat": "5511999999999@s.whatsapp.net",
      "Type": "ListMessage",
      "Timestamp": "2026-04-01T18:00:00Z"
    }
  }
}

Resposta de Erro (400):

{
  "error": "sections are required"
}

Exemplo 1: Cardápio Digital

curl -X POST http://localhost:4000/send/list \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "title": "Cardápio Digital",
    "description": "Escolha um item do nosso cardápio:",
    "buttonText": "Ver Cardápio",
    "footerText": "Restaurante XYZ",
    "sections": [
      {
        "title": "Pratos Principais",
        "rows": [
          {"title": "Filé Mignon", "description": "Com arroz e batata - R$ 45,90", "rowId": "file_mignon"},
          {"title": "Salmão Grelhado", "description": "Com legumes - R$ 52,90", "rowId": "salmao"},
          {"title": "Frango Parmegiana", "description": "Com purê - R$ 35,90", "rowId": "frango"}
        ]
      },
      {
        "title": "Bebidas",
        "rows": [
          {"title": "Suco Natural", "description": "Laranja, Limão ou Maracujá - R$ 8,00", "rowId": "suco"},
          {"title": "Refrigerante", "description": "Lata 350ml - R$ 6,00", "rowId": "refri"},
          {"title": "Água Mineral", "description": "500ml - R$ 4,00", "rowId": "agua"}
        ]
      },
      {
        "title": "Sobremesas",
        "rows": [
          {"title": "Pudim", "description": "R$ 12,00", "rowId": "pudim"},
          {"title": "Petit Gâteau", "description": "R$ 18,00", "rowId": "petit_gateau"}
        ]
      }
    ]
  }'

Exemplo 2: Menu de Serviços

curl -X POST http://localhost:4000/send/list \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "description": "Selecione o serviço desejado:",
    "buttonText": "Ver Serviços",
    "sections": [
      {
        "title": "Atendimento",
        "rows": [
          {"title": "Falar com Atendente", "description": "Atendimento humano", "rowId": "atendente"},
          {"title": "FAQ", "description": "Perguntas frequentes", "rowId": "faq"},
          {"title": "Abrir Ticket", "description": "Registrar ocorrência", "rowId": "ticket"}
        ]
      }
    ]
  }'

Enviar Carrossel

Envia uma mensagem com cards deslizáveis (carrossel), cada um com imagem, texto, rodapé e botões. Ideal para catálogos de produtos, planos e portfólios.

Endpoint: POST /send/carousel

Headers:

Content-Type: application/json
apikey: SUA-CHAVE-API

Body:

{
  "number": "5511999999999",
  "body": "Texto do corpo principal",
  "footer": "Texto do rodapé principal",
  "cards": [
    {
      "header": {
        "title": "Título do Card",
        "imageUrl": "https://url-da-imagem.com/foto.jpg"
      },
      "body": "Texto do corpo do card",
      "footer": "Rodapé do card",
      "buttons": [
        {
          "type": "REPLY",
          "displayText": "Texto do Botão",
          "id": "id_rastreio"
        }
      ]
    }
  ],
  "delay": 1000,
  "quoted": {
    "messageId": "BAE5..."
  }
}

Parâmetros:

CampoTipoObrigatórioDescrição
numberstring✅ SimNúmero do destinatário
cardsarray✅ SimArray de cards (mínimo 2, máximo ~10)
bodystring❌ NãoTexto do corpo principal (acima dos cards)
footerstring❌ NãoRodapé principal
delayint32❌ NãoDelay em milissegundos antes de enviar
formatJidbool❌ NãoFormatar número automaticamente
quotedobject❌ NãoMensagem a ser citada

Parâmetros do Card:

CampoTipoObrigatórioDescrição
headerobject✅ SimCabeçalho do card (deve conter imagem)
header.titlestring❌ NãoTítulo do card
header.subtitlestring❌ NãoSubtítulo do card
header.imageUrlstring✅ Sim*URL da imagem do card
header.videoUrlstring❌ NãoURL de vídeo (alternativa à imagem)
bodystring✅ SimTexto do corpo do card
footerstring❌ NãoRodapé do card
buttonsarray❌ NãoArray de botões do card

⚠️ Importante: Todos os cards devem ter imagem (imageUrl) para o carrossel renderizar corretamente em todos os dispositivos. As imagens recebem thumbnail JPEG automaticamente para carregamento instantâneo.

Parâmetros do Botão do Card:

CampoTipoObrigatórioDescrição
typestring❌ NãoTipo do botão: REPLY, URL, CALL, COPY (padrão: REPLY)
displayTextstring✅ SimTexto visível do botão
idstring✅ Sim*ID para rastreio (reply) ou URL/telefone (url/call)
copyCodestring✅ Sim*Texto a copiar (apenas tipo COPY)

Resposta de Sucesso (200):

{
  "message": "success",
  "data": {
    "Info": {
      "ID": "3EB0C5A277F7F9B6C599",
      "Chat": "5511999999999@s.whatsapp.net",
      "Type": "InteractiveMessage",
      "Timestamp": "2026-04-01T18:30:00Z"
    }
  }
}

Resposta de Erro (400):

{
  "error": "cards are required (minimum 1)"
}

Exemplo 1: Catálogo de Produtos

curl -X POST http://localhost:4000/send/carousel \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "body": "Confira nossos produtos em destaque!",
    "footer": "Loja Virtual XYZ",
    "cards": [
      {
        "header": {
          "title": "Smartphone Pro Max",
          "imageUrl": "https://placehold.co/600x400/1a1a2e/white?text=Smartphone"
        },
        "body": "Tela 6.7 AMOLED, 256GB, Câmera 108MP.\nDe R$ 4.999 por R$ 3.799!",
        "footer": "12x sem juros",
        "buttons": [
          {"type": "REPLY", "displayText": "Comprar", "id": "comprar_smartphone"},
          {"type": "URL", "displayText": "Ver Detalhes", "id": "https://loja.com/smartphone"}
        ]
      },
      {
        "header": {
          "title": "Notebook Ultra",
          "imageUrl": "https://placehold.co/600x400/16213e/white?text=Notebook"
        },
        "body": "Intel i7, 16GB RAM, SSD 512GB, Tela 15.6 FHD.\nPor apenas R$ 5.299!",
        "footer": "Frete grátis",
        "buttons": [
          {"type": "REPLY", "displayText": "Comprar", "id": "comprar_notebook"},
          {"type": "URL", "displayText": "Ver Detalhes", "id": "https://loja.com/notebook"}
        ]
      },
      {
        "header": {
          "title": "Fone Bluetooth",
          "imageUrl": "https://placehold.co/600x400/0f3460/white?text=Fone"
        },
        "body": "Cancelamento de ruído ativo, 30h bateria.\nR$ 299,90",
        "footer": "Envio imediato",
        "buttons": [
          {"type": "REPLY", "displayText": "Comprar", "id": "comprar_fone"},
          {"type": "CALL", "displayText": "Ligar p/ Comprar", "id": "+5511999999999"}
        ]
      }
    ]
  }'

Exemplo 2: Planos de Serviço

curl -X POST http://localhost:4000/send/carousel \
  -H "Content-Type: application/json" \
  -H "apikey: SUA-CHAVE-API" \
  -d '{
    "number": "5511999999999",
    "body": "Conheça nossos planos:",
    "cards": [
      {
        "header": {
          "title": "Plano Básico",
          "imageUrl": "https://placehold.co/600x400/2ecc71/white?text=Basico"
        },
        "body": "Ideal para pequenas empresas.\n- 1.000 mensagens/mês\n- 1 instância\n- Suporte email\n\nR$ 97/mês",
        "buttons": [
          {"type": "REPLY", "displayText": "Contratar Básico", "id": "plano_basico"},
          {"type": "COPY", "displayText": "Copiar Link", "copyCode": "https://planos.com/basico"}
        ]
      },
      {
        "header": {
          "title": "Plano Pro",
          "imageUrl": "https://placehold.co/600x400/3498db/white?text=Pro"
        },
        "body": "Para empresas em crescimento.\n- 10.000 mensagens/mês\n- 5 instâncias\n- Suporte prioritário\n\nR$ 297/mês",
        "buttons": [
          {"type": "REPLY", "displayText": "Contratar Pro", "id": "plano_pro"},
          {"type": "COPY", "displayText": "Copiar Link", "copyCode": "https://planos.com/pro"}
        ]
      },
      {
        "header": {
          "title": "Plano Enterprise",
          "imageUrl": "https://placehold.co/600x400/9b59b6/white?text=Enterprise"
        },
        "body": "Solução completa.\n- Mensagens ilimitadas\n- Instâncias ilimitadas\n- Suporte 24/7\n\nSob consulta",
        "buttons": [
          {"type": "REPLY", "displayText": "Solicitar Orçamento", "id": "plano_enterprise"},
          {"type": "CALL", "displayText": "Falar com Vendas", "id": "+5511999999999"}
        ]
      }
    ]
  }'

Evento ButtonClick

Quando um usuário clica em um botão, seleciona um item de lista ou interage com um card de carrossel, a API dispara o evento ButtonClick para todos os canais configurados na instância.

Canais de Disparo

  • Webhook - Callback HTTP para URL configurada
  • WebSocket - Evento em tempo real
  • RabbitMQ - Mensagem na fila
  • NATS - Mensagem no tópico

Requisito

A instância deve ter o evento BUTTON_CLICK ou MESSAGE habilitado na configuração de events.

Payload do Evento

{
  "event": "ButtonClick",
  "data": {
    "buttonId": "suporte",
    "buttonText": "Suporte Técnico",
    "type": "native_flow_response",
    "phone": "5511999999999",
    "jid": "5511999999999@s.whatsapp.net",
    "pushName": "João Silva",
    "messageId": "3EB034D434158AD2CC0B9A",
    "chat": "5511999999999@s.whatsapp.net",
    "fromMe": false,
    "timestamp": 1711990500,
    "extraData": {}
  },
  "instanceToken": "token_da_instancia",
  "instanceId": "uuid-da-instancia",
  "instanceName": "nome_da_instancia"
}

Campos do Evento

CampoTipoDescrição
buttonIdstringID do botão/row clicado (conforme definido no envio)
buttonTextstringTexto exibido no botão/row
typestringTipo de resposta (ver tabela abaixo)
phonestringNúmero do usuário que clicou
jidstringJID completo do usuário
pushNamestringNome do contato no WhatsApp
messageIdstringID da mensagem de resposta
chatstringJID do chat
fromMeboolSe a mensagem é própria
timestampint64Timestamp Unix do clique

Tipos de Resposta

Valor de typeOrigem
native_flow_responseClique em botão enviado via /send/button ou /send/carousel
list_responseSeleção de item em lista enviada via /send/list
buttons_responseResposta a botões legados (ButtonsMessage)
template_button_replyResposta a template buttons

Exemplo: Botão Reply Clicado

{
  "event": "ButtonClick",
  "data": {
    "buttonId": "vendas",
    "buttonText": "Vendas",
    "type": "native_flow_response",
    "phone": "5511999999999",
    "jid": "5511999999999@s.whatsapp.net",
    "pushName": "Maria Santos",
    "messageId": "3EB0XXXXXXXXXXXXXX",
    "chat": "5511999999999@s.whatsapp.net",
    "fromMe": false,
    "timestamp": 1711991000
  },
  "instanceToken": "teste123",
  "instanceId": "4ee8ab07-8a67-42a8-a029-f382315912b1",
  "instanceName": "minha_instancia"
}

Exemplo: Item de Lista Selecionado

{
  "event": "ButtonClick",
  "data": {
    "buttonId": "file_mignon",
    "buttonText": "Filé Mignon",
    "type": "list_response",
    "phone": "5511999999999",
    "jid": "5511999999999@s.whatsapp.net",
    "pushName": "Pedro Oliveira",
    "messageId": "3EB0XXXXXXXXXXXXXX",
    "chat": "5511999999999@s.whatsapp.net",
    "fromMe": false,
    "timestamp": 1711991500
  },
  "instanceToken": "teste123",
  "instanceId": "4ee8ab07-8a67-42a8-a029-f382315912b1",
  "instanceName": "minha_instancia"
}

Exemplo: Botão de Carrossel Clicado

{
  "event": "ButtonClick",
  "data": {
    "buttonId": "comprar_smartphone",
    "buttonText": "Comprar",
    "type": "native_flow_response",
    "phone": "5511999999999",
    "jid": "5511999999999@s.whatsapp.net",
    "pushName": "Ana Costa",
    "messageId": "3EB0XXXXXXXXXXXXXX",
    "chat": "5511999999999@s.whatsapp.net",
    "fromMe": false,
    "timestamp": 1711992000
  },
  "instanceToken": "teste123",
  "instanceId": "4ee8ab07-8a67-42a8-a029-f382315912b1",
  "instanceName": "minha_instancia"
}

Tipos de Botões

Resumo por Endpoint

TipoSendButtonSendCarouselCampo obrigatório
Reply"reply""REPLY" (padrão)displayText, id
URL"url""URL"displayText, url ou id
Call"call""CALL"displayText, phoneNumber ou id
Copy"copy""COPY"displayText, copyCode
PIX"pix"N/Acurrency, name, keyType, key

Regras de Combinação

  • Reply: Máximo 3 botões. Não pode misturar com outros tipos no mesmo envio.
  • PIX: Deve ser enviado sozinho, sem outros botões.
  • URL / Call / Copy: Podem ser combinados livremente entre si.
  • Carrossel: Todos os tipos (exceto PIX) podem ser combinados no mesmo card.
  • Lista: Não possui botões nos items. Usa rowId para rastreio.

Estrutura de Cada Tipo

Reply (Resposta Rápida):

{"type": "reply", "displayText": "Suporte", "id": "btn_suporte"}

URL (Abre Link):

{"type": "url", "displayText": "Acessar Site", "url": "https://empresa.com"}

Call (Ligação):

{"type": "call", "displayText": "Ligar Agora", "phoneNumber": "+5511999999999"}

Copy (Copiar Texto):

{"type": "copy", "displayText": "Copiar Código", "copyCode": "DESCONTO20"}

PIX (Pagamento):

{
  "type": "pix",
  "currency": "BRL",
  "name": "Empresa XYZ",
  "keyType": "CPF",
  "key": "12345678901"
}

Notas de Compatibilidade

Regras para Funcionamento em Todos os Dispositivos

RegraDetalhe
Footer vazioNão envie campo footer vazio. Omita o campo ou preencha com texto
Imagens no carrosselTodos os cards devem ter imageUrl para renderizar corretamente
Mínimo de cardsCarrossel requer no mínimo 2 cards
ThumbnailsGerados automaticamente pela API (72px JPEG) para carregamento instantâneo
Formato do númeroDDI + DDD + número, sem caracteres especiais (5511999999999)
GruposUse o JID do grupo (ex: 120363XXXXX@g.us)
Mensagem quotedAdicione "quoted": {"messageId": "ID"} ao payload

Compatibilidade Testada

Tipo de MensagemAndroidiOS (iPhone)WhatsApp Web
Botões (reply)
Botões (url)
Botões (call)
Botões (copy)
Botões (pix)
Lista
Carrossel