Reentrega e confiabilidade
Retentativas com backoff por 24 horas, deduplicação por event_id e como responder rápido sem perder evento.
Entregas de webhook podem falhar — seu servidor pode estar fora do ar, demorar demais para responder, ou devolver um erro. Esta página descreve como a FonteData lida com isso e o que sua aplicação precisa fazer para não processar o mesmo evento duas vezes.
Retentativas com backoff
Se a entrega não receber um status 2xx (timeout, redirecionamento, erro
4xx/5xx, indisponibilidade), o evento é reenviado automaticamente com
backoff crescente, por até 24 horas a partir da primeira tentativa.
Isso significa que uma instabilidade passageira no seu endpoint — um deploy, um pico de carga — não perde o evento: ele volta a ser tentado depois.
Deduplicação por event_id
Como as tentativas de reentrega repetem a mesma requisição, seu endpoint
pode receber o mesmo evento mais de uma vez — inclusive em cenários em que a
entrega foi bem-sucedida, mas a confirmação (2xx) se perdeu no caminho de
volta.
Por isso, trate a entrega como "pelo menos uma vez" (at-least-once), não
"exatamente uma vez": use o event_id do envelope como chave de
deduplicação — por exemplo, gravando os event_id já processados e
ignorando qualquer entrega repetida.
# Exemplo simples de deduplicação
eventos_processados = set() # em produção, use um armazenamento persistente
def processar_evento(evento: dict):
event_id = evento["event_id"]
if event_id in eventos_processados:
return # já processado, ignora
eventos_processados.add(event_id)
# ... lógica de negócio ...
Depois das 24 horas
Se o seu endpoint continuar indisponível (ou continuar respondendo erro) pelo período inteiro de retentativas, a entrega é marcada como definitivamente não entregue ao final das 24 horas — a FonteData não tenta mais esse evento específico.
Como o webhook é hoje o único caminho de entrega dessas respostas, um evento
que esgota as 24 horas não é recuperável pela API. Vale tratar a saúde do
seu endpoint como parte da operação: acompanhe o contador de falhas na tela de
Webhooks do painel e prefira responder 2xx rápido, enfileirando o
processamento (veja a seção seguinte), a segurar a resposta enquanto processa.
Responda rápido, processe depois
Seu endpoint tem até 10 segundos para responder 2xx a cada tentativa de
entrega (veja Visão geral). Se o processamento do evento
envolve trabalho mais demorado — gravar em banco, chamar outro serviço,
disparar uma notificação — não faça isso de forma síncrona antes de
responder.
O padrão recomendado é:
- Receber a requisição e verificar a assinatura (veja Assinatura e verificação).
- Checar o
event_idcontra os eventos já processados (deduplicação). - Enfileirar o evento para processamento assíncrono (fila, job em background).
- Responder
200 OKimediatamente.
Isso reduz a chance de timeout — e, por consequência, de reentregas e duplicatas desnecessárias — mesmo quando o processamento real do evento leva mais tempo.