Create a collection
POST /business/collections
Create a collection and return deposit instructions for the customer. Amounts are in major local currency units (for example, 10000 NGN).
customer.name and customer.email are optional. Both are stored on the collection record for your own reconciliation and shown in your Axra dashboard; they are not forwarded to the underlying payment provider. customer.phone is required for mobile money — it is forwarded to the provider so the deposit prompt reaches the right number.
customer.networkId is optional but strongly recommended on mobile money. It names the payer’s operator — MTN, Orange, Wave — and comes from networks[] on GET /business/local-rails/channels.
On a corridor with more than one operator the payer is on exactly one of them, and a collection sent to the wrong one fails. If you omit networkId we infer the operator from customer.phone, which is correct for the overwhelming majority of numbers but cannot detect a ported number — one that has moved between operators and kept its original prefix. If your checkout already asks the payer which wallet they use, send it and we will use your answer instead of guessing.
If you send a networkId that isn’t currently routable we fall back to inference rather than rejecting the collection.
Bank transfer (NGN)
Response
Mobile money (KES — M-PESA)
customer.phone is required for MoMo collections.
KE resolves to a single operator, so customer.networkId is unnecessary here. On a
multi-operator corridor — Cameroon (MTN / Orange), for example — send it. See
Choosing the right mobile-money operator.
Response
Link-confirmed mobile money (XOF — Wave)
PasssuccessUrl so the customer returns to your app after paying.
Response
Instant EFT (ZAR — Ozow)
For hosted-page rails, redirect the customer toinstructions.url or pass successUrl when creating the collection.
Response
Handle the completion webhook
Fulfill orders when Axra deliverscollection.completed, not when you return deposit instructions to the customer.
- Subscribe to
collection.completedon your webhook endpoint (or include it in the endpoint event list). - Verify
X-Axra-Signatureagainst the raw request body using your webhook secret. See Webhooks. - Read
data.object— the payload mirrorsGET /business/collections/{id}. - Mark the order paid and release goods or services only after
statusiscompleted.
Channel discovery
List channels before creating a collection when your UI needs to show available rails dynamically, or to discover the per-channel minimum and maximum amounts.min and max in the local currency’s major units. min: 0 means no lower bound; max: 0 means no upper bound. Filter or sort on these in your UI so customers don’t see rails their amount doesn’t qualify for.
Choosing the right mobile-money operator
networks[] lists the mobile-money operators available on the corridor. A channel is not an operator — a channel is how we route, an operator is the wallet the payer actually holds money in.
Where networks[] returns more than one entry, the payer is on exactly one of them, and a collection sent to the wrong operator fails at the provider. Two ways to handle it:
- Ask the payer (recommended). Show the operator names from
networks[], and pass the chosennetworkIdascustomer.networkIdon create. This is the only approach that is correct for a ported number, where the phone prefix no longer indicates the operator. - Let us infer it. Omit
customer.networkIdand we derive the operator fromcustomer.phone. Correct for the overwhelming majority of numbers, but blind to porting.
networks[] per corridor rather than hard-coding IDs.
Mobile money on a multi-operator corridor (XAF — Cameroon)
Cameroon carries both MTN and Orange. Readnetworks[] from
GET /business/local-rails/channels, let the payer pick, and pass the chosen
networkId:
networkId and we infer MTN from the 672 prefix. Send it and we use your value —
which is the only way to be right when the payer has ported their number between
operators.
Minimums and maximums
Local-rail channels have provider-side minimum (and sometimes maximum) amounts. If you callPOST /business/collections with an amount that doesn’t fit any channel for the requested rail and country/currency, you get a 400 with the actual minimum surfaced:
/business/local-rails/channels rather than hard-coding values in your client.
Idempotency
PassidempotencyKey on create to dedupe retries within one hour. A duplicate key returns the original collection instead of minting a second virtual account.
Polling
Webhooks are the source of truth. If you must poll, callGET /business/collections/{id} about every five seconds while status is pending or processing. Use GET /business/collections/{id}/refresh to force a provider resync before giving up.
Status reference
Error codes
API Reference
Full endpoint documentation.
