Retries e idempotência de eventos

Entrega at-least-once com backoff exponencial.

O que conta como sucesso

  • Somente respostas 2xx são consideradas sucesso.
  • Timeout de 10 segundos por tentativa.
  • Redirecionamentos não são seguidos.
  • Falha de conexão, timeout ou status não-2xx agendam nova tentativa.

Agenda de retentativas

São no máximo 7 tentativas: a inicial mais 6 retentativas.

TentativaAtraso após a falha anterior
1imediata
21 minuto
35 minutos
415 minutos
51 hora
63 horas
76 horas

Após a sétima tentativa sem sucesso, a entrega é marcada como falha definitiva. Consulte o histórico em GET /api/public/v1/webhooks/{id}/deliveries.

Idempotência de eventos

O id do evento (também enviado no header Pitra-Event-Id) permanece estável em todas as tentativas da mesma entrega — apenas Pitra-Attempt muda. Como a entrega é at-least-once, o mesmo evento pode chegar mais de uma vez.

const eventId = req.header("Pitra-Event-Id");

if (await alreadyProcessed(eventId)) {
  return res.status(200).send("ok"); // duplicata: ignore
}

await markProcessed(eventId);
await handle(JSON.parse(rawBody));
Guarde os ids processados por pelo menos alguns dias e responda 200 também para duplicatas — assim a Pitra para de reenviar.

API v1 · OpenAPI 1.0.0 · SDK 0.1.0