Skip to main content
Para tipos de conteúdo que o WhatsApp suporta mas o zapo ainda não empacota num builder tipado, o 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, groupStatusMessageV2 e groupStatusMessage carregam a mensagem real em .message, então o conteúdo interno decide o tipo. Uma imagem encaminhada continua media com seu mediatype; um status de imagem embrulhado em groupStatusMessageV2 não sai mais como type="media" sem mediatype — uma combinação que nenhum client real envia.
  • A família de rich response de IA classifica como texto. richResponseMessage e um wrapper botForwardedMessage puro resolvem para type="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 é um contactMessage com uma string vCard:
O parâmetro 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 é um oneof — 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.
Uma lista single-select de rows agrupadas em sections:

Interactive native flow (cta_url)

A superfície interativa moderna — botões cujos parâmetros são payloads ad-hoc codificados em JSON:
É o mesmo formato de wire dos cards PIX / review-and-pay em Pagamentos abaixo — só o name do botão e o buttonParamsJson mudam.

Produto

Envie um produto do catálogo. O productImage 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 envio expirationSeconds (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.
Cards de pagamento são um recurso Business / native-flow. A renderização difere entre WhatsApp mobile e WhatsApp Web — prefira o flow que combina com a UI que você quer (payment_info para o card só-PIX, review_and_pay para o card “Nº da cobrança” / pedido) e valide nos dois clients.
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

Última modificação em 8 de outubro de 2026