vexorpayDocs
vexorpayDocs
APIDocumentación de vexorpayPrimeros pasosVenta de producto digitalImpuestos y Merchant of Record

Core API

Referencia de APICrear link de pago únicoCrear link de pago recurrenteListar y obtener linksSuscripcionesCheckout por compraVentas de PolarClientesDisputasSaldoRetirosEventos de reconciliaciónCuentas conectadas (marketplace)Webhooks salientesAutenticación

Recursos

vexorpay MCPEspecificación OpenAPIMigrar desde el SDK `vexor`PostmanComunidadModo sandbox

Crear link de pago recurrente

Crea planes por suscripción (pagos recurrentes) en dólares con la API de vexorpay.

Un link recurrente agrupa hasta 5 planes (precios por ciclo) y permite cobrar automáticamente cada período. El comprador elige un plan en url y paga en el checkout de Polar; a partir de ahí Polar cobra la suscripción cada ciclo.

El link y sus planes se crean en Polar, el Merchant of Record: Polar cobra cada ciclo, calcula el impuesto y acredita cada renovación en tu saldo de Polar. Necesitas Polar conectado (si no, 400 account_not_connected). Ver Suscripciones.

Request

POST /api/v1/payment-links

Headers

HeaderValor
AuthorizationBearer vxp_live_tu_clave
Content-Typeapplication/json
Idempotency-Keyopcional — para repetir sin duplicar
Vexor-Accountopcional — id del usuario conectado, para crear el link en su nombre (cuentas conectadas)

Body

CampoTipoRequeridoDescripción
typestringsí"recurring".
pricesarraysíEntre 1 y 5 planes.
titlestringnoTítulo del link.
descriptionstringnoDescripción.
image_file_idstringnoFoto del producto (archivo tuyo subido desde el dashboard).
referencestringnoReferencia tuya para reconciliar.
metadataobjectnoPares clave/valor libres.

Cada elemento de prices

CampoTipoRequeridoDescripción
amountnumbersíPrecio por ciclo en dólares. Mínimo USD 4, o 0 para un plan gratis de precio fijo (el comprador se suscribe sin tarjeta).
intervalstringsíday, week, month o year.
interval_countnumbernoCada N intervalos (entero 1–12, default 1). El intervalo year solo admite 1.
trial_period_daysnumbernoDías de prueba gratis (1–90).
descriptionstringnoNombre visible del plan ("Básico", "Pro", "Anual"…).
pricing_typestringnoflat (default) o per_seat: el comprador elige cuántos asientos compra.
per_seat_amountnumbernoPrecio de cada asiento en dólares (variante "base + extra").
min_seatsintegernoAsientos mínimos (default 1, máximo 1000).
max_seatsintegernoAsientos máximos (sin límite por default).
seat_tiersarraynoMatriz de tramos. Cada elemento: up_to (null = sin límite, solo en el último) y unit_amount o flat_amount, en centavos (a diferencia de amount, que va en dólares).
tiers_modestringnograduated (cada tramo se suma) o volume (se aplica el tramo del total). Requiere seat_tiers.

Todos los planes deben ser en USD. El link en sí queda con amountCents: 0; el precio real vive en cada plan.

Planes por asientos

Con pricing_type: "per_seat" el plan admite tres formas de precio:

VarianteCamposTotal para N asientos
Mismo precio por asientosolo min_seats/max_seatsN × amount
Base + precio por asiento extraamount + per_seat_amountamount + (N − 1) × per_seat_amount
Tramos por volumenseat_tiers + tiers_modesegún la matriz (abajo)

La matriz de seat_tiers arranca en el primer asiento y el último tramo siempre es abierto (up_to: null). En graduated cada tramo se suma a los anteriores; en volume la tasa del tramo alcanzado se aplica a todos los asientos. Máximo 10 tramos. Cada tramo lleva unit_amount (por asiento) o flat_amount (cargo fijo del tramo), en centavos:

{
  "amount": 0,
  "interval": "month",
  "pricing_type": "per_seat",
  "tiers_mode": "graduated",
  "seat_tiers": [
    { "up_to": 5,    "unit_amount": 900 },
    { "up_to": 20,   "unit_amount": 700 },
    { "up_to": null, "unit_amount": 500 }
  ]
}

Con esa matriz (graduated), 3 asientos cuestan USD 27, 10 cuestan USD 80 y 30 cuestan USD 200.

