Disbursements: pay your end users from your sales
Credit each of your end users (staff, contractors, affiliates) in dollars at the BCV rate out of the money you collect, let them withdraw to their own Pago Móvil, and download a monthly statement per person.
What you will do
Your sales land in your VEXPay balance. Each pay period you credit every end user an amount in dollars; VEXPay converts it at the official BCV rate and keeps it in that person's balance. Each person then withdraws to their own Pago Móvil when they want, through your own system. You pay the withdrawal fee, not them. Each end user is a merchant in the API.
- Disbursements turned on for your account. Ask VEXPay; it works in Test mode right away and in Live after go-live approval.
- Your server holds your API key. Your end users never sign in to VEXPay: your admin system calls the API for them.
- Each end user registered with a verified Pago Móvil (see Onboard a seller).
Steps
- Collect
Sell with payment links, checkout sessions or charges as usual. Each bolívar sale is available in your balance once the bank confirms it (
unconfirmedVesuntil then). - Register your end users
POST /v1/merchantsonce per person, then add and verify their Pago Móvil payout method. Keep the returnedmerchantIdin your system next to the person. - Credit each person in dollars
POST /v1/merchants/:id/transferswithamountUsdand atransferKeythat is unique per person and pay period (for example2026-11-q1-emp-104). The response showsamountVes, therateandrateAsOf. Sending the sametransferKeyagain returns the first result, never a second credit at a new rate. - The person withdraws
When the person asks for a withdrawal in your system, call
POST /v1/payoutswith theirmerchantId, the bolívarmonto,concepto, a uniqueexternalRefandfromMerchantBalance: true. They receive the fullmonto; the withdrawal fee is charged to your balance. - Download the month
GET /v1/merchants/:id/statement?month=2026-11(add&format=csvfor a file), or Portal → Merchants → Monthly statement for one person or everyone in one CSV.
curl --request POST "${API_URL}/v1/merchants/MERCHANT_ID/transfers" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{
"amountUsd": "100.00",
"transferKey": "2026-11-q1-emp-104"
}'
# → { "pendingVes": "...", "availableVes": "...",
# "transfer": { "amountVes": "21540.00", "amountUsd": "100.00", "rate": "215.4000", "rateSource": "bcv", ... } }curl --request POST "${API_URL}/v1/payouts" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{
"merchantId": "MERCHANT_ID",
"monto": "20000.00",
"concepto": "Retiro",
"externalRef": "wd-emp-104-0001",
"fromMerchantBalance": true
}'curl "${API_URL}/v1/merchants/MERCHANT_ID/statement?month=2026-11&format=csv" \
--header "x-api-key: ${VEXPAY_API_KEY}" --output emp-104-2026-11.csvWhen the money can be withdrawn
A credit paid with money that is already available in your balance can be withdrawn at once. A credit paid with sales the bank has not confirmed yet sits in the person's pendingVes and moves to availableVes when they are confirmed. Crediting after the sales are confirmed avoids the wait.
The withdrawal fee
Each withdrawal costs a percentage of monto with a minimum in dollars, plus a fixed part in dollars; the dollar parts convert at the BCV rate of that moment. VEXPay agrees the price with you before you go live.
| Example: 1% (min $0.25) + $0.25, BCV 215.40 | Fee |
|---|---|
| Withdrawal of Bs 20,000.00 | Bs 200.00 + Bs 53.85 = Bs 253.85 |
| Withdrawal of Bs 2,000.00 | Bs 53.85 (minimum) + Bs 53.85 = Bs 107.70 |
- The payout shows
feeVesandfeePayer: "tenant"; the person was debited onlymonto. - Your balance shows a
disbursement_payout_feemovement. If the bank rejects the withdrawal,montogoes back to the person and the fee back to you (disbursement_payout_fee_reversal). - Keep a small reserve in your balance: if it cannot cover the fee, the withdrawal is refused with 422
insufficient_balanceandreason: "tenant_fee_unfunded".
Add money that is not a sale (top-ups)
When the money you pay out comes from outside your sales (for example advertising income), load it into your balance with a top-up: you send a Pago Móvil to VEXPay and it is credited to your balance. Top-ups are turned on by VEXPay, with a monthly limit agreed with you. A top-up is not a sale: it fires no payment.completed webhook and does not count as sales volume.
- Start the top-up
POST /v1/balance/topupswithamountVes, thepayerPhoneandpayerCedulayou will pay from, and asourceNotesaying where the money comes from (at least 10 characters). Or use Portal → Balance movements → Load balance. - Send the Pago Móvil
Send exactly
amountVesfrom that phone to thereceiverin the response (bank code, phone, ID) within 15 minutes. Pick the bank by its code in your bank app. - It completes on its own
GET /v1/balance/topups/:idmoves tocompletedwhen the transfer arrives. You are creditedcreditedVes= amount − fee. It follows your account's balance hold, if any (none by default). - Optional: make it available now
If your account has a hold,
POST /v1/balance/topups/:id/instantreleases the held part at once forinstantFeePercentof it (instantFeeVes). Calling it again charges nothing more.
curl --request POST "${API_URL}/v1/balance/topups" \
--header "content-type: application/json" \
--header "x-api-key: ${VEXPAY_API_KEY}" \
--data '{
"amountVes": "100000.00",
"payerPhone": "04121234567",
"payerCedula": "V12345678",
"sourceNote": "Advertising income, second half of November"
}'
# → { "id": "...", "status": "pending", "amountVes": "100000.00", "expiresAt": "...",
# "receiver": { "bankCode": "...", "phone": "...", "identification": "..." } }| Example: fee 3.5% + $0.25, instant 1.5%, BCV 200 | Bs |
|---|---|
| Top-up | 100,000.00 |
| Fee (3,500.00 + 50.00) | − 3,550.00 |
| Credited (held if your account has a hold) | 96,450.00 |
| Instant fee to release it now (1.5%) | − 1,446.75 |
| Available at once | 95,003.25 |
- Each top-up counts against your monthly limit (Venezuela calendar month, in dollars at BCV, pending and completed). Over it: 422
topup_cap_exceededwithremainingUsdandremainingVes. - Banks limit each Pago Móvil and each day: load a large amount in several top-ups.
- Your balance shows
topup,topup_fee,topup_instant_releaseandtopup_instant_feemovements. - A transfer that arrives after the 15 minutes is not credited on its own: contact VEXPay with the reference.
Check that it worked
GET /v1/merchants/:id/balanceshows the credit inpendingVesoravailableVes.GET /v1/merchants/:id/transactionslists credits (withamountUsdandrate), releases and withdrawals, newest first.- In the statement, opening + the sum of
amountVes= closing. Areleaserow moves money from pending to available, so itsamountVesis 0.00.
Leftovers and chargebacks
- Money you credit belongs to the person until they withdraw it; VEXPay does not take it back on its own. Credit only what you owe.
- Months are in Venezuela time (America/Caracas).
- A refund or card chargeback on one of your sales is taken from your balance, even if you already credited that money to your end users. Recovering it from them is up to you.
If something goes wrong
| Symptom | Likely cause | What to do |
|---|---|---|
422 insufficient_balance on a credit | Your balance cannot cover it | Check GET /v1/balance; wait for more sales. |
503 rate_unavailable on a credit or withdrawal | The BCV rate could not be read just now; nothing was recorded | Retry in a minute with the same transferKey or externalRef. |
422 insufficient_merchant_balance on a withdrawal | The credit is still pending (sales in hold), or the person has less available | Check GET /v1/merchants/:id/balance; wait for the release. |
422 insufficient_balance with reason: "tenant_fee_unfunded" | Your balance cannot pay the withdrawal fee | Keep a reserve; retry with the same externalRef. |
Withdrawal awaiting_approval | Over the first-30-days payout limit | No action; VEXPay reviews it. |
403 topups_not_enabled | Top-ups are not on for your account | Ask VEXPay to turn them on. |
422 topup_cap_exceeded | Over this month's top-up limit | Load at most remainingVes, or ask VEXPay to review the limit. |
Top-up expired | The transfer did not arrive within 15 minutes | Start a new one; if you already sent it, contact VEXPay with the reference. |
Related: Recipe: pay your end users · Onboard a seller · Merchants & payouts · Read balance & holds