POST /v1/messages/send — a conversa é criada automaticamente se não existir. Requer escopo messages:send.
1
Escolha a conexão
Se a sua conta tem mais de uma conexão WhatsApp, informe
whatsappId (ou whatsappName). Sem nenhum dos dois, a API escolhe automaticamente a primeira conexão whatsapp/waba conectada, por ordem crescente de id — o campo isDefault (que aparece em GET /v1/connections) não entra nessa escolha. Liste as conexões em GET /v1/connections e anote o id da que você quer usar; não deixe pro automático se a sua conta tem mais de uma conexão ativa. Sem nenhuma conexão whatsapp/waba cadastrada, a resposta é 404 ERR_NO_CONNECTION_AVAILABLE.2
Envie um texto
ticketId (a conversa) e messages[0].id.3
Envie mídia (multipart)
Mídia vai por
multipart/form-data, não JSON. O campo medias aceita imagem, áudio ou documento; body vira a legenda.4
Envie um template WABA
Fora da janela de 24h (veja abaixo), só templates aprovados são entregues. Envie
templateData como objeto:Por compatibilidade,
templateData também aceita uma string JSON com o mesmo conteúdo ("{\"templateName\":...}"). Prefira o objeto: é mais legível e evita erro de escaping.5
Acompanhe a entrega
Consulte A resposta traz
GET /v1/messages/{messageId}/status com o id retornado no envio, use-o como messageId:found: true e o ack numérico (0 a 5) com o status correspondente, aninhados em message:status é um destes valores: queued, sent, server_ack, delivered, read, failed, received (mensagem recebida do contato, não enviada por você) ou unknown.Janela de 24 horas
O WhatsApp só permite texto livre até 24h depois da última mensagem do cliente. Fora dessa janela:- Conexões WABA precisam de um template aprovado (
templateData) — texto livre falha com erro da Meta. - Conexões Baileys (WhatsApp Web) não têm essa restrição, mas dependem do aparelho estar conectado.
Envio sem registrar conversa
Por padrão (saveOnTicket omitido ou true), o envio cria/reaproveita uma conversa (ticketId). Com saveOnTicket: false, o envio é fire-and-forget: em conexões Baileys nenhuma conversa é criada (ticketId: null na resposta); em WABA um ticket efêmero ainda é criado internamente, mas não aparece na tela de atendimento.
Erros comuns
Veja o catálogo completo de erros.