Send a payout
POST /v1/partner/payouts (needs an Idempotency-Key)
POST /v1/payments/send, plus partner_reference. Partner payouts are same-currency and immediate. A scheduled or recurring payout is refused with 422 partner_payout_immediate_only.
An API-key send through
/v1/payments/send from a partner business meets the same limits and the same name check, and needs an Idempotency-Key there too.The name check
Before anything is sent, we ask the bank whose account it is and compare that name withinfo.account_name:
With name matching on (the default),
mismatch is refused with 422 name_mismatch and unverified with 422 name_unverified. Nothing is sent in either case.
The answer
status is one of:
created: the payout is on its way.refused: a refusal has the same shape, witherror: {code, message, fields}.unknown: the bank’s answer was lost (provider_unconfirmed). Read the payout before sending again.
payout.succeeded, payout.failed or payout.reversed webhook.
Fees: never below what the transfer costs
A partner payout is never charged less than it costs Platnova to send. Your normal fee for the amount applies. If that fee is below the transfer’s cost, it is raised to the greater of:- the cost plus 3%;
- the cost plus ₦50.
For example, a ₦3,000 payout routed through PalmPay would normally cost ₦25 + ₦1.87 VAT. It is charged ₦150 + ₦11.25 VAT. The rail is chosen by Platnova per corridor. If the rail isn’t known when the payout is priced, the dearest cost is used.
This applies to every payout made with your API key:
/v1/partner/payouts, each item of /payouts/bulk, and /v1/payments/send. Your wallet must hold the amount plus the raised fee and VAT. If it doesn’t, the payout is refused insufficient funds and nothing is sent.
Where you see it: the fee and VAT actually charged are on the payout’s transaction: fee, and the charges breakdown on GET /v1/transactions/{id}. The payout webhooks carry the fee too, as data.fee (VAT not included).
Bulk payouts
POST /v1/partner/payouts/bulk (needs an Idempotency-Key) with { "items": [ <payout body>, … ] }.
- A request takes at most 50 items.
- Each item needs its own
partner_reference. A duplicate within one request is refused with400. - Items run in order. Each item is idempotent on its own reference, so resending a bulk request that timed out is safe: items that already ran return their first result.
{ "items": [ <result>, … ], "created": 48, "not_created": 2 }.
Read a payout
GET /v1/partner/payouts/{partner_reference}
status moves through pending, created, refused, unknown, succeeded, failed and reversed. An unknown reference answers 404 not_found.
