Developers
Build on the same rails the dashboard uses.
There is no second-class API. Anything you can do in the dashboard, you can do over HTTP, with the same fees, the same records and the same failure codes.
Read the docsWhat you get on day one
Test keys immediately
Build the integration while your company verification is still running.
One set of records
A payment made over the API and one made in the dashboard are the same object.
Fees in the response
What it cost comes back with the result, so your ledger never has to guess.
Errors you can act on
Named failure codes for the things that really go wrong on local rails.
The whole product, over HTTP
There is no cut-down API. The dashboard is a client, and so are you.
Everything a person can do in Numero, your code can do — with the same fees, the same records and the same results. What you build on is what we run our own product on.
Collect
Issue account numbers and know the moment money lands against one.
Pay out
Single or bulk, idempotent, with the fee returned before you commit.
Reconcile
Your own reference on every object, so your ledger and ours agree.
Report
Balances and statements you can page through, returned in minor units.
What teams build
Three things people come to us for.
Marketplace payouts
Hold funds centrally, then pay hundreds of sellers on a schedule — each payment reporting its own outcome back into your system.
Collections that reconcile themselves
An account number per customer or invoice, so an incoming payment updates the right record without anyone reading a statement.
Money inside your own product
Let your users get paid and pay out without leaving your app, while the records stay auditable on our side.
Write a payout in four lines
Send money with one request.
An idempotency key means a retry can never pay someone twice, and the response carries the fee — so your ledger can record what it cost without a second call.
POST/numeroaccount/api/v1/business/single
POST/numeroaccount/api/v1/virtual-accounts
GET/numeroaccount/api/v1/wallets/balance
GET/numeroaccount/api/v1/invoices
curl -X POST "https://api.usenumero.com/numeroaccount/api/v1/business/single" \ -H "Content-Type: application/json" \ -H "X-Numero-Api-Key: sec_live_..." \ -H "X-Numero-Signature: $SIGNATURE" \ -H "X-Numero-Signature-Version: v2" \ -H "Idempotency-Key: 5f3c1a" \ -d '{ "amount": 25000000, "destinationBankCode": "058", "destinationAccountNumber": "0123456789", "narration": "October retainer" }'
import { Numero } from "@numero/sdk"; const numero = new Numero({ apiKey: process.env.NUMERO_API_KEY }); const transfer = await numero.transfers.create({ amount: 25_000_000, bankCode: "058", accountNumber: "0123456789", narration: "October retainer" }, { idempotencyKey: "5f3c1a" }); console.log(transfer.data.transferReference);
import os from numero import NumeroClient client = NumeroClient(api_key=os.environ["NUMERO_API_KEY"]) transfer = client.transfers.create( amount=25_000_000, bank_code="058", account_number="0123456789", narration="October retainer", idempotency_key="5f3c1a", ) print(transfer.data.transfer_reference)
Response200 OK
{
"data": {
"transferReference": "TRF-20261015-89420",
"status": "processing",
"fee": 40,
"totalDebit": 25000040
},
"error": null,
"meta": { "requestId": "req_365123ebc" }
}Build against it today.
Test keys now; live keys once your company is verified.