Mobile Money

The Mobile Money Payout API allows merchants to disburse funds directly to mobile money wallets across multiple African countries. This API uses a single-step process where you provide the recipient's details directly in the payout request.

Note: Currency and network availability depends on your business account permissions. Contact support to enable additional currencies.

How it works

The payout flow is asynchronous. Here is the typical journey:

  1. Initiation: Send a POST request with the recipient's details and amount.
  2. Processing: OGateway validates the request and processes the disbursement.
  3. Verification: OGateway sends a Webhook to your callbackURL confirming the success or failure.

Base URL

https://api.ogateway.io

Authentication

All requests must include your API key in the Authorization header:

Authorization: your_api_key

API Key Types

  • Test Keys: Start with test_ (e.g., test_sk_xxxxx) - Used for testing in sandbox mode.
  • Live Keys: Start with live_ (e.g., live_sk_xxxxx) - Used for real transactions.

Important: V1 Payouts are primarily accessed via Test Keys for development.

Initiate Payout

Disburse funds to a mobile money wallet. Endpoint: POST /disbursements/mobilemoney

Body Parameters

ParameterTypeRequiredDescription
recipientsarrayYesAn array containing the recipient details. Note: V1 currently supports only one recipient per request.
referencestringYesA unique string to identify this transaction in your system. Must be unique.
callbackURLstringNoThe URL for the final transaction status webhook. This overrides the default callback URL saved under your business.

Recipient Object (inside recipients array)

ParameterTypeRequiredDescription
amountnumberYesThe amount to transfer (e.g., 50.00).
currencystringYesThe currency code (See Currency codes for available countries).
networkstringYesThe mobile network provider (e.g., MTN, VOD, ATM, ORANGE).
accountNamestringYesThe registered name of the wallet holder.
accountNumberstringYesThe recipient's mobile money number. Phone number will be automatically cleaned and normalized to international format.

Example Request

curl --request POST \
  --url https://api.ogateway.io/disbursements/mobilemoney \
  --header 'Authorization: your_api_key' \
  --header 'Content-Type: application/json' \
  --data '{
    "recipients": [
      {
        "amount": 50,
        "currency": "GHS",
        "network": "MTN",
        "accountName": "Jane Doe",
        "accountNumber": "0244123456"
      }
    ],
    "reference": "momo_payout_001",
    "callbackURL": "https://your-website.com/webhook"
  }'

Example Response (200 OK)

The API returns an array containing the initiated transaction details.

[
  {
    "id": "trans_987654321",
    "amount": 50,
    "fee": 0,
    "currency": "GHS",
    "status": "INITIATED",
    "channel": "MOMO",
    "type": "CREDIT",
    "customer": {
      "email": "",
      "accountName": "Jane Doe",
      "accountNumber": "0244123456"
    },
    "metadata": {
      "smsFee": 0
    },
    "reason": "CREDIT_MOMO",
    "network": "MTN",
    "checkout_url": null,
    "reference_business": "momo_payout_001",
    "provider_message": "",
    "virtual_account": null
  }
]

Example Error Response (400 Bad Request)

{
  "statusCode": 400,
  "message": "Only one recipient at a time please!",
  "error": "Bad Request"
}

See Error Codes for Error Responses.

Handling the Callback

See full details in our Callbacks section

Payouts are processed asynchronously. Listen for a Webhook at your callbackURL to confirm the final status.

Success Payload Example

{
  "id": "trans_987654321",
  "amount": 50,
  "fee": 0.5,
  "currency": "GHS",
  "status": "COMPLETED",
  "channel": "MOMO",
  "type": "CREDIT",
  "customer": {
    "accountName": "Jane Doe",
    "accountNumber": "233244123456"
  },
  "metadata": null,
  "reason": "CREDIT_MOMO",
  "network": "MTN",
  "checkout_url": null,
  "provider_message": "Success",
  "reference_business": "momo_payout_001",
  "created_at": "2023-10-27T10:05:00.000Z",
  "updated_at": "2023-10-27T10:05:30.000Z",
  "virtual_account": null,
  "error_message": null,
  "telco_response": "APPROVED",
  "instructions": null
}

Failed Payload Example

{
  "id": "trans_987654321",
  "amount": 50,
  "fee": 0,
  "currency": "GHS",
  "status": "FAILED",
  "channel": "MOMO",
  "type": "CREDIT",
  "customer": {
    "accountName": "Jane Doe",
    "accountNumber": "233244123456"
  },
  "metadata": null,
  "reason": "CREDIT_MOMO",
  "network": "MTN",
  "checkout_url": null,
  "provider_message": "Failed",
  "reference_business": "momo_payout_001",
  "created_at": "2023-10-27T10:05:00.000Z",
  "updated_at": "2023-10-27T10:06:00.000Z",
  "virtual_account": null,
  "error_message": "Transaction failed at the Provider",
  "telco_response": null,
  "instructions": null
}

Best Practices

  1. Unique References: Always use a unique reference for each payout to avoid duplicates.
  2. Wallet Balance: Ensure your OGateway wallet has sufficient funds for the payout amount plus applicable fees.
  3. Idempotency: Do not retry failed requests immediately with the same reference; check the status first.
  4. Single Recipient: Although the API accepts an array, ensure you only send one recipient object per request as multi-recipient support has been removed. The array has been left as-is for backward compatibility and may be removed in future versions.
  5. Webhook Security: Verify webhook signatures to ensure callbacks originate from OGateway.