Choose the transfer flow
Prerequisites
- An authenticated production API key
- An individual customer owned by the authenticated merchant
- An active NGN wallet for that customer
- Sufficient available balance
- A unique reference generated and stored before submission
- A verified webhook endpoint for asynchronous status changes
Transfer to a Nigerian bank account
1. Retrieve supported banks
CallGET /api/v1/transfers/fiat/banks and use the returned bank code. Do not maintain an unversioned hard-coded bank list.
2. Verify the beneficiary
Perform name enquiry using the selected bank code and account number:A successful name enquiry validates the account details at that moment. It does not reserve funds or guarantee that the later transfer will succeed.
3. Calculate the fee
amountis the amount intended for the beneficiary;feeAmountis charged in addition toamount; and- the customer wallet must have at least
amount + feeAmountavailable.
4. Submit the transfer
customerId selects the customer wallet to debit; do not send a source account number.
An HTTP 200 response confirms that FossaPay accepted the request flow:
5. Finalize from verified state
Customer inter-bank transfers are represented as wallet withdrawals. Process the applicable verified withdrawal event and use the wallet transaction endpoint when confirmation is delayed or disputed.Transfer between customer wallets
Both wallet account numbers must belong to the authenticated merchant.- an existing successful source/reference returns the prior success;
- a pending reference is reported as already processing; and
- a failed or conflicting reference returns an error and must not be reused for a new operation.
References and ambiguous outcomes
Neither customer inter-bank transfer nor wallet-to-wallet transfer uses the checkout/payoutX-Idempotency-Key contract. The request reference is the replay and reconciliation identifier.
Generate it before calling FossaPay, persist it with the request body, and never replace it solely because your HTTP client timed out. First inspect wallet transactions and balances. A new reference represents a new business decision and can move money again.
Error handling
Reconciliation controls
- Store the customer ID, wallet ID, account numbers, reference, amount, fee quote, and returned transaction IDs.
- Verify webhook signatures and enforce uniqueness on
eventId. - Keep webhook delivery state separate from transaction state.
- Compare available balance before and after a resolved operation.
- Use decimal-safe arithmetic for NGN amounts.
- Route unresolved or reversal-failed operations to manual review.
- Never expose full beneficiary details in routine logs.
API reference
Production checklist
- Select the API according to source-fund ownership.
- Retrieve the current bank list and verify the beneficiary.
- Calculate the current fee and confirm sufficient available balance.
- Generate and persist one unique reference per logical transfer.
- Treat acceptance and processing responses as non-terminal.
- Verify and deduplicate webhook events.
- Reconcile timeouts before creating another operation.
- Maintain a manual-review path for unresolved or reversal failures.

