client.message.send também aceita um Proto.IMessage bruto. Preencha o campo que nomeia o tipo — locationMessage, contactMessage, contactsArrayMessage, interactiveMessage, e assim por diante — e a lib encoda literalmente.
Tipos que já têm um builder tipado — enquetes, reações, edições, revogações, fixação, manter no chat, wrapping view-once e citações / menções / previews de link — pertencem a Enviando mensagens e Mensagens interativas. Esta página é para os tipos que só existem em modo bruto.
O conjunto completo de campos Proto.IMessage reconhecidos (localização, localização ao vivo, contatos, convite de grupo, produto, pedido, …) está na referência de tipos de mensagem. Alguns exemplos abaixo usam valores de enum do namespace proto:
Como o tipo da stanza é resolvido
Qualquer que seja o campo preenchido, o zapo classifica a mensagem antes de ela ir para o fio: uma stanza<message> carrega um type (text ou media), e uma stanza de mídia precisa carregar também um mediatype. O servidor descarta silenciosamente uma stanza de mídia sem mediatype — o envio recebe ack normalmente e nada chega — então um tipo de conteúdo que cai no default de mídia sem um mediatype se perde de forma invisível.
Dois detalhes importam quando você monta um payload na mão:
- Wrappers são percorridos por dentro.
deviceSentMessage,botForwardedMessage,groupStatusMessageV2egroupStatusMessagecarregam a mensagem real em.message, então o conteúdo interno decide o tipo. Uma imagem encaminhada continuamediacom seumediatype; um status de imagem embrulhado emgroupStatusMessageV2não sai mais comotype="media"semmediatype— uma combinação que nenhum client real envia. - A família de rich response de IA classifica como texto.
richResponseMessagee um wrapperbotForwardedMessagepuro resolvem paratype="text". Antes da 1.9.0 eles caíam no default de mídia e nunca eram entregues.
Localizações
name e address são opcionais.
Para uma mensagem de live location, use o campo liveLocationMessage — ele carrega os metadados de movimento (accuracyInMeters, speedInMps, sequenceNumber).
Contatos
Um cartão de contato único é umcontactMessage com uma string vCard:
waid=<digits> na linha TEL é o que permite ao cliente WhatsApp vincular o cartão a uma conta WhatsApp — use o telefone E.164 do destinatário sem o +.
Para vários cartões de uma vez, use contactsArrayMessage:
Convite de grupo
Botões
Até três botões de quick-reply. O header é umoneof — escolha texto, imagem, vídeo, localização ou documento (pré-upload para mídia):
Menu de lista
Uma lista para um grupo sai com um formato de stanza diferente da mesma lista numa conversa direta: o grupo só a aceita quando
type=media, mediatype=list e o nó companheiro <biz><list> viajam juntos, enquanto um envio direto mantém o formato de texto plano. O zapo escolhe o certo pra você. Antes da 1.10.0 uma lista em grupo era nackeada com 479 enquanto a mensagem idêntica passava no 1:1.Interactive native flow (cta_url)
A superfície interativa moderna — botões cujos parâmetros são payloads ad-hoc codificados em JSON:name do botão e o buttonParamsJson mudam.
Produto
Envie um produto do catálogo. OproductImage interno precisa estar pré-uploadado:
Pedido
Confirmação / consulta de pedido:Convite de admin de newsletter
Convide um contato para ser co-admin de uma das suas newsletters:Alternar mensagens temporárias (configuração ephemeral)
Alternância do timer para o chat inteiro — diferente da opção de envioexpirationSeconds (uma mensagem) e do wrapper ephemeralMessage (uma mensagem herdando o timer do chat).
Solicitar número de telefone
Pagamentos (PIX e review-and-pay)
Envie cards de pagamento do WhatsApp Business — PIX estático (payment_info) e checkout de pedido (review_and_pay) — como payloads brutos interactiveMessage / nativeFlowMessage via client.message.send. Ainda não existe builder tipado, então monte o shape você mesmo do mesmo jeito que os cards de localização/contato acima. A lib apenas relaya os botões native-flow interativos; os clientes WhatsApp renderizam a UI do card.
Valores são unidades monetárias inteiras mais um divisor offset: { value: 1000, offset: 100 } renderiza como R$ 10,00. key_type do PIX é um de EVP (chave aleatória), EMAIL, PHONE (E.164 preferido), CPF, CNPJ.
Card PIX (payment_info)
Renderiza o card PIX (chave / merchant). Use para uma chave PIX estática sem card de pedido.
Card review-and-pay (review_and_pay)
Renderiza o card de pedido / cobrança (número, itens, total). Use para um resumo estilo checkout.
buttonParamsJson precisa ser uma string JSON — monte o objeto em código e faça o stringify. body / footer em interactiveMessage são opcionais. Não misture payment_info e review_and_pay esperando a mesma UI — eles renderizam cards diferentes, e adicionar cta_copy / botões CTA extras no mesmo nativeFlowMessage pode renderizar diferente no mobile vs Web.
Veja também
- Enviando mensagens — a API base
client.message.send, opções e variantes de conteúdo tipadas. - Mensagens interativas — builders tipados para enquetes, reações, edições, revogações, fixar e manter no chat.
- Referência de tipos de mensagem — todos os campos
Proto.IMessagereconhecidos e seu tipo resolvido.
