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
| Field | Type | Description |
|---|---|---|
success | boolean | Indicates if the push request was successfully initiated |
detail | string | Status message of the request |
ResponseDescription | string | Instructions 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?