For the complete documentation index, see llms.txt. This page is also available as Markdown.

Merchant balance to Fiat

A merchant balance USD deposit paying out NGN to a bank account. This is the payout flow: you spend your own USD balance to pay someone in their local currency.

1

Check your balance with Get merchant balances

{
    "USD": 761
}

The deposit leg spends this balance, so it has to cover the amount.

2

Call Get available currencies

The merchant balance entry allows payouts and deposits, and its pairs includes fiat. NGN's bank channel has isPayoutAllowed: true. So merchant balance USD → NGN over bank is legal.

You could pay out over airtime instead — it is payout-only, which is exactly what this flow needs. Swap payoutPaymentChannel and add a carrierCode.

3

Call Get order limits

  • depositPaymentChannel: "merchant_balance"

  • depositCurrencyType: "merchant_balance"

  • depositCurrencyCode: "USD"

  • payoutPaymentChannel: "bank"

  • payoutCurrencyType: "fiat"

  • payoutCurrencyCode: "NGN"

  • payoutCountryIsoCode: "NG"

Example response
{
    "deposit": {
        "min": 1,
        "max": 500,
        "minUsd": 1,
        "maxUsd": 500,
        "step": 0.01,
        "supportsDecimals": true
    },
    "payout": {
        "min": 1412,
        "max": 705782,
        "minUsd": 1,
        "maxUsd": 500,
        "step": 1,
        "supportsDecimals": false
    }
}

You can spend 1 to 500 USD, delivering 1,412 to 705,782 NGN. We want to send 100 USD.

KYC still applies to the person being paid — run the KYC flow against their email and country, passing the amounts.

4

Call Create quote

Example request
{
  "deposit": {
    "paymentChannel": "merchant_balance",
    "currencyType": "merchant_balance",
    "currencyCode": "USD",
    "amount": 100
  },
  "payout": {
    "paymentChannel": "bank",
    "currencyType": "fiat",
    "currencyCode": "NGN",
    "countryIsoCode": "NG"
  }
}

100 USD of your balance delivers 141,156 NGN. The fees come off the payout leg: 2.5% platform and 1% merchant — that merchant_fee is yours.

Required fields, all on the payout leg:

  • phoneNumber

  • bankCode (from the enum options)

  • bankAccountNumber

The two *SandboxForcedFlow fields are optional and sandbox-only.

5

Call Create order

The deposit's transferInstructions are empty, and that is correct — nobody has to pay anything by hand. Your balance is the deposit.

6

Call Confirm order

No fields are needed; your balance is debited automatically.

{
  "orderId": "692ef363ee270426b27cd0b6"
}
7

We debit your balance and send the payout

8

Wait for "payout_successful"

If the bank rejects the transfer the order goes to payout_failed and, if it cannot be retried, is refunded to your balance. See Order statuses.

Last updated