OuiPay
API ReferenceWallets

Wallets

The wallet resource : currency-specific balances, holds, and funding.

Each customer has one wallet per currency. A wallet tracks posted balance, available funds, and active holds.

The wallet object

{
  "id": "01M2S17...",
  "customer_id": "01M2S17...",
  "currency": "NGN",
  "balance_minor": 500000,
  "available_minor": 450000,
  "held_minor": 50000,
  "created_at": "2026-09-18T01:13:51Z"
}
FieldTypeNotes
balance_minorintPosted ledger balance (never negative)
available_minorintBalance minus active holds
held_minorintFunds reserved by in-flight transactions

Balances come from the ledger: they are not stored counters. A wallet balance is always reconcilable to its journal entries.

Holds

A transaction that has not settled places a hold on funds rather than debiting them. The hold:

  • reduces available_minor immediately
  • converts to a debit on completion, or releases on failure/expiry

You never see available < 0: the hold is what makes concurrency safe: two simultaneous requests cannot spend the same funds twice.

Funding a wallet

Customers fund wallets through the methods enabled for their country:

  • Bank transfer: a static virtual account per customer; inbound credits post automatically
  • Card / mobile money: a payment that settles into the wallet
  • Admin credit: operations funding (sandbox and approved flows)

Virtual accounts are funding instruments

A static virtual account is a wallet-funding rail: it is never offered as a checkout payment method. Inbound credits arrive via webhook and post to the wallet.

Multi-currency

Each currency is a separate wallet. Converting between them goes through Exchange: an explicit quote, a posted FX leg, and both wallets' balances updated atomically.

Endpoints

MethodPathDescription
GET/v1/wallets/{id}Retrieve
GET/v1/customers/{id}/walletsList customer wallets

On this page