Dispersión de pagos: paga a tus usuarios con tus ventas
Acredita a cada uno de tus usuarios finales (personal, contratistas, afiliados) en dólares a tasa BCV con el dinero que cobras, deja que retiren a su propio Pago Móvil y descarga un estado de cuenta mensual por persona.
Qué vas a hacer
Tus ventas llegan a tu saldo de VEXPay. En cada período acreditas a cada usuario final un monto en dólares; VEXPay lo convierte a la tasa oficial BCV y lo guarda en el saldo de esa persona. Luego cada persona retira a su propio Pago Móvil cuando quiera, desde tu propio sistema. La comisión de retiro la pagas tú, no ellos. En la API, cada usuario final es un merchant.
- La dispersión de pagos activada en tu cuenta. Pídela a VEXPay; funciona en modo Test de inmediato y en Live después de la aprobación de salida a producción.
- Tu servidor guarda tu API key. Tus usuarios finales nunca entran a VEXPay: tu sistema administrativo llama a la API por ellos.
- Cada usuario final registrado con un Pago Móvil verificado (mira Registrar un vendedor).
Pasos
- Cobra
Vende con links de pago, sesiones de checkout o cobros como siempre. Cada venta en bolívares está disponible en tu saldo cuando el banco la confirma (mientras tanto,
unconfirmedVes). - Registra a tus usuarios finales
POST /v1/merchantsuna vez por persona; luego agrega y verifica su método de payout Pago Móvil. Guarda elmerchantIdque recibes en tu sistema, junto a la persona. - Acredita a cada persona en dólares
POST /v1/merchants/:id/transfersconamountUsdy untransferKeyúnico por persona y período (por ejemplo2026-11-q1-emp-104). La respuesta muestraamountVes, la tasa (rate) yrateAsOf. Si envías el mismotransferKeyotra vez recibes el primer resultado, nunca un segundo crédito a otra tasa. - La persona retira
Cuando la persona pide un retiro en tu sistema, llama a
POST /v1/payoutscon sumerchantId, elmontoen bolívares,concepto, unexternalRefúnico yfromMerchantBalance: true. Recibe elmontocompleto; la comisión de retiro se cobra de tu saldo. - Descarga el mes
GET /v1/merchants/:id/statement?month=2026-11(agrega&format=csvpara un archivo), o Portal → Merchants → Monthly statement para una persona o para todas en un solo 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.csvCuándo se puede retirar el dinero
Un crédito pagado con dinero que ya está disponible en tu saldo se puede retirar de inmediato. Un crédito pagado con ventas que el banco aún no confirma queda en el pendingVes de la persona y pasa a availableVes cuando se confirman. Acreditar cuando las ventas ya están confirmadas evita la espera.
La comisión de retiro
Cada retiro cuesta un porcentaje del monto con un mínimo en dólares, más una parte fija en dólares; las partes en dólares se convierten a la tasa BCV de ese momento. VEXPay acuerda el precio contigo antes de salir a producción.
| Ejemplo: 1% (mín. $0,25) + $0,25, BCV 215,40 | Comisión |
|---|---|
| Retiro de Bs 20.000,00 | Bs 200,00 + Bs 53,85 = Bs 253,85 |
| Retiro de Bs 2.000,00 | Bs 53,85 (mínimo) + Bs 53,85 = Bs 107,70 |
- El payout muestra
feeVesyfeePayer: "tenant"; a la persona solo se le debitó elmonto. - Tu saldo muestra un movimiento
disbursement_payout_fee. Si el banco rechaza el retiro, elmontovuelve a la persona y la comisión vuelve a ti (disbursement_payout_fee_reversal). - Mantén una pequeña reserva en tu saldo: si no alcanza para la comisión, el retiro se rechaza con 422
insufficient_balanceyreason: "tenant_fee_unfunded".
Carga dinero que no es una venta (recargas)
Cuando el dinero que pagas viene de fuera de tus ventas (por ejemplo ingresos de publicidad), cárgalo a tu saldo con una recarga: envías un Pago Móvil a VEXPay y se acredita en tu saldo. VEXPay activa las recargas, con un límite mensual acordado contigo. Una recarga no es una venta: no dispara el webhook payment.completed y no cuenta como volumen de ventas.
- Inicia la recarga
POST /v1/balance/topupsconamountVes, elpayerPhoney lapayerCeduladesde los que vas a pagar, y unasourceNoteque diga de dónde viene el dinero (mínimo 10 caracteres). O usa Portal → Balance movements → Load balance. - Envía el Pago Móvil
Envía exactamente
amountVesdesde ese teléfono alreceiverde la respuesta (código de banco, teléfono, documento) en menos de 15 minutos. En tu app bancaria elige el banco por su código. - Se completa sola
GET /v1/balance/topups/:idpasa acompletedcuando llega la transferencia. Se te acreditacreditedVes= monto − comisión. Sigue la retención de saldo de tu cuenta, si la tiene (ninguna por defecto). - Opcional: disponible ya
POST /v1/balance/topups/:id/instantsi tu cuenta tiene retención, libera al momento la parte retenida porinstantFeePercentde ella (instantFeeVes). Llamarlo otra vez no cobra nada más.
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": "Ingresos de publicidad, segunda quincena de noviembre"
}'
# → { "id": "...", "status": "pending", "amountVes": "100000.00", "expiresAt": "...",
# "receiver": { "bankCode": "...", "phone": "...", "identification": "..." } }| Ejemplo: comisión 3,5% + $0,25, instantánea 1,5%, BCV 200 | Bs |
|---|---|
| Recarga | 100.000,00 |
| Comisión (3.500,00 + 50,00) | − 3.550,00 |
| Acreditado (retenido si tu cuenta tiene retención) | 96.450,00 |
| Comisión para liberarlo ya (1,5%) | − 1.446,75 |
| Disponible al momento | 95.003,25 |
- Cada recarga cuenta contra tu límite mensual (mes calendario de Venezuela, en dólares a tasa BCV, pendientes y completadas). Si lo superas: 422
topup_cap_exceededconremainingUsdyremainingVes. - Los bancos limitan cada Pago Móvil y cada día: carga un monto grande en varias recargas.
- Tu saldo muestra los movimientos
topup,topup_fee,topup_instant_releaseytopup_instant_fee. - Una transferencia que llega después de los 15 minutos no se acredita sola: contacta a VEXPay con la referencia.
Comprueba que funcionó
GET /v1/merchants/:id/balancemuestra el crédito enpendingVesoavailableVes.GET /v1/merchants/:id/transactionslista créditos (conamountUsdyrate), liberaciones y retiros, del más reciente al más antiguo.- En el estado de cuenta, saldo inicial + la suma de
amountVes= saldo final. Una filareleasemueve dinero de pendiente a disponible, por eso suamountVeses 0.00.
Sobrantes y contracargos
- El dinero que acreditas es de la persona hasta que lo retire; VEXPay no lo devuelve por su cuenta. Acredita solo lo que debes.
- Los meses van en hora de Venezuela (America/Caracas).
- Un reembolso o contracargo de tarjeta sobre una de tus ventas se descuenta de tu saldo, aunque ya hayas acreditado ese dinero a tus usuarios finales. Recuperarlo de ellos te corresponde a ti.
Si algo sale mal
| Síntoma | Causa probable | Qué hacer |
|---|---|---|
422 insufficient_balance al acreditar | Tu saldo no alcanza | Revisa GET /v1/balance; espera más ventas. |
503 rate_unavailable al acreditar o retirar | No se pudo leer la tasa BCV en ese momento; no se registró nada | Reintenta en un minuto con el mismo transferKey o externalRef. |
422 insufficient_merchant_balance al retirar | El crédito sigue pendiente (ventas en retención), o la persona tiene menos disponible | Revisa GET /v1/merchants/:id/balance; espera la liberación. |
422 insufficient_balance con reason: "tenant_fee_unfunded" | Tu saldo no alcanza para la comisión de retiro | Mantén una reserva; reintenta con el mismo externalRef. |
Retiro en awaiting_approval | Supera el límite de pagos de los primeros 30 días | No hace falta hacer nada; VEXPay lo revisa. |
403 topups_not_enabled | Las recargas no están activas en tu cuenta | Pide a VEXPay que las active. |
422 topup_cap_exceeded | Supera el límite de recargas del mes | Carga como máximo remainingVes, o pide a VEXPay revisar el límite. |
Recarga expired | La transferencia no llegó en 15 minutos | Inicia otra; si ya la enviaste, contacta a VEXPay con la referencia. |
Relacionado: Receta: paga a tus usuarios · Registrar un vendedor · Comerciantes y payouts · Leer saldo y retenciones