Skip to main content
Webhooks permitem que seu backend seja notificado automaticamente quando um envelope muda de estado, sem depender de polling contínuo.

Como funcionar

Ao criar um envelope, você pode especificar uma URL de notificação:
Quando o envelope muda de estado (finaliza, expira ou é cancelado), o serviço dispara um POST HTTP para essa URL com um payload JSON.

Payload do webhook

O webhook é disparado com um POST contendo:
string
required
Estado do envelope: FINISHED, CANCELLED, ou EXPIRED.
string
required
UUID do envelope que mudou de estado.

Exemplo

Estados e quando disparam

Características importantes

  • Best-effort: webhooks são disparados uma única vez. Se a requisição HTTP falhar (timeout, erro de servidor, DNS inválido), não há retry automático.
  • Sem idempotência garantida: o mesmo webhook pode ser disparado mais de uma vez em raríssimos casos (ex: falha de rede seguida de retry interno). Implemente tratamento de duplicatas no seu backend se crítico.
  • Sem autenticação: o webhook não inclui header de autenticação. Se precisar validar a origem, implemente uma estratégia: usar um token secreto na URL (?token=secret), validar o IP de origem, ou assinar o payload com HMAC.
  • Sem garantia de ordem: se múltiplos eventos forem disparados rapidamente, a ordem de entrega não é garantida.
  • Timeout curto: seu endpoint deve responder em até 30 segundos com status HTTP 2xx (200-299).

Implementação recomendada

1. Receba o webhook

Nunca bloqueie a resposta do webhook. Responda com 200 OK imediatamente e processe de forma assíncrona (fila de mensagens, background job, etc.).

2. Valide e processe

3. Fallback: polling

Sempre implemente polling como fallback. Webhooks são best-effort — não confie exclusivamente neles para fluxos críticos.

Teste seu webhook

Localmente com ngrok

Teste manual com curl

Dicas de depuração

  • Verifique os logs: Procure por chamadas HTTP POST em seus logs (curl, wget, ou cliente HTTP do servidor).
  • Webhook nunca chega? Confirme que a urlNotification é uma URL pública e acessível (não localhost), que não há firewall bloqueando, e que seu endpoint retorna status 2xx.
  • Webhook duplicado? Implemente um envelopeUuid + status como chave única na sua tabela de logs — descarte duplicatas.
  • Ordem incorreta? Não assuma ordem de entrega. Se precisar de sequência (ex: FINISHED antes de processar), use timestamps (createdAt da mudança de estado) para ordenar.

Relacionado

Confira também como listar e detalhar envelopes para um fallback robusto de polling: