Developer guide
VEXPay siteAPI reference
Browse documentation

Balances, holds and payouts

What is available, what waits for bank confirmation and why, how automatic settlement works, what payouts cost, and how to reconcile it all.

The parts of a balance

Each currency (bolívares, USDT, USDC, Colombian pesos) has its own balance. Inside each one, your money is in one of these states:

StateWhat it isCan be paid out?
AvailableReleased money you can withdraw, pay out or convertYes
Awaiting bank confirmation (Bs only)Bolívar payments the bank has not confirmed yet (unconfirmedVes)Not yet — it becomes available on its own once the bank confirms it
HeldA balance hold VEX Pay set for your account, if any (none by default)Not yet — it becomes available on its own
Reserve (Bs only)A safety buffer set by VEX Pay for your account, if anyNo
Pending payoutReserved by payouts that are on their wayAlready leaving
Bolívaresbash
curl "${API_URL}/v1/balance" --header "x-api-key: ${VEXPAY_API_KEY}"
# availableVes = ledgerNetVes − reserveVes − heldVes − unconfirmedVes
USDT / USDCbash
curl "${API_URL}/v1/crypto/balances" --header "x-api-key: ${VEXPAY_API_KEY}"
# each: available, held, nextReleaseAt, pendingPayout (USDT also availableUsdt, heldUsdt)
Pesosbash
curl "${API_URL}/v1/cop/balance" --header "x-api-key: ${VEXPAY_API_KEY}"
# availableCop, heldCop, nextReleaseAt, pendingPayoutCop

Bank confirmation (no 24h hold)

There is no time-based hold by default (balanceHoldHours is 0). A bolívar payment counts toward availableVes once the bank confirms the money arrived; until then it is in unconfirmedVes. Nothing needs to happen on your side and no webhook is sent when it clears. USDT and pesos are available as soon as they are credited, except USDT bought (converted) with bolívares still awaiting bank confirmation: it shows as held (heldUsdt, with no nextReleaseAt) and becomes available once the bank confirms every payment it was paid from.

MovementWaits for the bank?
Completed bolívar payments, net of the VEXPay feeYes — until the bank confirms the payment
Bolívar payments the bank cannot findYes — they stay out of available until VEXPay resolves them
USDT, USDC and peso paymentsNo
Money coming back: failed payouts, canceled conversions, fee reversalsNo — it returns exactly as it left
While bolívares await the bank, you can…Rule
Pay out to your bank or a sellerNo — payouts spend bank-confirmed money only
Convert to USDTYes
Transfer to a sellerYes
Refund or reverse the paymentYes, when your balance covers it

Automatic settlement

In live mode, every 15 minutes VEXPay sends your available bolívares to your verified payout account as an instant payout — two when your balance arrived through more than one bank, since each payout leaves in one bank transfer. It goes through the same path as POST /v1/payouts/instant: your instant payout fee applies, the payout appears in GET /v1/payouts, and you receive the usual payout.* webhooks.

DetailValue
What is sentAll of availableVes, in at most two payouts per run; each one is sent once it reaches the minimum (settlement.minimumVes, Bs 100.00 by default), and a smaller part waits for a later run
How to recognize itexternalRef starts with auto_settle_; the bank concept reads “Liquidacion VEX Pay”
If it failsThe money returns to your balance and the next run tries again
No verified payout accountNothing is sent; your balance stays until you add and verify one
Your statussettlement on GET /v1/balance: enabled and status (for example active, no_payout_account, opted_out, test_mode)

You can still withdraw yourself between runs with POST /v1/payouts/instant. Accounts that pay sellers or disbursements from their balance can ask VEXPay to turn automatic settlement off.

When a payout is refused

A payout larger than the available part answers 422 insufficient_balance with the amounts you need to decide what to do:

422 insufficient_balancejson
{
  "error": "insufficient_balance",
  "availableVes": "3000.00",
  "requestedVes": "4000.00",
  "heldVes": "0.00",
  "unconfirmedVes": "4342.50",
  "nextReleaseAt": null,
  "maxPayoutVes": "3000.00"
}
  • Pay out at most the available amount now. unconfirmedVes becomes available as the bank confirms each payment.
  • A Bs payout is sent as one bank transfer and is never split, so the most a single payout can take is maxPayoutVes, which can be lower than availableVes. Send that amount, then the rest in a second payout.
  • Do not retry in a loop — nothing changes until the bank confirms a payment or new money arrives.
  • USDT payouts answer the same way with availableUsdt, heldUsdt and nextReleaseAt; ops COP payouts with availableCop and heldCop.

What payouts cost

PayoutFee
To your own bank account (instant withdrawal)Your bolívar percentage on the amount withdrawn
To your verified sellersFree (a seller payout fee may apply by agreement)
USDT to an external walletThe network’s payout fee, shown by GET /v1/crypto/networks
USDC to an external walletThe network’s payout fee, shown by GET /v1/crypto/networks
To one of your own deposit addressesFree — settled inside VEXPay

GET /v1/crypto/networks returns the exact payout fee per network before you send. The fee is reserved together with the amount and returned if the payout fails.

Reconcile it

  1. Walk the movements

    GET /v1/balance/transactions lists every bolívar movement. The sum equals ledgerNetVes.

  2. Account for bank confirmation

    Sum minus reserveVes minus heldVes minus unconfirmedVes equals availableVes. Automatic settlements are payouts with an externalRef starting with auto_settle_.

  3. Alert on drift

    If your books disagree, the missing movement is in that list — match it by id.