The driver's wallet: balance and withdrawable funds, the transaction ledger, the
payout (withdrawal) account configuration, and payout requests. Paths are relative
to the /api/v1 prefix; all routes require Authorization: Bearer {token}.
See Common errors, Driver wallet & cash debt, and Pagination for the cursor lists.
| Method | URI | Role | Description |
|---|---|---|---|
GET |
/wallet/me |
any | Balance, withdrawable, and cash debt |
GET |
/wallet/me/transactions |
any | Transaction ledger (cursor) |
GET |
/wallet/me/payout-config |
any | Current payout account, or null |
POST |
/wallet/me/payout-config |
any | Create/update the payout account |
POST |
/wallet/me/payouts |
any | Request a payout (withdrawal) |
GET |
/wallet/me/payouts |
any | Payout history (cursor) |
GET |
/driver/wallet/transactions |
DRIVER | Ledger (alias of /wallet/me/transactions) |
PUT |
/driver/payout-method |
DRIVER | Save payout account (alias of POST /wallet/me/payout-config) |
GET |
/driver/withdrawals |
DRIVER | Payout history (alias of /wallet/me/payouts) |
POST |
/driver/withdrawals |
DRIVER | Request a payout (alias of POST /wallet/me/payouts) |
The /wallet/me/* routes operate on the caller's own wallet (any authenticated
role); the /driver/* aliases are identical but gated to drivers. Money fields end
in _usd (decimal) and are derived from integer _cents.
The caller's balance summary. The wallet is created on first access if missing.
Response 200
{
"balanceUSD": 124.5,
"pendingPayoutUSD": 20.0,
"withdrawableUSD": 104.5,
"cashDebtUSD": 3.6,
"cashDebtCapUSD": 20.0,
"canGoOnline": true
}
withdrawableUSD is the balance available for payout. canGoOnline indicates whether
the driver may go online.
Cursor-paginated ledger, newest first. See Pagination → cursor-based.
Query
| Field | Type | Required | Rules |
|---|---|---|---|
type |
string | no | one of ORDER_EARNING, SURPLUS_EARNING, CASH_COMMISSION_DEBT, CASH_SOLIDARY_DRIVER, CASH_SOLIDARY_CLIENT, PAYOUT_SENT, PAYOUT_FAILED_REFUND, MANUAL_ADJUSTMENT, WALLET_TOPUP |
date_from |
date | no | filters created_at ≥ |
date_to |
date | no | after or equal to date_from; filters created_at ≤ |
limit |
integer | no | 1–100; defaults to 30 |
cursor |
string | no | opaque cursor from next_cursor |
Response 200
{
"items": [
{
"id": 88,
"wallet_id": 4,
"order_id": 42,
"payout_id": null,
"type": "ORDER_EARNING",
"amount_cents": 1624,
"balance_after_cents": 12450,
"amount_usd": 16.24,
"balance_after_usd": 124.5,
"exchange_rate_amount": 540.043,
"description": "Ganancia pedido #42",
"created_at": "2026-06-26T12:40:00+00:00"
}
],
"next_cursor": "eyJpZCI6ODd9",
"has_more": true
}
exchange_rate_amount is the BCV VES rate (Bs/USD) snapshot of the related order;
null for movements without an order (PAYOUT_SENT, MANUAL_ADJUSTMENT).
Returns the caller's saved payout account, or null if none is configured.
Response 200
{
"config": {
"id": 2,
"user_id": 7,
"method": "PAGO_MOVIL",
"bank_code": "0102",
"id_number": "V12345678",
"phone": "+584241001001",
"account_number": null,
"account_type": null,
"verified_at": null,
"created_at": "2026-06-20T10:00:00+00:00"
}
}
config is null when the driver has not set up a payout account yet.
Creates or updates the payout account. PAGO_MOVIL requires bankCode, idNumber,
and phone; BANK_TRANSFER requires accountNumber. If an otp is supplied it is
verified against the code from POST /auth/otp/request. PUT /driver/payout-method
is the driver-only alias.
Request body
| Field | Type | Required | Rules |
|---|---|---|---|
method |
string | yes | PAGO_MOVIL or BANK_TRANSFER |
bankCode |
string | conditional | ≤ 10 chars; required for PAGO_MOVIL |
idNumber |
string | conditional | ≤ 20 chars; required for PAGO_MOVIL |
phone |
string | conditional | ≤ 20 chars; required for PAGO_MOVIL |
accountNumber |
string | conditional | ≤ 30 chars; required for BANK_TRANSFER |
accountType |
string | no | ahorro or corriente |
otp |
string | no | exactly 6 digits; verified when present |
Response 200 — { "config": { … } } (same shape as GET /wallet/me/payout-config).
Errors
| Status | Body | When |
|---|---|---|
401 |
{ "error": "InvalidOtp", "message": "…" } |
An otp was supplied but is wrong or expired |
400 |
{ "error": "Pago MĂłvil requiere bankCode + idNumber + phone." } |
PAGO_MOVIL missing required fields |
400 |
{ "error": "Transferencia requiere accountNumber." } |
BANK_TRANSFER missing accountNumber |
Requests a payout for the given amount, drawn against withdrawableUSD.
POST /driver/withdrawals is the driver-only alias.
Request body
| Field | Type | Required | Rules |
|---|---|---|---|
amountUSD |
number | yes | > 0 |
Response 200
{
"payout": {
"id": 9,
"wallet_id": 4,
"amount_cents": 2000,
"amount_usd": 20.0,
"method": "PAGO_MOVIL",
"status": "PENDING",
"created_at": "2026-06-26T13:00:00+00:00"
}
}
Errors
| Status | Body | When |
|---|---|---|
400 |
{ "error": "Saldo retirable insuficiente." } |
Amount exceeds withdrawableUSD |
400 |
{ "error": "Configurá tu cuenta de pago antes de retirar." } |
No payout account configured |
400 |
{ "error": "No tienes wallet activo." } |
The caller has no wallet |
Cursor-paginated payout history, newest first. See Pagination → cursor-based.
Query
| Field | Type | Required | Rules |
|---|---|---|---|
status |
string | no | PENDING, PROCESSING, PAID, or REJECTED |
date_from |
date | no | filters created_at ≥ |
date_to |
date | no | after or equal to date_from; filters created_at ≤ |
limit |
integer | no | 1–100; defaults to 25 |
cursor |
string | no | opaque cursor from next_cursor |
Response 200
{
"items": [
{
"id": 9,
"wallet_id": 4,
"amount_cents": 2000,
"amount_usd": 20.0,
"method": "PAGO_MOVIL",
"status": "PENDING",
"created_at": "2026-06-26T13:00:00+00:00"
}
],
"next_cursor": "eyJpZCI6OH0",
"has_more": false
}
These behave exactly like their /wallet/me/* counterparts but are drivers only:
| Method | URI | Same as |
|---|---|---|
GET |
/driver/wallet/transactions |
GET /wallet/me/transactions |
PUT |
/driver/payout-method |
POST /wallet/me/payout-config |
GET |
/driver/withdrawals |
GET /wallet/me/payouts |
POST |
/driver/withdrawals |
POST /wallet/me/payouts |
# Balance
curl /api/v1/wallet/me -H "Authorization: Bearer {driver_token}"
# Save a Pago MĂłvil payout account
curl -X POST /api/v1/wallet/me/payout-config \
-H "Authorization: Bearer {driver_token}" \
-H "Content-Type: application/json" \
-d '{"method": "PAGO_MOVIL", "bankCode": "0102", "idNumber": "V12345678", "phone": "+584241001001"}'
# Request a $20 payout
curl -X POST /api/v1/wallet/me/payouts \
-H "Authorization: Bearer {driver_token}" \
-H "Content-Type: application/json" \
-d '{"amountUSD": 20}'