Mobile Money (MoMo) Payment

This flow allows you to collect payments via Mobile Money (MoMo). The process requires fetching available providers for the target currency, initiating the payment prompt on the customer’s device, and verifying the final status of the transaction.

Here is the 3-step process for seamless integration:

  • 1 Fetch Provider List
  • 2 Initialize Payment Request
  • 3 Verify Transaction

1 Fetch Provider List

Before initiating a MoMo payment, you need to retrieve the list of active Mobile Money providers for your target currency (e.g., GHS).

Endpoint

GET https://backendapi.sayswitchgroup.com/api/s2s/v1/momo/providers/:currency

Sample cURL Request

curl -X GET 'https://backendapi.sayswitchgroup.com/api/s2s/v1/momo/providers/GHS' \
  -H "Authorization: Bearer YOUR_SECRET_KEY"

Sample Response

{
    "status": true,
    "message": "Momo Collection Providers Fetched",
    "banks": [
        {
            "name": "AIRTELTIGO MONEY GH",
            "code": "at money"
        },
        {
            "name": "GHANA MONEY",
            "code": "gmogh"
        },
        {
            "name": "MTN MOBILE MONEY GH",
            "code": "mtn"
        },
        {
            "name": "VODAFONE CASH GH",
            "code": "telecel"
        }
    ]
}

2 Initialize Payment Request

Send a POST request to trigger a push prompt on the customer’s mobile device, requesting them to authorize the payment with their PIN.

Endpoint

POST https://backendapi.sayswitchgroup.com/api/s2s/v1/momo/payment_request

Sample cURL Request

curl -X POST https://backendapi.sayswitchgroup.com/api/s2s/v1/momo/payment_request \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_SECRET_KEY" \
  -d '{
    "amount": "1",
    "bankName": "AIRTELTIGO MONEY GH",
    "bankCode": "at money",
    "currency": "GHS",
    "phone": "0270073750",
    "description": "Server to Server test",
    "reference": "2026031616016577",
    "callbackUrl": "https://webhook.site/27fef737-8a0f-469c-81a1-e88f3ae7a925"
}'

Sample Response

{
    "success": true,
    "detail": "Request Sent",
    "ResponseDescription": "Authorize payment by entering your AT Money PIN."
}

Response Field

FieldTypeDescription
successbooleanIndicates if the push request was successfully initiated
detailstringStatus message of the request
ResponseDescriptionstringInstructions or message returned from the provider

3 Verify Transaction

After the payment is initiated, the transaction will likely be in a pending state while the user enters their PIN. You must verify the status of the transaction using the reference passed during initialization.

Endpoint

GET https://backendapi.sayswitchgroup.com/api/v1/transaction/verify/:reference

Sample cURL Request

curl -X GET https://backendapi.sayswitchgroup.com/api/v1/transaction/verify/2026031616016577 \
  -H "Authorization: Bearer YOUR_SECRET_KEY"

Sample Response

{
    "success": true,
    "message": "Verification successful",
    "data": {
        "amount": "1",
        "currency": "GHS",
        "status": "pending",
        "transaction_date": null,
        "reference": "2026031616016577",
        "domain": "live",
        "gateway_response": null,
        "channel": "momo",
        "ip_address": null,
        "originator_name": "",
        "originator_account_number": "",
        "fees": "0.012",
        "plan": null,
        "requested_amount": "1"
    },
    "customer": {
        "id": 0,
        "customer_code": "",
        "first_name": "",
        "last_name": "",
        "email": ""
    },
    "log": {
        "time_spent": 0,
        "attempts": 0,
        "authentication": null,
        "errors": 0,
        "success": false,
        "channel": "momo",
        "history": []
    }
}

<Callout type=‘warning’> Because MoMo transactions require the user to manually enter a PIN on their mobile device, the immediate verification status will often be pending. You should rely on webhooks to confirm the final success or failed status. </Callout>


Webhook Notification (Asynchronous Confirmation)

Once the user successfully authorizes the payment on their phone, Sayswitch will send a POST request to the callbackUrl you provided during initialization.

Sample Webhook Payload:

{
  "notify": "transaction",
  "notifyType": "successful",
  "data": {
    "id": 12766,
    "business_id": 96,
    "currency": "GHS",
    "amount": "1",
    "reference": "SSW_17737291116942552",
    "ip_address": null,
    "channel": "momo",
    "type": "transaction",
    "domain": "live",
    "fees": "0.012",
    "customer_id": 1402,
    "plan": null,
    "requested_amount": "1",
    "status": "success",
    "card_attempt": 0,
    "message": null,
    "created_at": "2026-03-17T06:31:51.000000Z",
    "paid_at": "2026-03-17 07:33:09",
    "customer": {
      "id": 1402,
      "first_name": "seun",
      "last_name": "seun",
      "email": "africlique@gmail.com",
      "phone": "",
      "bvn": null,
      "domain": "live",
      "customer_code": "CUS_xtloit5ormiragh",
      "batch_id": null,
      "metadata": "{}",
      "status": "active"
    }
  }
}

Would you like me to add a dedicated section explaining how to handle Webhook signature validation or specific error codes for MoMo?