Pular para o conteúdo principal
O WhatsApp é onde o cliente escreve primeiro, e onde uma conversa pode durar meses. Este guia liga um agente de WhatsApp à Niadra: quais identificadores enviar, como tornar inofensivo o reenvio de webhook, como uma conversa de meses vira sessões, como um OTP no mesmo canal eleva o nível de verificação e como áudios e anexos viajam por referência. O exemplo é a mensagem da Marina Souza às 14h02: “O técnico não apareceu. Vou ligar para vocês.” Cinco minutos depois ela liga, e o agente de voz já sabe o que ela escreveu.

Identificadores no WhatsApp

A WhatsApp Cloud API informa vários ids para a mesma pessoa, e a Niadra guarda cada um como um tipo de handle próprio. Envie no mesmo evento todos os ids que você recebe: handles que chegam juntos no mesmo evento são ligados quando são fortes, não bloqueados e sem conflito. Com os nomes de usuário do WhatsApp, o remetente pode deixar de ser um telefone e virar um BSUID. A ligação entre BSUID e telefone nunca é presumida: ela exige uma asserção explícita, como o cliente digitar o número, um OTP ou o seu próprio cadastro. O nome de usuário é atributo de exibição e nunca identifica ninguém.
Um BSUID só é único dentro de uma conta comercial. Envie sempre com a conta em scope (as funções de handle do SDK recebem a conta como argumento).

Passo a passo

1. Registre cada mensagem recebida com o id do WhatsApp

Use o id da mensagem no provedor (wamid) como idempotency_key. A WhatsApp Cloud API reenvia webhooks por dias, e a Niadra deduplica por essa chave no banco: uma entrega repetida conta como duplicada e nunca é gravada duas vezes. Os eventos são ordenados por occurred_at, a hora em que a mensagem foi enviada, nunca pela chegada; assim, uma ressincronização que reenvia mensagens antigas coloca cada uma no lugar certo.
O track() volta na hora. O SDK põe o evento numa fila: uma mensagem da conversa sai na hora; os outros eventos saem em lotes de até 15 ou a cada segundo. A API só responde depois de gravar o lote, mascarado e cifrado, e a mensagem entra na camada ao vivo junto com a resposta (no primeiro contato de um número que a memória ainda não conhece, logo depois): quando a Marina liga às 14h07, o agente de voz recebe essa mensagem em live.

2. Ligue o id do WhatsApp ao telefone que o resto da empresa conhece

O agente de voz procura a Marina pelo phone_e164; o seu CRM conhece a Marina pelo id dele. Quando você sabe que os três são da mesma pessoa, diga isso com identify(). A chamada sai na hora: um id novo entra no perfil na mesma resposta, e dois perfis que já existiam se unem antes da resposta.
Cada ligação é uma asserção com método e evidência. Uma ligação errada pode ser retirada, e a memória acompanha cada handle até a origem. Veja Identidade e verificação.

3. Trate a conversa como conversa e deixe a Niadra dividir as sessões

O seu conversation_id é a conversa do WhatsApp, que pode durar meses. A Niadra divide essa conversa em sessões: no WhatsApp, turnos com menos de cerca de 20 minutos entre si são a mesma sessão (ajustável por canal). A sessão vira memória depois de 3 minutos sem turnos, e uma resposta do cliente dentro da janela a reabre e a extrai de novo; a cada reabertura a espera dobra (3, 6, 12 minutos), nunca além da janela do canal. Cada sessão vira memória por conta própria (uma regra decide no fim dela se vai ao modelo: um cumprimento não vai, uma troca curta que fixa um número de pedido ou um CEP vai), e a cobrança conta uma conversa por janela de atividade, não por mensagem. Leia o contexto antes de cada resposta, no nível que a conversa provou: o turno do cliente com verification_hint: "V1" prova V1, porque chegou daquele número, e flush() garante que ele chegou antes da primeira leitura. Dentro da sessão o contexto fica fixado: voltam os mesmos bytes, e o provedor do modelo mantém o início do prompt em cache. O SDK também guarda o contexto por conversa.

4. Eleve o nível de verificação com um OTP no WhatsApp

Uma mensagem vinda de um número de WhatsApp é plausível pelo canal. Dados da conta, documentos e pagamentos costumam exigir mais. Envie um código de uso único pelo WhatsApp; quando o cliente digitar o código certo, registre um verify com método otp_whatsapp e nível V3. O nível vale só para esta conversa, e o OTP no WhatsApp também prova a posse daquele número.
O verify sai na hora e descarta o contexto guardado daquela conversa. A leitura seguinte volta com os itens que a política libera em V3; antes disso, o contexto informava em withheld quantos itens estavam retidos, e o agente sabia que valia pedir a verificação. Um nível acima do teto da sua fonte volta como erro do item, verification_not_allowed.

5. Envie áudios e anexos por referência

Mídia nunca viaja dentro de um evento. Reserve um upload com o subject dono do arquivo, envie os bytes com PUT para a URL pré-assinada com exatamente os upload_headers da resposta (o armazenamento recusa qualquer outro) e depois mande o evento com media_ref e o SHA-256. Os SDKs fazem os dois primeiros passos em upload_media() e uploadMedia(). Para mensagens de voz, mande a sua transcrição em transcript, com stt_confidence.

6. Registre as respostas do agente e as transferências

Registre as mensagens enviadas com conversation.agent() (com o id da mensagem no WhatsApp como idempotency_key, quando houver), as mensagens de atendente com human_agent() em Python ou human() em TypeScript, e notas internas com visibility="internal": o cliente nunca viu essas notas, e o contexto as marca assim. Quando a conversa passa para uma pessoa, registre a transferência, para a medição saber se o destino leu o contexto.

Próximos passos

Eventos e o lote

idempotência, ordem e erro por item.

Identidade e verificação

asserções, uniões e os níveis.

Agentes de voz

a ligação das 14h07.

Enviar um lote

a requisição e a resposta completas.