Ventas de Polar
Lista, consulta y reembolsa las ventas que cobra Polar (Merchant of Record) con tus links.
Cada venta (un pago único o la renovación de una suscripción) es una order de Polar. Polar es el Merchant of Record: cobra al comprador, calcula y liquida el impuesto, le manda el comprobante y te acredita la venta en tu saldo de Polar (ver Saldo).
El objeto Order
{
"id": "66f1c1e2c8a4b0d1f2e3a4d1",
"provider": "polar",
"polarOrderId": "5ca7caa3-d059-49aa-85c0-a0dfbee9844e",
"paymentLinkId": "66f1c1e2c8a4b0d1f2e3a4b5",
"polarSubscriptionId": null,
"polarCheckoutId": "8150f7d1-6404-48c2-8797-842e71a500ad",
"reference": "ORD-1001",
"metadata": { "utm_source": "instagram" },
"status": "paid",
"billingReason": "purchase",
"currency": "usd",
"subtotalCents": 2500,
"taxCents": 0,
"totalCents": 2500,
"netCents": 2337,
"refundedCents": 0,
"refundableCents": 2500,
"customerEmail": "cliente@ejemplo.com",
"customerName": "Ana Pérez",
"productName": "Curso de fotografía",
"seats": null,
"sandbox": false,
"createdAt": "2026-10-24T07:55:33.971Z"
}totalCentses lo que pagó el comprador ytaxCents, el impuesto que liquida Polar.netCentses el monto sin impuesto (después de descuentos): es lo que Polar acredita en tu saldo, y de ahí descuenta su comisión. Lo que te queda por cada venta lo ves en Movimientos del dashboard.subtotalCentses el precio antes de descuentos; si el precio tenía el impuesto incluido (compradores de la UE), el impuesto está adentro.refundableCentses lo que todavía se puede reembolsar (sin impuesto).status:paid,partially_refunded,refunded,pendingovoid.billingReason:purchase(pago único),subscription_createosubscription_cycle(renovación).referencees tu referencia para esa venta (p. ej. el id de tu orden),metadatatu metadata ypolarCheckoutIdel checkout de Polar que la generó. Ver abajo.
Identificar cada venta con tu referencia
Toda venta trae una referencia única en el campo reference, en sus webhooks (data.charge.reference) y en /events:
- Con el link público (
https://www.vexorpay.com/p/a1b2c3d4e5): cada visita genera una referencia nueva (VXP-+ 12 caracteres, p. ej.VXP-7KQ4M9TZ2HXA). Puedes compartir el mismo link con toda tu audiencia: cada compra sale con la suya, nunca dos ventas con la misma. - Con tu propio id: agrega
?reference=<tu-id>al link (/p/a1b2c3d4e5?reference=ORD-1001) o mandareferenceenPOST /api/v1/payment-links/{id}/checkout, y se usa la tuya en vez de la generada. El checkout por API sinreferencetambién genera una, y la respuesta la devuelve enreference(junto conpolarCheckoutId, que vuelve en la venta). - El link también acepta
utm_source,utm_medium,utm_campaign,utm_contentyutm_term, que quedan enmetadata.
En una suscripción, la referencia queda en la suscripción y cada renovación la hereda. Para buscar una venta por referencia: GET /api/v1/orders?reference=VXP-7KQ4M9TZ2HXA. La referencia admite hasta 200 caracteres. Las ventas anteriores al 2026-10-30 pagadas sin referencia tienen reference: null.
Listar ventas
GET /api/v1/orders
| Parámetro | Descripción |
|---|---|
status | Filtra por estado. |
payment_link_id | Ventas de un link. |
reference | Ventas con esa referencia tuya (coincidencia exacta). |
limit / starting_after / ending_before | Paginación por cursor (default 10, máximo 100). |
curl "https://api.vexorpay.com/api/v1/orders?status=paid" \
-H "Authorization: Bearer vxp_live_tu_clave"Ver una venta
GET /api/v1/orders/{id}
Devuelve la venta o 404 order_not_found.
Reembolsar una venta
POST /api/v1/orders/{id}/refund
Reembolsa una venta paid o partially_refunded, total o parcialmente. El dinero sale de tu saldo de Polar y el impuesto se devuelve en proporción. Es irreversible. Soporta Idempotency-Key: un replay devuelve la venta sin volver a reembolsar.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
amount | number | no | Dólares a reembolsar, sin impuesto. Si se omite, se reembolsa todo refundableCents. |
reason | string | no | customer_request (default), duplicate, fraudulent, service_disruption, satisfaction_guarantee u other. |
comment | string | no | Nota interna (hasta 500 caracteres). |
curl -X POST https://api.vexorpay.com/api/v1/orders/66f1c1e2c8a4b0d1f2e3a4d1/refund \
-H "Authorization: Bearer vxp_live_tu_clave" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: refund-ORD-1001" \
-d '{ "amount": 10, "reason": "customer_request" }'Devuelve la venta actualizada (refundedCents, refundableCents y status).
Errores
| Error | HTTP | Causa |
|---|---|---|
validation_error | 400 | status inválido, campo desconocido, amount fuera de rango, reason inválido o la venta no está pagada. |
order_not_found | 404 | No existe esa venta en tu cuenta (o es de otro modo). |
polar_reconnect_required | 409 | Tu conexión con Polar es anterior a los reembolsos: reconecta Polar desde el dashboard. |
idempotency_conflict | 409 | La Idempotency-Key ya se usó con un body distinto. |
polar_update_failed | 502 | Polar no procesó el reembolso. No se cambió nada: reintenta. |