MobileWalletPartner Gateway Docs

Partner ledger

An event-sourced, double-entry record of every settled transaction.

Your balance isn't a number stored anywhere — there is no balance column. It's always SUM(credits) - SUM(debits) over your ledger entries, computed at read time. The raw entries themselves are the literal answer to "why did my balance change": every settled transaction, newest first, never edited or deleted after the fact.

Reading your balance and history

GET /api/v1/ledger/balance
{ "balance": 48500, "environment": "Live", "currency": "XAF", "entryCount": 12 }

Sandbox and Live are separate books. A credential always reads the balance and history of its own environment, and Sandbox money can never fund a Live payout. See Sandbox testing.

GET /api/v1/ledger/history?page=1&pageSize=50
{
  "page": 1,
  "pageSize": 50,
  "totalCount": 12,
  "entries": [
    {
      "transactionId": "0192b7a4-6f1e-7c3a-9d2b-4e5f6a7b8c9d",
      "serviceCode": "MOMO_DEPOSIT",
      "direction": "Credit",
      "amount": 1000,
      "currency": "XAF",
      "description": "MOMO_DEPOSIT settled",
      "createdDate": "2026-10-10T11:00:00Z"
    }
  ]
}

A settled transaction posts an entry exactly once, the moment it reaches GW-01-SUCCESS — a failed, expired, or cancelled transaction never moved real money, so nothing is recorded for it. MOMO_DEPOSIT/CRYPTO_BUY (money into the platform from a customer) post a Credit; MOMO_WITHDRAWAL/CRYPTO_SELL (money out to a customer) post a Debit.

Why it matters for your own integration

MOMO_WITHDRAWAL and CRYPTO_SELL reject a request that would take your balance below zero — checked before the request ever reaches a provider, as a 400 with GW-400-BAD-REQUEST. This is a prefunded-float model: you need enough settled deposits already recorded before you can pay money out. There's no credit line or post-paid alternative.

If a money-out request is unexpectedly rejected, check your current balance and recent history first — it's often simpler to diagnose than it looks.

Double-entry, for the curious

Internally, every settled transaction posts two entries that always net to zero — one on your account, one on the platform's own internal clearing account. You only ever see your own side; the platform side is internal bookkeeping. This mirrors how real production ledgers are built (it's the same reason your bank statement is a list of entries, not a single mutable number) — a whole-book sum that fails to net to zero proves something is wrong, in a way a single running total can't.

Monthly statement

GET /api/v1/ledger/statement?month=2026-10

One month of your book: the opening balance (everything before the month), every entry in the month oldest first with the balance after it, and the closing balance. Amounts are signed (credits positive, debits negative), and months are in UTC. The Partner Dashboard's Reports page downloads the same statement as CSV.

On this page