Flows
Last updated: 2026-05-22
Use this page as an integration playbook for pay-ins and pay-outs.
When to use H2P vs H2H
Use H2P (host-to-page) when:
- You want the customer to complete payment on a hosted payment page (
paymentUrlwhen returned). - You want minimal payment UI logic on your side.
Use H2H (host-to-host) when:
- You orchestrate payment steps directly from your application.
- You need method-specific experiences (bank transfer instructions, mobile money OTP flow) and handle any returned payment URL or method-specific instructions in your application.
H2P pay-in flow
- Call
GET /merchant/api/v1/catalogand choose the market (countryCode,currencyCode) for the payment flow you are implementing. UsemethodsInas the enabled inbound method families for that market. - For mobile-money pay-ins, call
GET /merchant/api/v1/payins/mmofor the selected market and request context. - Call
POST /merchant/api/v1/payins/initializewith the selected market, the matchingPAYMENT_METHOD_*enum value, and the request context you will use operationally. Send the selected marketcountryCodefrom/catalog; it is required for mobile-money pay-ins and country-scoped currencies such asNGN,KES,GHS,ZAR,XAF, andXOF. For operator-aware mobile money flows, include the returnedoperatorexactly as returned inmobileMoneyOperator. - Save
paymentOrder.idand yourmerchantReference. - If
paymentOrder.paymentUrlis returned, redirect customer there. - Customer may return to your
redirectUrl. - Use webhook or
GET /merchant/api/v1/payment/{id}to reconcile the latest payment status.
warning
Redirect return is informational. It is not a final success signal.
H2H pay-in flow
- Call
GET /merchant/api/v1/catalogand choose the market (countryCode,currencyCode) for the payment flow you are implementing. UsemethodsInas the enabled inbound method families for that market. - If the selected inbound method needs bank detail, call
GET /merchant/api/v1/payins/banksfor the selected market and request context. - For mobile-money pay-ins, call
GET /merchant/api/v1/payins/mmofor the selected market and request context. - Call
POST /merchant/api/v1/payins/createwith the selected market, the matchingPAYMENT_METHOD_*enum value, and the request context you will use operationally. Send the selected marketcountryCodefrom/catalog; it is required for mobile-money pay-ins and country-scoped currencies such asNGN,KES,GHS,ZAR,XAF, andXOF. For operator-aware mobile money flows, include the returnedoperatorexactly as returned inmobileMoneyDetails.operator. For voucher-based mobile-money pay-ins, also includemobileMoneyDetails.voucherPin. - Process any returned
paymentUrlor method-specific instructions:bankAccountDetails.redirectUrlfor authorization redirect,bankTransferDetailsaccount details for bank transfer,mobileMoneyDetailsinstructions for mobile money.
- If
mobileMoneyDetails.isOtpAuthRequired = true, callPOST /merchant/api/v1/payins/authorize-otp. - Wait for webhook updates and/or poll
GET /merchant/api/v1/payment/{id}until you have the latest outcome to reconcile.
For mobile-money examples and operator handling, see Mobile money, Vouchers, and Mobile money operators.
Pay-out flow
- Call
GET /merchant/api/v1/catalogand choose the market (countryCode,currencyCode) for the payout flow you are implementing. UsemethodsOutas the enabled outbound method families for that market. - If your flow requires pre-funding checks, read
GET /merchant/api/v1/balancesand enforce your own pre-checks. - If the selected outbound method needs bank or operator detail, call:
GET /merchant/api/v1/payouts/banksGET /merchant/api/v1/payouts/mmo
- For mobile-money pay-out, reuse the
operatorreturned byGET /merchant/api/v1/payouts/mmoexactly as returned inmobileMoneyDetails.operator. IncludemobileMoneyDetails.accountNamewhen the selected route requires a beneficiary account name. - Call
POST /merchant/api/v1/payouts/createwith the selected market, the matchingPAYMENT_METHOD_*enum value, and the request context for your payout flow. Send the selected marketcountryCodefrom/catalog; it is required for country-scoped currencies such asNGN,KES,GHS,ZAR,XAF, andXOF, and it must stay the same across discovery and payout creation. - Track status through webhook and/or
GET /merchant/api/v1/payment/{id}. - Finalize only after processing the latest webhook or poll status for that payment.
For operator-aware mobile-money pay-ins, retrieve the operator with GET /merchant/api/v1/payins/mmo before creating or initializing the payment. For mobile-money payouts, retrieve the operator with GET /merchant/api/v1/payouts/mmo before creating the payout. See Mobile money for request examples.
Payment status state machine
stateDiagram-v2
[*] --> CREATED
CREATED --> PENDING
CREATED --> COMPLETED
CREATED --> FAILED
CREATED --> CANCELLED
CREATED --> EXPIRED
PENDING --> PENDING
PENDING --> COMPLETED
PENDING --> FAILED
PENDING --> CANCELLED
PENDING --> EXPIRED
FAILED --> COMPLETED: late provider success
COMPLETED --> [*]
CANCELLED --> [*]
EXPIRED --> [*]
Integration rules
warning
HTTP 200 from your webhook handler means delivery accepted. It does not mean payment success.
- Use
paymentOrder.statusas the business outcome. - Treat webhooks as primary asynchronous signal.
- Use
GET /merchant/api/v1/payment/{id}for reconciliation, retries, and post-redirect verification. - Handle repeated or corrective status updates idempotently. For example,
PENDING -> PENDINGcan repeat, and a late provider confirmation can correctFAILEDtoCOMPLETED.