La API rechaza con validation_error cualquier key desconocida dentro de un plan, así que un typo (por ejemplo seats en vez de min_seats) no se ignora en silencio: falla el request.

Ejemplo

curl https://api.vexorpay.com/api/v1/payment-links \
  -X POST \
  -H "Authorization: Bearer vxp_live_tu_clave" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "recurring",
    "title": "Membresía Vexor",
    "reference": "MEMBRESIA",
    "prices": [
      {
        "amount": 9,
        "interval": "month",
        "description": "Mensual"
      },
      {
        "amount": 90,
        "interval": "year",
        "trial_period_days": 7,
        "description": "Anual"
      }
    ]
  }'

Respuesta exitosa

201 Created

{
  "id": "66f1c1e2c8a4b0d1f2e3a4b6",
  "amountCents": 0,
  "currency": "usd",
  "title": "Membresía Vexor",
  "description": null,
  "image": null,
  "reference": "MEMBRESIA",
  "metadata": null,
  "status": "active",
  "slug": "b2c3d4e5f6",
  "sandbox": false,
  "url": "https://www.vexorpay.com/p/b2c3d4e5f6",
  "checkoutUrl": "https://buy.polar.sh/polar_cl_...",
  "type": "recurring",
  "prices": [
    {
      "id": "66f1c1e2c8a4b0d1f2e3a4c1",
      "amountCents": 900,
      "currency": "usd",
      "interval": "month",
      "intervalCount": 1,
      "trialPeriodDays": null,
      "description": "Mensual",
      "isDefault": true
    },
    {
      "id": "66f1c1e2c8a4b0d1f2e3a4c2",
      "amountCents": 9000,
      "currency": "usd",
      "interval": "year",
      "intervalCount": 1,
      "trialPeriodDays": 7,
      "description": "Anual",
      "isDefault": false
    }
  ],
  "createdAt": "2026-01-02T12:00:00.000Z",
  "updatedAt": "2026-01-02T12:00:00.000Z"
}

checkoutUrl es el checkout de Polar del link. El comprador también puede elegir el plan desde url, o puedes llevarlo directo a un plan con POST /v1/payment-links/{id}/checkout y price_id. El tipo del link no se puede cambiar con PATCH; de los planes existentes se editan el precio, el nombre y la prueba gratis. Agregar o quitar planes, o cambiar el intervalo o los asientos, exige un link nuevo (ver Listar y gestionar links).

Errores

ErrorHTTPCausa
unauthorized401Falta el header Authorization.
invalid_key401La API key es inválida o fue revocada.
prices_required400type: "recurring" sin prices[].
too_many_prices400Más de 5 planes.
minimum_amount400Algún plan es menor a USD 4.
invalid_interval400interval distinto de day, week, month o year.
invalid_pricing_type400pricing_type no es flat ni per_seat.
invalid_seat_tiers400Matriz seat_tiers inválida: no es una lista, está vacía, el primer tramo no arranca en el asiento 1, los tramos se pisan, o un plan de precio fijo define tramos.
invalid_tiers_mode400tiers_mode no es graduated ni volume, o se indicó sin seat_tiers.
validation_error400Otros datos inválidos (p. ej. moneda distinta de USD).
invalid_interval_count400interval_count fuera de 1–12 (o year ≠ 1).
invalid_trial400trial_period_days fuera de 1–90.
account_not_connected400No conectaste Polar (o la conexión se revocó): conéctalo desde el dashboard.
unsupported_plan400Un plan no se puede expresar en Polar (p. ej. una combinación de precio por asiento no soportada).
polar_test_key_not_supported400Una clave de prueba (vxp_test_...) no puede crear links en producción. Usa una clave de producción.
polar_not_ready409La organización de Polar todavía no puede cobrar: completá su verificación en Polar y reintentá.
idempotency_conflict409La Idempotency-Key ya se usó con un body distinto.
polar_provisioning_failed500Polar rechazó la creación del link. No quedó nada publicado: reintentá.
rate_limited429Superaste el límite de 100 requests por minuto.

Crear link de pago único

Crea un link de pago único en dólares con la API de vexorpay.

Listar y obtener links

Consulta, actualiza y cancela los links de pago de tu cuenta con filtros y paginación.

On this page

RequestHeadersBodyCada elemento de pricesPlanes por asientosEjemploRespuesta exitosaErrores