Web Rabbit MediaDocs
Reference

Provider codes

Lifecycle statuses and the upstream code field returned on every transaction.

Every collection response includes a code field forwarded from the upstream provider (OGateway by default, or 360Pay or JuniPay, depending on how your business is routed), plus a normalised status (approved · pending · failed). The raw code is useful for support tickets and analytics.

iAlways a string
code is returned as a JSON string on every endpoint, e.g. "02". Keep the leading zero — never parse it as a number.
›OGateway failure reasons
On OGateway, the default provider, a failed payment carries a plain-language reason (for example insufficient balance, wrong PIN or timeout). It maps onto the same status as every other provider.
›Several upstream providers, one status
On 360Pay the raw code is a two-digit numeric string ("00", "02"…). On JuniPay it is a word ("success", "pending", "failed"). Both are normalised onto the same status, so integrate against status and treat code as diagnostic metadata only.

Transaction status codes

The provider reports a transaction state on the settlement callback. We map it as follows:

FieldTypeDescription
00 — SUCCESSapprovedPayment settled. The platform fee is applied and your net balance is credited.
01 — FAILEDfailedDeclined, wrong PIN, insufficient funds, or cancelled by the customer.
02 — PENDINGpendingCharge created — the customer still has to authorise on their handset or complete checkout.
03 — PROCESSINGpendingAccepted by the network and being processed. Wait for the callback.

JuniPay codes

JuniPay returns lowercase words rather than digits. Comparison is case-insensitive on our side.

FieldTypeDescription
success / successful / completed / paidapprovedPayment settled.
pending / initiated / createdpendingCharge created, awaiting customer authorisation.
processing / ongoingpendingAccepted by the network, in flight.
failed / declined / errorfailedDeclined by the wallet, the network, or the customer.
cancelled / canceled / abandonedfailedCustomer dismissed the prompt or the checkout expired.
insufficient_fundsfailedWallet balance too low.
reversed / refundedreversedSettled payment clawed back — triggers collection.reversed.
unknown codependingAnything we do not recognise is held as pending and re-polled — never guessed as approved or failed.

360Pay codes

Two-digit numeric strings. Keep the leading zero.

FieldTypeDescription
"00"approvedTransaction successful.
"01"failedTransaction failed — generic decline.
"02"pendingAwaiting customer authorisation on the handset.
"03"pendingProcessing at the network.
"04"failedInsufficient funds in the wallet.
"05"failedInvalid or unregistered wallet number.
"06"failedCustomer cancelled or the prompt timed out.
"07"failedWallet limit or KYC restriction on the customer account.
"09"pendingQueued upstream; the callback resolves it.
"12"failedDuplicate reference at the provider.
"91"pendingNetwork or issuer unavailable — re-polled, not failed.
reversal callbackreversedA settlement callback marking a prior success as reversed.
unknown codependingHeld as pending and re-polled.
!Integrate against status, not code
Providers add codes without notice. status is our contract and is exhaustive (pending · approved · failed · reversed);code and reason are diagnostic passthrough for your support desk.

Institution codes

You send a friendly network value and we route it to the provider's institution code.

FieldTypeDescription
MTN300591MTN Mobile Money.
TELECEL300594Telecel Cash (formerly Vodafone Cash). "VODAFONE" and "VDF" are still accepted and normalised to TELECEL.
AT300592AT Money (AirtelTigo). "ATL", "TGO" and "AIRTELTIGO" are still accepted.
GMONEY300574G-Money wallet.

Platform codes

FieldTypeDescription
upstream_errorfailedWe could not reach the provider (HTTP 502). Safe to retry with the same Idempotency-Key.
insufficient_scopeerrorHTTP 403 — the API key is read-only. Create a key with write access.
provider_unsupportederrorHTTP 501 — payout endpoints are retired; payouts are settled manually from the dashboard.

Not found

Requesting a transaction_id that does not belong to your business (or to the current mode) returns HTTP 404 with a machine-checkable error body — never a fake failed verdict:

HTTP/2 404
{
  "error": "transaction_not_found",
  "transaction_id": "000000000000"
}
!Never treat 404 as a failed payment
A 404 means we have no record of that id — it does not mean the customer wasn't charged. If you created a transaction and then lost the id (network drop mid-response), recover it with GET /v1/transactions?idempotency_key=… before assuming failure.
›Where the code lives
We surface the raw code as code and the human message as reason on every transaction response and in the ledger. Filter/search by code from Transactions → Payments in your dashboard.