Skip to content

Omari

Omari is a Zimbabwean mobile money wallet. Unlike the other wallets, Omari does not push an approval prompt to the phone. Paying takes two steps: the customer is sent a one-time password by SMS, and that code has to be submitted back to Pesepay to actually move the money. Omari works in both the redirect and seamless flows, in both currencies.

US dollarsZimbabwe dollars
Payment method codePZW216PZW217
Currency code to sendUSDZWG
Amount range$0.50 – $500.000.10 – 100,000.00
Required fieldcustomerPhoneNumbercustomerPhoneNumber
Redirect requiredNoNo

The customer selects Omari on the Pesepay-hosted payment page and enters the phone number registered to their Omari wallet. Omari sends them a six-digit code by SMS, and the hosted page then shows an O’mari OTP field for them to type it into. Nothing extra is required of you — the hosted page handles both steps.

Omari takes two calls. The first sends the customer a one-time code and moves no money; the second spends that code and debits the wallet.

Send the customer’s Omari phone number as customerPhoneNumber to Make Payment:

{
"paymentMethodCode": "PZW216",
"paymentMethodRequiredFields": {
"customerPhoneNumber": "263771234567"
}
}
FieldTypeRequiredDescription
customerPhoneNumberstringYesThe customer’s Omari-registered number, in full international form without a + — twelve digits matching 2637XXXXXXXX

Send PZW217 instead of PZW216 when you’re charging in Zimbabwe dollars — the field is the same.

This call does not debit the customer — it asks Omari to text them a code. The decrypted response comes back with a transactionStatus of PENDING and an otpReference in transactionMetadata:

KeyDescription
otpReferenceOmari’s identifier for the OTP it just sent. Store it against the transaction for support and reconciliation

Store the referenceNumber as usual — you need it for step 2.

Omari sends the customer a six-digit numeric code by SMS. Collect it in your own UI, then post it with the transaction’s referenceNumber. This is the call that debits the wallet.

EnvironmentURL
Productionhttps://api.pesepay.com/api/omari/v1/payments/charge
{
"otp": "123456",
"referenceNumber": "20260901103214123-A1B2C3D4"
}
FieldTypeRequiredDescription
otpstringYesThe six-digit code the customer received by SMS
referenceNumberstringYesThe referenceNumber from step 1

The response carries the resulting status directly:

FieldDescription
referenceNumberThe transaction’s reference number
transactionStatusThe resulting status — SUCCESS when the wallet was debited
paymentProviderMessageHuman-readable description of that status
paymentProviderStatusOmari’s own numeric response code
paymentProviderReferenceOmari’s reference for the debit

The charge response tells you what happened immediately, but reconcile against the result callback or Check Payment Status, exactly as with every other method.

Between steps 1 and 2 the transaction sits at PENDING. That is the normal state for “the OTP has been sent but not yet submitted”, not a sign that something has gone wrong, and polling during this window keeps returning PENDING.

If the customer abandons the flow and no OTP is ever submitted, the transaction stays non-terminal until Pesepay’s status reconciliation resolves it against Omari. It will not complete on its own.

Omari rejects amounts outside its configured range — $0.50 to $500.00 for US dollars, and a much wider range in Zimbabwe dollars. Amounts above the ceiling are rejected, not collected in parts. Validate in your own checkout so the customer sees your error message rather than a failed transaction.

Limits are configured per payment method and currency, and can change without a documentation update. Read them live from Get Payment Methods by Currency (minimumAmount / maximumAmount) if you want your checkout to stay in sync automatically.

What happenedWhat you see
Phone number isn’t in 2637XXXXXXXX formOmari rejects it at step 1 and the transaction ends FAILED
Omari won’t send the OTPStep 1 comes back non-PENDING and the transaction ends FAILED
Customer enters the wrong codeThe transaction ends in a terminal non-success status, usually DECLINED or AUTHORIZATION_FAILED
Customer never enters the codeThe transaction stays PENDING until reconciliation resolves it
Omari times outThe transaction ends TIME_OUT
Insufficient wallet balanceThe transaction ends INSUFFICIENT_FUNDS; the message comes from Omari and is passed through as free text
Amount outside the rangeThe API rejects the request with 400 — see Errors

Failure messages for mobile money come from the wallet provider, not from Pesepay, so match on transaction status rather than on message text.