Eventos de reconciliación
Consulta el histórico de eventos para reconciliar tus webhooks con la API.
GET /api/v1/events — histórico de eventos de negocio, estilo Stripe, para reconciliar lo que recibiste por webhook con la API.
Cómo funciona
Cada evento tiene un id determinístico (evt_...) que es exactamente el mismo que se envía firmado en los webhooks salientes (header Vexorpay-Event-Id). Por eso podés:
- Recibir un webhook
payment.completedconevt_abc. - Si tenés dudas o se perdió el POST, consultar
GET /api/v1/eventsy encontrar el mismoevt_abc. - Deduplicar: procesar cada
evt_una sola vez.
Los eventos de cobros (payment.completed, payment.failed, payment.refunded, payment.disputed) y de retiros (payout.paid) se pueden reconstruir desde la API en orden cronológico descendente.
Los eventos de suscripciones (subscription.*) y dispute.resolved existen como webhook pero no se materializan en este endpoint (solo se derivan de las colecciones de cobros y retiros). Aceptar esos type es válido, pero la respuesta viene vacía: para esos casos basate en el webhook.
Request
GET /api/v1/events
Parámetros
| Parámetro | Descripción |
|---|---|
type | Filtro: cualquiera de los 11 tipos de evento (ver Webhooks). En la práctica solo devuelve datos para payment.completed, payment.failed, payment.refunded, payment.disputed o payout.paid. |
created[gte] / created[lte] | Rango de fecha del evento (ISO 8601). |
sandbox | true (solo eventos de prueba) o false (solo producción). Sin el parámetro el default es solo el entorno de producción. |
limit / starting_after / ending_before | Paginación por cursor por id de evento (default 10, máximo 100). |
Ejemplo
curl "https://api.vexorpay.com/api/v1/events?type=payment.completed&limit=5" \
-H "Authorization: Bearer vxp_u_tu_clave"Respuesta exitosa
200 OK
{
"data": [
{
"id": "evt_6c2314a4fb4a408c07c2",
"type": "payment.completed",
"created": "2026-01-02T12:05:00.000Z",
"sandbox": false,
"data": {
"object": {
"charge": {
"id": "67f1c1e2c8a4b0d1f2e3a4b5",
"reference": "ORD-1001",
"amountCents": 1900,
"currency": "usd",
"status": "paid",
"sandbox": false,
"paidAt": "2026-01-02T12:05:00.000Z"
},
"payment_link": {
"id": "66f1c1e2c8a4b0d1f2e3a4b5",
"slug": "a1b2c3d4e5",
"title": "Ebook UX en 30 días",
"reference": "CATALOGO-UX"
}
}
}
}
],
"has_more": false,
"total_count": 1,
"url": "/v1/events?limit=5"
}El objeto dentro de data.object tiene la misma forma que el payload del webhook (charge + payment_link, o payout), más el campo sandbox —presente tanto en el evento raíz como dentro de charge—. En eventos payment.refunded se agregan refundedCents y recoveredCents, y en payment.disputed el objeto dispute (status, outcome, amountCents).
Errores
| Error | HTTP | Causa |
|---|---|---|
validation_error | 400 | type no es uno de los tipos de evento válidos. |