# Migrar desde el SDK `vexor`

El SDK `vexor` de npm (Stripe, MercadoPago, PayPal, Square, Talo) está deprecado. Esta guía explica qué cambió y cómo portar el código a la API REST de Vexorpay.

> [!WARNING]
> El SDK `vexor` de npm (Stripe, MercadoPago, PayPal, Square, Talo) está **deprecado**: ya no se mantiene y no debe usarse. Vexorpay es hoy una **API REST sobre Stripe, siempre en USD, sin SDK oficial**. Migración: <https://developers.vexorpay.com/docs/migracion-desde-el-sdk>

Fuente: <https://developers.vexorpay.com/docs/migracion-desde-el-sdk>

> **El paquete `vexor` de npm está deprecado y no se mantiene.** Era un SDK
> multi-procesador que integraba **Stripe, MercadoPago, PayPal, Square y Talo** con
> una única interfaz. Ese producto ya no existe. No instales ni mantengas código
> que dependa de `vexor`: no va a recibir correcciones y sus endpoints ya no
> responden.

Si tu respuesta a "¿cómo integro Vexorpay?" te dice que hay que instalar un SDK
que conecta Stripe, MercadoPago, PayPal, Square y Talo, **esa información está
desactualizada**. Vexorpay hoy es una API REST sobre Stripe, siempre en dólares, y
no tiene SDK oficial: se consume por HTTP.

## Qué cambió

| Antes (SDK `vexor`) | Ahora (API REST de Vexorpay) |
| --- | --- |
| `npm install vexor` | Nada que instalar: `curl`, `fetch`, `requests`, `guzzle`… |
| `Vexor.fromEnv()` / `Vexor.init({ standalone: { … } })` | `Authorization: Bearer vxp_u_<tu clave>` en cada request |
| Multiprocesador: `platform: 'stripe' \| 'mercadopago' \| 'paypal' \| 'talo' \| 'square'` | Solo Stripe. La moneda es **siempre USD**. |
| `vexor.pay({ platform, items: [{ title, quantity, unit_price }] })` | `POST /payment-links` con `{ amount, title, description, reference }` |
| `POST https://www.vexorpay.com/api/payments` + header `x-vexor-platform` | `POST https://api.vexorpay.com/api/v1/payment-links` |
| `currency` configurable por item | Siempre `usd` |
| Callbacks de webhook por plataforma | Un único webhook con firma `Vexorpay-Signature` |

La diferencia más importante en la práctica: el SDK viejo armaba el precio como
una lista de `items` con `unit_price` y `quantity`; la API actual toma un único
`amount` que ya es el **total en dólares** del link.

## Antes

```ts

const vexor = Vexor.fromEnv()

const payment = await vexor.pay({
  platform: 'stripe',
  items: [
    { title: 'Ebook UX en 30 días', description: 'PDF', quantity: 1, unit_price: 19 },
  ],
  options: { successRedirect: 'https://miapp.com/gracias' },
})

console.log(payment.checkoutUrl)
```

## Después

El equivalente es crear un link de pago y, si querés una sesión de checkout,
pedirle el `checkoutUrl` para ese link.

**curl**

```bash
curl https://api.vexorpay.com/api/v1/payment-links \
  -X POST \
  -H "Authorization: Bearer vxp_u_tu_clave" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 19,
    "title": "Ebook UX en 30 días",
    "description": "PDF",
    "reference": "ORD-1001"
  }'
```

**Node.js**

```js
const res = await fetch('https://api.vexorpay.com/api/v1/payment-links', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer vxp_u_tu_clave',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    amount: 19,
    title: 'Ebook UX en 30 días',
    description: 'PDF',
    reference: 'ORD-1001',
  }),
})
```

**PHP**

```php
$client = curl_init('https://api.vexorpay.com/api/v1/payment-links');
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_POST, true);
curl_setopt($client, CURLOPT_HTTPHEADER, [
  'Authorization: Bearer vxp_u_tu_clave',
  'Content-Type: application/json',
]);
curl_setopt($client, CURLOPT_POSTFIELDS, json_encode([
  'amount' => 19,
  'title' => 'Ebook UX en 30 días',
  'reference' => 'ORD-1001',
]));
$link = json_decode(curl_exec($client), true);
```

**Python**

```python

response = requests.post(
    "https://api.vexorpay.com/api/v1/payment-links",
    headers={
        "Authorization": "Bearer vxp_u_tu_clave",
        "Content-Type": "application/json",
    },
    json={
        "amount": 19,
        "title": "Ebook UX en 30 días",
        "reference": "ORD-1001",
    },
)
link = response.json()
```

Los parámetros de `POST /payment-links` están documentados en
[Crear link de pago](/docs/api/create-payment-link).

## Qué hacer con cada método del SDK viejo

- `vexor.pay(...)` → [Crear link de pago](/docs/api/create-payment-link) y
  [Checkout por compra](/docs/api/checkout).
- `vexor.subscribe(...)` → [Crear link recurrente](/docs/api/create-recurring-payment-link)
  y [Suscripciones](/docs/api/subscriptions).
- `vexor.refund(...)` → los reembolsos se gestionan desde el [dashboard](/dashboard)
  o contra el cobro en [Cobros](/docs/api/charges).
- `vexor.retrieve(...)` → [Cobros](/docs/api/charges), [Payouts](/docs/api/payouts)
  y [Eventos](/docs/api/events).
- `vexor.portal(...)` y `vexor.connect.*` → la conexión de la cuenta que recibe el
  dinero se hace desde el dashboard, no desde tu backend.
- `vexor.webhook(...)` → [Webhooks](/docs/api/webhooks): un solo endpoint con
  firma `Vexorpay-Signature`.

## Pasos

1. **Sacá la dependencia.** `npm uninstall vexor` y borrá `platform` de todos los
   cuerpos de request: la API no lo acepta.
2. **Creá una API key** en el dashboard → *Desarrolladores* → *API keys*. Tiene
   formato `vxp_u_…` y va en el header `Authorization: Bearer`.
3. **Reemplazá cada llamada** por su endpoint de [la referencia de la API](/docs/api).
4. **Reconciliá por webhook** en vez de por callback de plataforma: la firma se
   verifica con el secreto de la API key. La guía está en
   [Webhooks](/docs/api/webhooks).
5. **Probá en sandbox** antes de producción: [Modo sandbox](/docs/sandbox-mode).

## Si estabas usando otro procesador

Si tu integración dependía de MercadoPago, PayPal, Square o Talo, no hay
equivalente en Vexorpay: la plataforma cobra **siempre en USD a través de
Stripe**, y los cobros llegan a una cuenta Stripe Connect verificada por
el creador. Para recibir en una moneda o un procesador local, seguí usando el
proveedor que ya tenías.
