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).
- 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. - El pago se completa
Igual que sin la instrucción:
payment.completed, tu saldo en VES acreditado y las comisiones de siempre. - Conversión
VEXPay convierte el
netVesdel 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. - 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.completedcontxHash).
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".
| status | Qué significa | Tu dinero |
|---|---|---|
| pending | El pago aún no se completa | No se movió nada |
| converting | La conversión existe y no se ha completado | VES debitados, USDT aún no acreditados |
| waiting_release | Convertido; los USDT están en la retención de 24 h hasta sendAfter | USDT en tu saldo, retenidos |
| sending | El pago de USDT existe y no es final | USDT reservados para el pago |
| completed | El pago se completó (txHash) | Enviados a la dirección |
| held | Se detuvo antes de un paso que no podía dar (reason) | Queda en tu saldo en VES o USDT |
| failed | El pago de USDT falló (reason: payout_failed) | USDT y comisión de vuelta en tu saldo USDT |
| canceled | El 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
| reason | Cuándo | Dónde queda el dinero |
|---|---|---|
| below_conversion_minimum | Los VES netos valen menos que tu mínimo de conversión | Saldo en VES |
| below_payout_minimum | Los USDT menos la comisión de red quedan bajo el mínimo de pago de la red | Saldo en USDT |
| daily_limit_exceeded | Alcanzaste tu tope diario de conversión | Saldo en VES |
| insufficient_balance | Tu saldo disponible ya no cubre el paso | Saldo en VES o USDT |
| onward_payout_unavailable | Se desactivaron USDT o las conversiones en tu cuenta | Saldo 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
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" }
}'{
"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.