Skip to main content

Overview

FossaPay supports business-funded payouts directly from your permanent NGN master wallet, as well as the existing customer-funded transfer APIs. Choose the flow based on who owns the source funds.
Use the Master Wallet Payout API when the funds belong to the business. It derives the source wallet from your API key, so you do not provide a customerId, source wallet ID, or source account number.

Prerequisites

  • A verified FossaPay business
  • An active production API key with full permission
  • An active permanent NGN master wallet
  • Sufficient available balance for the payout amount and any applicable fee
  • A webhook endpoint configured with your webhook secret
No separate payout API key, IP allowlisting, or per-merchant payout activation is required.

How Master Wallet Routing Works

FossaPay looks up the submitted destination account number before moving funds.

Same business

When the destination is an active customer wallet owned by your business:
  • route is same_business
  • fee is 0.00
  • totalDebited equals amount
  • the transfer can complete immediately

Another FossaPay business

When the destination is an active FossaPay wallet owned by another business:
  • route is fossapay_cross_business
  • the configured payout fee applies
  • the payout is processed through the charged payout rail

External bank

When the destination account is not a FossaPay wallet:
  • route is external_bank
  • the configured payout fee applies
  • a final provider result is delivered asynchronously
Do not attempt to select the route in your request. Always send verified beneficiary details; FossaPay determines the route from the destination account number.

Validate the Beneficiary

Retrieve supported banks and perform a name enquiry before creating the payout.
Compare the returned name with your intended beneficiary before proceeding.

Create a Payout

Generate one idempotency key for each logical payout and persist it with your reference.
The beneficiary receives amount. For charged routes, your master wallet is debited by amount + fee, exposed as totalDebited.

Handle the Initial Status

HTTP 202 means the request was accepted—not necessarily that the beneficiary has received the money.
  • If data.status is completed, the payout is final and successful.
  • If it is processing, store payoutId, transactionId, reference, and providerReference, then wait for a webhook or retrieve the payout.
  • Never submit a second payout with a new idempotency key because the first request timed out.

Reconcile a Payout

Retrieve by FossaPay payout ID:
Or retrieve by your unique reference:
Use reference lookup when you do not know whether a create request reached FossaPay.

Endpoint map

Process Payout Webhooks

Master-wallet payouts emit:
  • payout.completed
  • payout.failed
  • payout.reversed
FossaPay signs JSON.stringify(body.data) with HMAC-SHA256. See Webhook Verification for complete Node.js and Python examples.

Idempotency Rules

The same request body and idempotency key return the existing payout. A different body with that key returns HTTP 409.
A payout reference is unique per merchant. Use your own order, invoice, or withdrawal identifier so support and reconciliation are straightforward.
If the connection fails after submission, retrieve by reference. If found, continue tracking that payout. If it is not found, retry the identical body with the original idempotency key.

Terminal States

Do not deliberately retry a terminal payout under a new reference without making a new business decision in your own system.

Go-Live Checklist

  • Use a verified business and a full-permission live API key.
  • Keep API keys server-side only.
  • Validate the beneficiary before creating a payout.
  • Generate and persist a unique reference and idempotency key.
  • Store the payout ID, your reference, and the returned transaction identifiers.
  • Treat processing as non-terminal.
  • Verify webhook signatures before processing events.
  • Deduplicate webhook deliveries using eventId.
  • Reconcile delayed webhooks with the GET endpoints.
  • Test same-business, cross-business, and external-bank routing with controlled amounts.

Next Steps

Create Master Wallet Payout

Send directly from your business funds

Get Payout by ID

Retrieve the latest payout status

Wallet-to-Wallet Transfer

Customer-funded transfers within one business

Webhook Events

See complete payout event payloads

Bulk Payouts

Submit and reconcile immediate CSV payout batches