Skip to main content

What a wallet source is

A payment app can register one wallet source for each installation. It is a display-only row on the merchant’s Wallet page: your app’s name for the account, its currency, and a live balance the platform reads from your endpoint. The platform never moves this money. It is not a Salesive wallet, it cannot be withdrawn through Salesive, and no order, payout or fee calculation reads it. The merchant’s action on an app source is Manage, which opens your page. Withdraw stays on platform wallets only.

Authentication

The installation, and therefore the store and the app, comes from the token. A merchant session is refused with 403. No OAuth scope is required, because this is your app’s own display configuration, not a write to store data.

Register a source

PUT creates the source, or replaces the one this installation already has. There is at most one source per installation.
All three URLs pass the same SSRF guard as webhook URLs: HTTPS only, and localhost, private and link local addresses are refused. The check runs at save time and again before every balance call, because DNS can change. Changing the currency code, the decimals or balanceUrl clears the stored last balance, because the old number no longer describes the source.
GET /api/v1/app/wallet-source returns the same source object, or 404 when this installation has not registered one. DELETE /api/v1/app/wallet-source removes it.

The balance call

When the merchant opens the Wallet page, the platform POSTs to balanceUrl for each enabled source. The result is cached for 60 seconds per store and source, so a page refresh does not hammer your endpoint.
The signature is the same scheme as webhook signature v2. v1 is the base64 HMAC-SHA256 of <t>.<raw body> using your app’s webhook secret for the installation’s environment. currency is the declared code, so an app that holds more than one currency answers for the right account.
Store amounts follow Money and units: a plain number in major units. The balance your app reports is the one exception, a decimal string, because it is your own value and the platform stores it as you send it.
The balance is stored as your decimal string, so a large value never loses precision. On a failed refresh the merchant still sees the last good balance and its timestamp, with error set to a short message. It is never replaced with zero. A source that has never reported returns null.

The label rule

An app source may use any currency code, including one the store’s platform wallet already uses. Holding the merchant’s naira float is normal for a provider, and refusing the code would be wrong. Identity is by source, never by currency code:
  • A platform wallet and an app source with the same code are two rows. They are never merged, and their balances are never summed into one total.
  • When the code matches a platform wallet the store holds, the app row carries your app’s label. If you sent no label, the server substitutes <App name> <CODE>, for example Paystack NGN.
  • The dashboard shows an app label qualified by the app name, so the row can never read as the platform wallet.
  • Platform entries keep the plain currency name.

The merchant endpoint

The merchant’s Wallet page reads:
platform is the store’s own wallets and apps is one entry per active installation that registered a source. The two lists are separate on purpose. A disabled source is still listed, so the merchant can turn it back on. It keeps its last known balance, is not called, and carries no error. The merchant turns a source on or off with PATCH /api/v1/wallet/sources/:sourceId and a body of { "enabled": true } or { "enabled": false }. The source must belong to an active installation on the current store, otherwise the call answers 404.

Errors

Rules to build by

  • The balance is display only. No order, payout, platform fee or app charge reads it.
  • The platform never moves this money. There is no withdraw, transfer or debit on an app source.
  • The platform never sums an app balance with a platform wallet, even when the currency code matches.
  • An uninstall removes the row from the merchant’s view, because the source belongs to the installation.

Next steps

Platform billing

The fee on orders your provider captures, and the monthly invoice.

Webhooks

The signature scheme your balance endpoint shares.