Guía para desarrolladores
Sitio de VEXPayReferencia de API
Explorar documentación

Cobra en bolívares y envía USDT a una wallet

Agrega un envío de USDT a un cobro por Pago Móvil o C2P: cuando se completa, VEXPay convierte sus VES netos a USDT y los envía a la wallet que indicaste, sin más llamadas a la API.

Cómo funciona

Envía onwardPayout con POST /v1/payments/pago-movil/verify, POST /v1/payments/c2p/request o POST /v1/payments/c2p. Cuando el pago se completa, VEXPay encadena dos pasos que también podrías hacer tú: una conversión VES → USDT de los VES netos del pago (ver Convertir VES o COP a USDT) y luego un pago de USDT, menos la comisión de red, a la dirección (ver USDT y USDC).

  1. Cobra con la instrucción

    Agrega "onwardPayout": { "network": "BEP20", "address": "0x…" } al cobro. VEXPay la revisa antes de llamar al banco: tu cuenta debe tener USDT y conversiones activos, los pagos de esa red deben estar activos y la dirección debe tener el formato de la red. Una instrucción inválida responde 400 y no se mueve dinero.

  2. El pago se completa

    Igual que sin la instrucción: payment.completed, tu saldo en VES acreditado y las comisiones de siempre.

  3. Conversión

    VEXPay convierte el netVes del pago (monto menos comisiones de VEXPay y de aplicación) a tu precio de conversión habitual: la tasa de mercado al completarse el pago más tu spread. La tasa no se muestra antes; la trae el objeto de la conversión.

  4. Envío

    Cuando la conversión se completa, VEXPay envía sus USDT menos la comisión de la red a la dirección, como un pago de USDT normal (payout.completed con txHash).

Estados y el webhook

El pago (GET /v1/payments/:id y cada webhook payment.*) trae onwardPayout: status, network, address, conversionId, payoutId, amountUsdt, feeUsdt, txHash, reason y updatedAt. Cada cambio de estado envía además onward_payout.updated con paymentId, customerRef y el mismo objeto; suscríbete en el grupo "Onward payout".

statusQué significaTu dinero
pendingEl pago aún no se completaNo se movió nada
convertingLa conversión existe y no se ha completadoVES debitados, USDT aún no acreditados
waiting_releaseConvertido; los USDT están en la retención de 24 h hasta sendAfterUSDT en tu saldo, retenidos
sendingEl pago de USDT existe y no es finalUSDT reservados para el pago
completedEl pago se completó (txHash)Enviados a la dirección
heldSe detuvo antes de un paso que no podía dar (reason)Queda en tu saldo en VES o USDT
failedEl pago de USDT falló (reason: payout_failed)USDT y comisión de vuelta en tu saldo USDT
canceledEl cobro falló o se reversó, o la conversión se canceló (reason)VES de vuelta en (o nunca salieron de) tu saldo

completed, held, failed y canceled son finales: VEXPay no continúa después. Lo que quede en tu saldo es tuyo para convertir o enviar como siempre.

Mínimos y retenciones

reasonCuándoDónde queda el dinero
below_conversion_minimumLos VES netos valen menos que tu mínimo de conversiónSaldo en VES
below_payout_minimumLos USDT menos la comisión de red quedan bajo el mínimo de pago de la redSaldo en USDT
daily_limit_exceededAlcanzaste tu tope diario de conversiónSaldo en VES
insufficient_balanceTu saldo disponible ya no cubre el pasoSaldo en VES o USDT
onward_payout_unavailableSe desactivaron USDT o las conversiones en tu cuentaSaldo en VES

Mínimos y comisiones son los mismos de cualquier conversión y pago de USDT: ver GET /v1/conversions/settings y GET /v1/crypto/networks.

Reversos

Un pago C2P se puede reversar mientras su envío siga en pending (la instrucción se cancela). Una vez que existe su conversión, POST /v1/payments/:id/reverse responde 409 onward_payout_in_progress.

Ejemplo

cURLbash
curl --request POST "${API_URL}/v1/payments/pago-movil/verify" \
  --header "content-type: application/json" \
  --header "x-api-key: ${VEXPAY_API_KEY}" \
  --data '{
    "usdAmount": 20,
    "reference": "40010003",
    "externalRef": "topup-user-42",
    "onwardPayout": { "network": "BEP20", "address": "0x2f5c0000000000000000000000000000000000aa" }
  }'
Webhook (onward_payout.updated)json
{
  "event": "onward_payout.updated",
  "data": {
    "paymentId": "6f1c…",
    "externalRef": "topup-user-42",
    "onwardPayout": {
      "status": "completed",
      "network": "BEP20",
      "address": "0x2f5c0000000000000000000000000000000000aa",
      "conversionId": "c1a2…",
      "payoutId": "9b7e…",
      "amountUsdt": "18.94",
      "feeUsdt": "0.75",
      "txHash": "0x8e1d…",
      "updatedAt": "2026-10-15T14:03:11.000Z"
    }
  }
}

Pruebas

Con una clave de prueba toda la cadena corre en el sandbox: la conversión y el pago se completan al instante y no se envía nada on-chain, así que recibes converting, sending y completed segundos después del cobro.