Webhooks duales
Por qué una integración híbrida recibe dos formatos de webhook y cómo enrutarlos y deduplicarlos.
En el modelo Híbrido, una sola transacción puede emitir dos webhooks: uno en formato Long (de Hosted/SDK, para la tarjeta) y otro en formato Short (de API Direct, para métodos no-tarjeta, retiros y reembolsos). Esto es por diseño.
Por qué llegan webhooks duplicados
Como cada leg de tu integración (SDK/Hosted para tarjetas, API Direct para todo lo demás) tiene su
propio canal de webhooks, recibirás notificaciones de ambos. Un mismo pago puede generar un evento
Pending y luego un Success por cada canal involucrado.
Los webhooks duplicados en modo Híbrido son intencionales (Pending + Success). Correlaciona
ambos legs con metadata.external_id, y deduplica cada entrega con el header webhook-id
(Webhooks 2.0) o con id + event_type.
Qué necesitas configurar
- Dos endpoints de webhook, uno por estilo de integración. Con Webhooks 2.0, suscribe el endpoint de tarjetas a los eventos de Sesiones de checkout — Hosted y SDK y el otro a Pagos — API Direct y Retiros (ver el Catálogo de eventos). Sin Webhooks 2.0 cada URL registrada recibe ambos formatos, así que enruta por formato en tu handler.
- Lógica de manejo separada: webhooks estilo Hosted/SDK para las transacciones con tarjeta, y estilo API Direct para los demás métodos, retiros y reembolsos.
Lista de deduplicación
- Con Webhooks 2.0, deduplica con el header
webhook-id— un reintento o un reenvío trae el mismo. Sin Webhooks 2.0, deduplica conid+event_type. Correlaciona conmetadata.external_id, que se repite en cada evento de una transacción y funciona en los formatos Short + Long. - Guarda los
webhook-idprocesados durante al menos 60 días —un evento se puede reenviar mientras se conserva. - Mantén un índice
idempotency_keyen tu base de datos. - En modo Híbrido, trata el par Pending + Success como intencional.
- Verifica siempre el estado final con
GET /api/v1/transactions/{id}/. - Maneja los cinco estados terminales de retiros —
Success,Declined,Cancelled,FailedyReturned;Returnedllega después deSuccess.
