What you’ll need
- Your secret key. Every call in this guide authenticates with it.
- A funded account in the currency you are paying out. See Give a Customer a Virtual Account for reading balances.
- The recipient’s account number and their bank.
The shape of the flow
1
Find the bank code
List the banks for the currency and pick the recipient’s.
2
Resolve the account name
Check the account number maps to a real name before you send.
3
Send the transfer
One call, with your own reference attached.
4
Read it back
Look the transfer up by your reference and confirm it settled.
Step 1: Find the bank code
Spotflow has its own bank codes. They look likeSPB-60046 and they are not NIBSS or
CBN codes.
GHS, NGN, and so on.
For You still send
NGN, some entries carry the local codes in metadata, which is empty for Ghana:bankCode in the transfer. The metadata is there for reconciling
against your own records.Step 2: Resolve the account name
Before sending, confirm the account number belongs to who you think it does.accountNumber and bankCode are required.
Step 3: Send the transfer
- There are two references. Yours (
reference) and Spotflow’s (spotflowReference, anSPF-TRSF-…string). You look the transfer up by yours; support will ask for Spotflow’s. feeis charged on top ofamount, and it is flat. Here the fee is 12.00 GHS on a 5.00 GHS transfer — more than twice the amount being sent. Batch small payouts rather than sending them one at a time.statusisprocessing, not done. The money has been accepted, not delivered.
Your reference is the idempotency key
Sending the samereference again is rejected:
Step 4: Read the transfer back
Look it up with your reference:status has moved from processing to successful. That is the transfer delivered.
In test mode this takes a few seconds. Poll every few seconds rather than in a tight
loop, and treat
processing as “not finished” — not as a failure.GET /transfers/{id} returns the same shape.
When things go wrong
GET /transfers/resolve-fee is documented as taking amount, currency and type,
but every type value we tried on dev was rejected with
Invalid transaction type, and the spec declares no enum for it. Until that is
settled, take the fee from the fee field on the transfer response.What to do next
- Pay many people at once — upload a CSV instead of one call per person
- Give a Customer a Virtual Account — check the balance you are paying from
- Charge tax on a collection — add VAT to what you collect

