Webhooks API
Contratos para ingestão de eventos, replay controlado e rastreabilidade operacional.
reference • updated 2026-03-17
Objetivo
Ingerir eventos Stripe com validação criptográfica, deduplicação por evento e capacidade de replay controlado para recuperação operacional.
Endpoints principais
| Endpoint | Utilização | Segurança |
|---|---|---|
POST /api/webhooks/stripe?org={slug}&mode={test|live} | eventos Stripe gerais e deduplicação técnica | assinatura Stripe obrigatória |
POST /api/webhooks/stripe/billing?org={slug}&mode={test|live} | eventos dedicados a billing/subscrições | assinatura Stripe obrigatória |
POST /api/billing/webhooks/{webhookEventId}/replay?org={slug}&mode={test|live} | replay manual de um webhook já persistido | Bearer token Beacon + OWNER/ADMIN |
Modelo de processamento
11) Receber evento
Validar assinatura e formato mínimo do payload.22) Deduplicar
Usarevent.idcomo chave lógica de deduplicação; duplicados devolvemduplicate: true.33) Persistir e processar
GuardarwebhookEventIdinterno e executar o pipeline assíncrono.44) Confirmar estado
Atualizar estado funcional e métricas de entrega; billing pode upsertar subscrições.
URLs canónicas por ambiente
test:https://test.beacon.pt/api/webhooks/stripe?org=<organization_slug>&mode=testlive:https://app.beacon.pt/api/webhooks/stripe?org=<organization_slug>&mode=live- Se usares o endpoint dedicado de billing, mantém a mesma convenção em
/api/webhooks/stripe/billing.
Política de retries e replay
- Retries automáticos devem manter contexto original do evento.
- Replay manual usa o identificador interno
webhookEventId, não oevent.idda Stripe. - Nunca executar replay massivo sem priorização por impacto e sem janela de controlo.
Exemplo de resposta do endpoint geral
{
"ok": true,
"webhookEventId": "whevt_123",
"eventId": "evt_123",
"mode": "test",
"duplicate": false
}
Exemplo de replay manual
curl -X POST "https://test.beacon.pt/api/billing/webhooks/whevt_123/replay?org=acme&mode=test" \
-H "Authorization: Bearer <beacon_session_token>"
{
"ok": true,
"webhookEventId": "whevt_123",
"queueJobId": "job_123",
"replayScheduled": true,
"context": {
"mode": "test",
"organizationSlug": "acme"
}
}
Erros e sinais operacionais
| Sinal | Significado | Ação |
|---|---|---|
aumento de 4xx | falha de assinatura/payload | rever segredo e contrato do endpoint |
| backlog crescente | consumer lento ou bloqueado | aumentar capacidade, priorizar eventos críticos |
| duplicados processados | deduplicação incompleta | reforçar correlação por event.id e rever persistência do webhookEventId |