Collections · for businesses
Get paid.
It arrives.
Bank transfer, dedicated virtual account or card — one API call, or a payment link with no code at all. You know the moment it lands. If a customer pays too much or too little, we name it, return the difference and still credit you.
1POST /v1/payins2Idempotency-Key: 2c9e-…-f434{5 "currency": "NGN",6 "amount": 2500000,7 "method": "bank_transfer",8 "customer": {9 "name": "Ngozi Eze",10 "email": "ngozi@example.com"11 },12 "merchantReference": "INV-0918",13 "metadata": { "order": "7712" }14}
1202 Accepted23{4 "publicId": "pin_4t7e…",5 "status": "pending",6 "currency": "NGN",7 "amount": "2500000",8 "method": "bank_transfer",9 "authorization": {10 "mode": "virtual_account",11 "bankName": "Wema Bank",12 "accountNumber": "0123456789",13 "accountName": "Acme Ltd"14 },15 "merchantReference": "INV-0918"16}
Amounts in minor units. Illustrative values.
What a collection goes through
Four words your customer sees. The same four your dashboard and your webhooks use.
- pending
On request
Your customer gets somewhere to pay: a dedicated account number, a card prompt or a redirect. Nothing is credited yet.
- processing
When they pay
The bank or card network confirms the funds. Any PIN or OTP step happens here.
- successful
It landed
Your wallet is credited net of fee, the ledger entry balances, and your webhook fires — and says if they paid more or less than asked.
→ payin.successful · payin.overpaid · payin.underpaid
- failed
Rarely
The payer did not complete, or the window closed. Nothing is credited, and your webhook says which.
→ payin.failed · payin.expired
Why it arrives
Three mechanics make the promise true. All three are in the engine.
One call, whichever way your customer pays.
Name the method in the request. Bank transfer and card in NGN, GHS and KES. Nigerian businesses get one dedicated account, provisioned once and reused for every transfer. The engine picks the channel for that currency and method — never your code.
The fee is a line, not a mystery.
Our fee posts as its own ledger line beside your credit. If a customer underpays, we charge nothing and return what arrived. If they overpay, we keep the amount you asked for, return the rest and charge only on what you keep.
Every collection is a balanced entry.
Channel asset debited, your wallet and our fee credited — or the ledger refuses the entry. An overpaid or underpaid collection is named as such on the entry, on the dashboard and in the webhook.
Or share a link and write no code
Create a link once. Every payment through it is a normal collection: same statuses, same webhooks, same ledger entry.
Leave amount out and the customer names the sum. Set an expiry so old invoices stop taking money. Tolerances are in minor units; the example allows ₦100 over and nothing under.
1POST /v1/payment-links23{4 "title": "Invoice 0918",5 "description": "Sept retainer",6 "amount": 2500000,7 "currency": "NGN",8 "expiresAt": "2026-09-30",9 "redirectUrl": "https://acme.co/ty",10 "allowedMethods": ["card"],11 "overpaymentTolerance": 10000,12 "underpaymentTolerance": 013}1415→ customer pays at /{slug}/pay
As your finance team sees it
Every collection, what was asked, what arrived, what it cost — filter, export, drill to the ledger.
Illustrative rows. INV-2026-0916 arrived KSh 50 over: it reads successful with the note overpaid, and the excess is returned to the payer.
The entry behind it
What the ledger records when a ₦25,000 collection settles.
| Account | Debit | Credit |
|---|---|---|
| channel_settled_asset | ₦25,000.00 | |
| merchant_wallet | ₦24,900.00 | |
| revenue_fees | ₦100.00 |
Debits equal credits — or the ledger refuses the entry.
Account names are the real ledger families. Fee is illustrative.
Also on the road
The rest of what ships with collections today.
- Payment linksTitle, amount (or leave it open), currency, expiry, redirect, allowed methods and tolerances. Share the link; the customer pays at /{slug}/pay and you write no code.Live
- Virtual accountsA dedicated NGN account per business. Provisioned once after KYC, reused for every bank-transfer collection, and matched to your reference when the transfer lands.Live
- CardCard collections in NGN, GHS and KES. PIN and OTP steps go through POST /v1/payins/{id}/authorize; the status words stay the same four.Live
- Mobile moneyPhone and operator (MTN, Airtel, M-PESA, Vodacom, Orange) in the same request shape. In the sandbox today.Rolling out
- TolerancesSet how far a payment may miss the asked amount, in minor units. Outside the band, the difference is returned and the collection is named overpaid or underpaid.Live
- IdempotencyIdempotency-Key is required on POST /v1/payins. Send the same key twice and you get the same collection back — never a second one.Always on
Collections today: NGN, GHS, KES · bank transfer and card · as of 18 Sep 2026. Full coverage →
Your first collection is a sandbox call away.
No setup fee. Sandbox keys on signup. A balanced entry for every payment that lands.