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 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 puedes:
- Recibir un webhook
payment.completedconevt_abc. - Si tienes 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 ventas de Polar (payment.completed, payment.refunded, payment.disputed) y de retiros de Polar (payout.paid) se pueden reconstruir desde la API en orden cronológico descendente.
Los eventos de suscripciones (subscription.*), payment.failed y dispute.resolved existen como webhook pero no se materializan en este endpoint (solo se derivan de las ventas y los retiros). Aceptar esos type es válido, pero la respuesta viene vacía: para esos casos básate 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.refunded, payment.disputed o payout.paid. |
created[gte] / created[lte] | Rango de fecha del evento (ISO 8601). |
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_live_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",
"provider": "polar",
"reference": "ORD-1001",
"metadata": null,
"polarOrderId": "59f4a98b-7034-437d-92b7-f463758ba69f",
"polarCheckoutId": "8150f7d1-6404-48c2-8797-842e71a500ad",
"amountCents": 1900,
"currency": "usd",
"status": "paid",
"sandbox": false,
"refundedCents": 0,
"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—. charge.id es el id de la venta en GET /api/v1/orders/{id}, amountCents es el total que pagó el comprador y refundedCents lo reembolsado. charge.reference es tu referencia de la venta y payment_link.reference la del link. En payout.paid, payout es el retiro de Polar (misma forma que en Retiros).
Errores
| Error | HTTP | Causa |
|---|---|---|
validation_error | 400 | type no es uno de los tipos de evento válidos. |