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
| Campo | Notas |
|---|---|
id | ULID con prefijo evt_ + 26 chars Crockford base32. Mismo id aparece en el body de webhook (event_id) y en el header X-ZoPay-Event-Id de cada entrega y replay. |
object | Siempre event. Discriminador estilo Stripe. |
type | Tipo del evento (ver abajo). |
livemode | true si el evento se produjo en modo live; false en sandbox. |
related_to | UUID del objeto principal del evento. Para payment_intent.completed, el id del intent. |
related_to_kind | Tabla a la que apunta related_to. Hoy: payment_intent. |
api_version | Versión del schema del payload. Hoy v1. Cambios incompatibles bumpan; eventos viejos se leen en su versión original. |
created_at | Timestamp del servidor cuando se escribió la fila. |
data | Payload de negocio. Su forma depende de type. |
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). data: ver forma arriba.
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.completed. Si cae en una dirección estándar sin intent → address.deposit.received. Nunca ambos.
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.