Skip to main content

Key Requirements

Retrieve your API keys from your dashboard by following the steps on our Authentication page. Use your public API key for all collection requests.
Set the following headers on every request:
Set X-TenantID to test while developing and live when processing real payments. X-ProductID defaults to "app" for all requests.
Collections to countries other than Nigeria are available on request only. Send an email to support@payaza.africa to request access. You will be granted access once the team reviews and approves your request.
Make sure your webhook URL is saved on the dashboard and configured to accept POST requests. See our Webhooks guide for setup instructions.

Supported currencies and countries

Bank codes (customer_bank_code) differ per currency and country.

The full list of Payaza MoMo collection codes is availablehere.

Phone number format

The customer_number field requires the phone number in international format (country code + number, no + or spaces).
Passing a phone number in the wrong format would result in a transaction error. Double-check the digit count before sending the request.

How collections work

Mobile Money collections follow a different flow from card payments because the customer must approve the payment on their own phone. The flow varies slightly depending on the collection type:
  1. Your server calls Process Collection with the customer’s phone number and amount.
  2. Payaza instructs the telecom network to send a USSD prompt to the customer’s phone.
  3. The customer sees a message like “Approve payment of GHS 50 to Business X?” and enters their MoMo PIN.
  4. Your server uses the Transaction Status Query API or listens for a webhook to confirm success or failure.
  1. Your server calls Process Collection.
  2. Check the requires_otp field in the response:
    • If false — the customer is prompted directly on their phone. Check for the status.
    • If true — the customer receives an OTP via SMS. Your UI must collect the OTP and submit it via XOF Process OTP API before the payment can proceed.
  3. After the OTP is submitted (Required for Orange CIV XOF Collections), use the Transaction Status Query or listen for a webhook.
  1. Your server calls Process Collection with currency_code: “ZAR”.
  2. The response includes a payment_completion_url. Redirect the customer to this URL to complete their EFT or Capitec payment.
  3. After the customer completes the bank redirect, Use the Transaction Status Query API or listen for a webhook.
  1. Your server calls Process Collection with currency_code: “SLE” and the customer’s Sierra Leone mobile money number.
  2. Payaza instructs the mobile money network (Afrimoney or Orange Money) to send a payment prompt to the customer’s phone.
  3. The customer approves the payment on their device.
  4. Use the Transaction Status Query API or listen for a webhook to confirm the final outcome.

Step 1 — Process Collection

Initiate a collection from the customer’s Mobile Money wallet.
Sample response — Standard MoMo (no OTP)
Sample response XOF with OTP required(For Orange CIV Only)
Sample response — XOF with No OTP required
Sample response — ZAR EFT (redirect required)
Sample response — ZAR Capitec (redirect required)
A response_code: "09" and response_message: "PENDING" is the expected successful response from this endpoint. It does not mean the collection succeeded — it means the prompt has been sent or the redirect URL is ready. Always confirm the final outcome via Step 3 (Status Query) or a webhook.
API reference: Momo, XOF and ZAR Process Collection

Step 2 — XOF Process OTP (XOF only)

This step only applies to XOF collections where the initial Process Collection response returned requires_otp: true. This applies to all Orange CIV Money transactions. Skip to Step 3 for all other currencies.
When requires_otp is true, the customer receives an OTP on their phone. Your UI must collect this code from the customer and submit it before the payment can be authorised. Use the payment_token, payee, payment_method, and transaction_channel values directly from the Process Collection response.
Sample response
Test credentials for XOF:
  • Phone number (no OTP required): 225000476807
  • Phone number (OTP required): 2251114462945 - Test OTP value: 4567
  • API reference: XOF Process OTP

    Step 3 — Transaction Status Query

    Check the final status of a collection. Use this endpoint to confirm whether the payment was successful, failed, or is still pending. When to use it: Use this endpoint after initiating a collection (and after submitting the OTP for XOF), or use it as a fallback if a webhook is not received.
    Sample response — pending (customer has not yet approved)
    Sample response — successful
    Never assume a MoMo collection was successful just because the initial request went through. A customer can ignore the USSD prompt, cancel it, or have insufficient funds. Always confirm the final status via this endpoint or a webhook before fulfilling an order.
    API reference: Transaction Status Query

    Webhooks

    Payaza sends webhook events for both successful and failed collections. Webhooks are the recommended way to receive the final status rather than continuous polling. Sample Successful Collection payload
    Sample Failed Collection payload
    Always verify the webhook signature before processing the payload. See the Webhooks guide for verification steps.

    Response Codes

    Developer notes

    • Always generate a unique transaction_reference per collection to avoid duplicate errors.
    • A response_code: "09" on Process Collection is normal — it means the prompt was sent, not that the collection succeeded.
    • For XOF, check requires_otp in the Process Collection response before deciding whether to show an OTP input field in your UI.
    • For ZAR, check redirect_customer_to_url_processing and redirect the customer to payment_completion_url to complete payment via their bank.
    • Webhooks are sent for both successful and failed collections. Use Transaction Status Query as a fallback when a webhook is not received within your expected timeout.
    • Collections are not retried automatically. If a collection fails or times out, your application must handle the retry logic and generate a new transaction_reference.
    • Use the bank code that matches both the currency and the telecom network of the customer’s MoMo account. Mismatched bank codes will fail silently on some networks.