Skip to main content
Every response from the Numero API uses the same envelope, and the HTTP status code always tells you what happened. You never have to read a message to find out whether a request succeeded.

The envelope

data and error are mutually exclusive: exactly one of them is non-null on every response.

Failures

Branch on error.code, never on error.message. Messages are edited for clarity over time; codes are part of the contract.

HTTP status codes

The status code is real — a failed request never arrives as 200. Checking response.ok (or response.status < 400) is a correct success test.

Examples by status

400 — missing API key
400 — invalid API key
400 — signature rejected A rejected signature, a missing signature header and a missing API key all arrive as 400 with a distinct error.code. Branch on the code, not the status.
404 — no such endpoint
409 — idempotency conflict
429 — rate limited
500 — server error

Error codes

Grouped by what you should do about them. Authentication & authorization — fix your credentials; retrying unchanged will not help. missing_field · invalid_api_key · invalid_signature · unauthorized · forbidden Your request — fix the input, then retry. invalid_request · validation_failed · invalid_amount · invalid_account_number · invalid_bank · invalid_bvn · invalid_pin · pin_not_set · invalid_otp · otp_expired · otp_required · already_exists · duplicate_request · idempotency_conflict · not_found · not_implemented Your account’s state — needs an action on your side, often in the dashboard. insufficient_balance · business_not_found · business_inactive · kyc_required · approval_required · activation_required · limit_exceeded · rate_limited The resource — the thing you named does not exist under your business. account_not_found · customer_not_found · recipient_not_found · transaction_not_found · virtual_account_not_found Downstream — usually transient. Retry with the same Idempotency-Key. provider_error · provider_timeout · provider_unavailable · internal_error
A money-movement request that fails with a downstream code may still have reached the provider. Retry with the same Idempotency-Key — that is exactly what it is for — or query the relevant status endpoint before assuming it did not happen.

Handling errors

Log meta.request_id on every failure. It is the one value that lets support find your exact request.

Pagination

List endpoints accept pageNumber and pageSize: On a paginated endpoint, data is the array of records itself and the page details are lifted into meta.pagination:

A note on older integrations

Some Numero endpoints outside this reference — the ones the Numero dashboards themselves call — still answer with an older envelope (status, message, code, reference) and report failures inside a 200 response. That shape is not part of the developer API and is not supported for integrations. Everything documented in this reference uses the envelope and status codes above.