Skip to main content
Um webhook faz o caminho inverso da API: em vez de você consultar a Nuvia, a Nuvia envia um 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 é um POST 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).
O corpo não identifica a empresa. Não existe companyId no envelope — se o seu servidor atende várias empresas da Nuvia, use uma URL por empresa ou um valor distinto em custom_headers para saber de quem é o evento.

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.
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.

Validar que a chamada veio da Nuvia

Não há assinatura HMAC. A Nuvia não assina o corpo da requisição, então não existe como verificar criptograficamente a origem.
O mecanismo disponível é o custom_headers: cadastre um valor secreto e confira em toda requisição.
Node.js
Use HTTPS e um valor longo e aleatório. Como o segredo viaja em header a cada entrega, trate-o como credencial: rotacione com 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:
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.
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.
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.
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.
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.