Wallet

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.

Endpoints

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.


GET /wallet/me

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.


GET /wallet/me/transactions

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).


GET /wallet/me/payout-config

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.


POST /wallet/me/payout-config

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

POST /wallet/me/payouts

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

GET /wallet/me/payouts

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
}

Driver aliases

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

Examples

# 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}'