Developer guide
VEXPay siteAPI reference
Browse documentation

Recipe: top-ups paid in bolívares, received in USDT

Your user pays in bolívares; VEXPay converts the net to USDT and sends it to their wallet once the 24h hold ends — one request, no treasury on your side.

What you will build

A top-up flow for wallets, exchanges or games: the user pays in bolívares (Pago Móvil or C2P) and receives USDT at a wallet address. You add one field, onwardPayout, and follow one webhook.

  1. Collect

    The pay-in carries onwardPayout with the user’s network and address.

  2. Convert

    When the payment completes, its net VES is converted at your conversion price (market rate + your spread).

  3. Wait for the hold

    The USDT stays held until the payment’s 24h hold ends: status waiting_release with sendAfter.

  4. Send

    VEXPay sends the USDT minus the network payout fee to the address and fires payout.completed.

Step 01

Collect with an onward instruction

Pago Móvil verify (curl)bash
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" }
  }'

VEXPay validates the instruction before touching the bank: USDT and conversions must be enabled, the network’s payouts on, and the address valid for the network. A bad instruction answers 400 and nothing moves.

Step 02

Follow it to the wallet

onwardPayout.statusWhat it meansShow your user
pendingThe payment has not completed yetWaiting for your payment
convertingConverting the net bolívares to USDTConverting
waiting_releaseConverted; held until sendAfter (24h balance hold)Your USDT will be sent at sendAfter
sendingThe USDT payout is on its waySending
completedDelivered (txHash set)Done — show the transaction
held / failed / canceledStopped (see reason); the money stays in your balanceContact support

Every change fires onward_payout.updated with the same object. Subscribe to it and show sendAfter to your user while the status is waiting_release, so they know when to expect the USDT.

Step 03

What it costs your user

  • The bolívar pay-in fee, as for any payment.
  • The conversion price: the market USDT rate plus your spread, fixed when the payment completes.
  • The USDT payout fee of the network (network fee + VEXPay’s 0.25 USDT margin; for example 1.00 USDT on BEP20 or Polygon). GET /v1/crypto/networks shows the live fee.