POST
para o seu servidor sempre que algo acontece na sua operação: uma mensagem chega, um contato é
criado, um campo é preenchido pelo agente.
Cada empresa tem no máximo um webhook. Não é uma coleção: você configura uma URL e escolhe
quais eventos ela recebe. Tentar criar um segundo devolve
409.Configurar
POST /v1/webhooks com a URL e a lista de eventos. Escopo necessário: webhooks:create.
O que a Nuvia envia
Toda entrega é umPOST com estes headers:
E o corpo tem sempre a mesma estrutura de três campos:
event: o evento que disparou a entrega.timestamp: ISO 8601 UTC, gerado no momento em que a entrega foi enfileirada.data: o recurso relacionado ao evento (veja a tabela abaixo).
Eventos disponíveis
Nos eventos de mensagem, conversa e contato,
data traz o recurso no mesmo formato que a
Referência da API devolve nos GET correspondentes, por exemplo
GET /v1/messages/conversation/{id} para mensagens. As exceções são FIELD_UPDATED,
MESSAGE_FAILED e CONVERSATION_STEP_CHANGED, detalhadas a seguir.
Trate
data de forma tolerante: leia os campos que você usa e ignore o resto. Campos novos podem
aparecer conforme a plataforma evolui, e isso não é considerado quebra de contrato.FIELD_UPDATED é diferente
Esse evento não devolve uma entidade, e sim a descrição da alteração:
field.context indica a que o campo pertence: contact, conversation ou business. value tem
o tipo do campo: string, número, booleano ou lista. conversationId só vem quando a alteração
aconteceu dentro de uma conversa.
MESSAGE_FAILED cobre falha de entrega, não falha de envio
O evento dispara quando o WhatsApp devolve um status de falha para uma mensagem que já saiu da
Nuvia. Vale apenas para o canal WhatsApp Cloud API.
O corpo traz a mensagem com o status atualizado e uma chave failure_reason com a causa:
code é o código de erro do WhatsApp, por exemplo 131026 para número que não usa WhatsApp e
131047 para janela de 24h expirada. message é o texto pronto para exibição, o mesmo que o
operador vê no card da conversa; códigos sem tradução aparecem em inglês, como vieram do WhatsApp.
Use o code para a lógica da sua integração e o message apenas para exibir. O texto pode mudar
sem aviso, o código não.
CONVERSATION_STEP_CHANGED entrega a mudança, não a conversa
O evento dispara quando a conversa muda de etapa no funil, seja pelo painel, pelo agente de IA ou
pela API. Só dispara em mudança real de etapa.
previousStep vem null quando a conversa ainda não estava em nenhuma etapa. origin indica o
que provocou a mudança e pode não vir.
Este evento não substitui o
CONVERSATION_UPDATED. Quando a etapa muda por PATCH na conversa,
quem assina os dois recebe os dois na mesma requisição. Pela mudança de etapa direta, sai apenas
o CONVERSATION_STEP_CHANGED.Quem enviou a mensagem
Os eventos de mensagem trazem dois campos que, juntos, dizem de onde a mensagem veio:
As mensagens enviadas pelo app do WhatsApp Business em coexistência chegam pelo evento
MESSAGE_RECEIVED, não pelo MESSAGE_SENT. Por isso, para detectar a resposta do lead, filtre por
sender_type: CONTACT e message_type: INCOMING, e não só pelo nome do evento.
Se a sua integração envia mensagens pela API e precisa separá-las das mensagens da IA, guarde os IDs
das mensagens que ela mesma enviou.
Validar que a chamada veio da Nuvia
O mecanismo disponível é ocustom_headers: cadastre um valor secreto e confira em toda requisição.
Node.js
PUT /v1/webhooks/{id} se suspeitar de vazamento.
Garantias de entrega
Estas são as características reais da entrega. Leia antes de construir algo que dependa de webhook:Uma tentativa por evento, sem retry
Uma tentativa por evento, sem retry
Se o seu servidor estiver fora do ar, devolver
5xx ou estourar o tempo limite, o evento é
perdido. A falha é registrada do lado da Nuvia, mas nada é reenviado. Para dados críticos,
reconcilie periodicamente com a API (por exemplo, listando mensagens da conversa) em vez de
confiar só no webhook.Tempo limite de 10 segundos
Tempo limite de 10 segundos
A Nuvia aguarda no máximo 10 segundos pela sua resposta. Responda
2xx imediatamente e faça o
processamento em background. Se você processar antes de responder, entregas legítimas viram
timeout.A ordem não é garantida
A ordem não é garantida
Os eventos de status vêm do WhatsApp, que pode entregá-los fora de ordem (um
MESSAGE_DELIVERED
chegando depois do MESSAGE_READ da mesma mensagem). A Nuvia não reordena. Trate cada evento
pelo estado que ele carrega, sem assumir sequência.Eventos de status só disparam na transição real
Eventos de status só disparam na transição real
MESSAGE_DELIVERED e MESSAGE_READ só são enviados quando o status realmente muda. O WhatsApp
reenvia o mesmo status várias vezes, e essas repetições são descartadas: você não recebe
duplicata por causa disso. Ainda assim, escreva um handler idempotente: use o identificador da
mensagem como chave.Nada é entregue com o webhook inativo
Nada é entregue com o webhook inativo
Com
status: "INACTIVE", ou para eventos que você não incluiu em events, a Nuvia não enfileira
entrega alguma, e não há histórico para recuperar depois. Reativar não recupera o período
parado.Gerenciar a configuração
O
GET devolve um objeto com a configuração da empresa, ou null se não houver nenhuma. Não é
uma lista. O id usado no PUT e no DELETE vem desse objeto. Depois de remover, a empresa volta a
poder criar um webhook novo.
Para pausar temporariamente sem perder a configuração, prefira PUT com status: "INACTIVE" em vez
de apagar.
Próximos passos
Exemplos de integração
O webhook dentro de um caso de uso completo, com resposta automática.
Referência da API
Parâmetros e respostas dos endpoints de webhook.