Dos superficies, una fuente de verdad
completed, la dirección recibiendo un depósito). Existe haya o no webhook configurado — partners sin URL configurada igual pueden hacer GET /events y recuperar todo lo registrado.
Forma del objeto
Tipos de evento
payment_intent.completed
Un payment intent llegó al estado completed — los depósitos acumulados igualaron o superaron el monto solicitado.
related_to_kind:payment_intentrelated_to: UUID del intent- Webhook wire name:
payment.completed(legacy; el tipo canónico para filtrar enGET /events?type=…espayment_intent.completed). - Dispara exactamente una vez por intent, en la transición terminal.
data: ver forma arriba.
payment_intent.payment_received
Un depósito aterrizó en una dirección del intent — dispara en cada crédito, incluyendo parciales. Distinto de payment_intent.completed:
Este evento es aditivo — integraciones existentes que sólo manejan
payment.completed siguen funcionando sin cambios. Suscríbete a payment.received si quieres notificaciones per-depósito (p. ej. barras de progreso de pago parcial o detección de carritos abandonados).
related_to_kind:payment_intentrelated_to: UUID del intent- Webhook wire name:
payment.received(canónico:payment_intent.payment_received). dataagrega tres campos cumulativos encima del base per-depósito:
partial_payment para decidir qué renderizar:
payment.received con partial_payment=false, después payment.completed. Cada uno carga su propio event_id así que la deduplicación receiver-side (sobre X-ZoPay-Event-Id) los maneja correctamente.
address.deposit.received (próximamente)
Un depósito aterrizó en una dirección estándar provisionada con POST /addresses (no asociada a un intent). Es la señal de wallet whitelabel: tu usuario depositó crypto en la dirección que minteaste para él y necesitas acreditar su balance interno.
related_to_kind:addressrelated_to: UUID de la dirección- Webhook wire name:
address.deposit.received
payment_intent.payment_received (y payment_intent.completed en el que cierra). Si cae en una dirección estándar sin intent → address.deposit.received. Nunca ambos paths para el mismo depósito.
Tu handler debe rutear por type, no por la URL — así estará listo cuando este tipo se active.
Operaciones
- Listar eventos —
GET /eventscon filtros portype,related_to,livemode,from/to,cursor,limit. - Consultar un evento —
GET /events/{event_id}. - Replicar un evento —
POST /events/{event_id}/replayencola una nueva entrega webhook con el mismoevt_….
Receta: “Mi handler nunca recibió el webhook del evento X”
- Encuentra el evento con
GET /events?related_to=<intent-id>o por rango temporal?from=…&to=…. - Inspecciona el evento (
GET /events/{id}). Si falta entero, el problema está aguas arriba del log — abre ticket con el hash on-chain. - Revisa el estado de entrega en el dashboard (delivery rows asociadas).
- Arregla lo que sea (servidor caído, secreto rotado, endpoint deshabilitado, etc.).
- Replay:
POST /events/{id}/replayconIdempotency-Key. ElX-ZoPay-Event-Idserá el mismo, así que tu deduplicación lo reconocerá. - Confirma en el dashboard que la entrega nueva llegó a
delivered.