Gambia
The 54Pay Collections API enables merchants to accept mobile money payments in Gambia. Each operator has a unique payment completion flow that remains consistent across integration types
Supported Operators
| Operator | Code | Payment Flow |
|---|---|---|
| WAVE | GMWAV | Payment link redirect |
| AFRIMONEY | GMAFR | STK Push + API completion |
| QMONEY | GMQMO | OTP verification + API completion |
Payment Completion Methods
Each operator uses a distinct payment completion mechanism. Understanding these flows is critical for successful integration.
-
WAVE - Payment Link
After initiating a collection, WAVE returns a payment URL (either paymentCompletionUrl or redirectionUrl). Direct the customer to this link where they'll complete payment through WAVE's interface. Flow: API Request → Receive Payment Link → Customer Completes Payment via Link
-
AFRIMONEY - STK Push
AFRIMONEY sends an STK push notification directly to the customer's device for payment authorization. After the customer authorizes the payment on their device, you must call the /complete-payin endpoint to finalize the transaction. Flow: API Request → STK Push to Customer → Customer Authorizes → Call /complete-payin to Finalize
-
QMONEY - OTP Verification
QMONEY sends a 6-digit OTP to the customer's mobile number. Collect this OTP from the customer and include it in the complete-payin request to complete the transaction. Flow: API Request → OTP Sent to Customer → Collect OTP → Call /complete-payin with OTP
Supported Integration Type
The API supports direct server-to-server communication via the requestType parameter:
| Type | Request Type | Description |
|---|---|---|
| Host-to-Host (H2H) | B | Direct server-to-server communication |
Authentication
All API requests require authentication using your merchant credentials.
Headers
| Header | Type | Description |
|---|---|---|
| X-module | string | Base64(amount+transactionReference+customerNumber) |
| X-business | string | Base64-encoded Merchant Public Key: {Base64(Merchant Public Key)} |
| Content-Type | string | Must be application/json |
| x-app | string | Must be api |
Initiate Collection
Creates a payment collection request.
POST https://subsidiary.dev.mypaygate.co/collection/v1/payin
Initiate Collection - WAVE
BASH
curl --location 'https://subsidiary.dev.mypaygate.co/collection/v1/payin' --header 'Accept: application/json' --header 'X-module: {Base64(amount+transactionReference+customerNumber)}' --header 'X-business: {Base64(Merchant Public Key)}' --header 'Content-Type: application/json' --header 'X-app: api' --data-raw '{
"requestHeader": {
"clientId": "",
"requestType": "B"
},
"customerName": "Ayo Akin",
"customerEmail": "a@a.com",
"customerNumber": "2207700000",
"transactionReference": "TXN10273646",
"transactionDescription": "Test",
"transactionAmount": 10,
"transactionCurrency": "GMD",
"transactionCountry": "GM",
"successUrl": "",
"errorUrl": "",
"cancelUrl": "",
"operatorCode": "GMWAV",
"webhookUrl": ""
}'
'
Response:
JSON
{
"responseDetails": {
"responseCode": "09",
"responseMessage": "PENDING",
"statusDescription": "TRANSACTION IN PROGRESS"
},
"transactionReference": "TXN91911264",
"lengthOfOtp": 0,
"paymentCompletionRequired": false,
"redirectionRequired": true,
"redirectionUrl": "https://pay.wave.com/..."
}
Payment Completion:
Direct the customer to the payment link provided in either paymentCompletionUrl or redirectionUrl. The customer completes payment through WAVE's interface. No additional API call is required.
Initiate Collection - AFRIMONEY
BASH
curl --location 'https://subsidiary.dev.mypaygate.co/collection/v1/payin' --header 'Accept: application/json' --header 'X-module: {Base64(amount+transactionReference+customerNumber)}' --header 'X-business: {Base64(Merchant Public Key)}' --header 'Content-Type: application/json' --header 'X-app: api' --data-raw '{
"requestHeader": {
"clientId": "",
"requestType": "B"
},
"customerName": "Ayo Akin",
"customerEmail": "a@a.com",
"customerNumber": "2207700000",
"transactionReference": "TXN10273646",
"transactionDescription": "Test",
"transactionAmount": 10,
"transactionCurrency": "GMD",
"transactionCountry": "GM",
"successUrl": "",
"errorUrl": "",
"cancelUrl": "",
"operatorCode": "GMAFR",
"webhookUrl": ""
}'
Response:
JSON
{
"responseDetails": {
"responseCode": "09",
"responseMessage": "PENDING",
"statusDescription": "TRANSACTION IN PROGRESS"
},
"transactionReference": "TXN75714374",
"lengthOfOtp": 0,
"paymentCompletionRequired": true,
"paymentCompletionUrl": "/collection/v1/complete-payin",
"redirectionRequired": false
}
Complete Payment (AFRIMONEY)
AFRIMONEY sends an STK Push to the customer's device. After the customer authorizes the payment, finalize the transaction by calling the complete-payin endpoint.
POST https://subsidiary.dev.mypaygate.co/collection/v1/complete-payin
curl --location 'https://subsidiary.dev.mypaygate.co /collection/v1/complete-payin' --header 'Accept: application/json' --header 'X-module: {Base64(amount+transactionReference+customerNumber)}' --header 'X-business: {Base64(Merchant Public Key)}' --header 'Content-Type: application/json' --header 'X-app: api' --data-raw '{
"requestHeader": {
"clientId": "",
"requestType": "B"
},
"customerName": "Ayo Akin",
"customerEmail": "a@a.com",
"customerNumber": "2207700000",
"transactionReference": "TXN10273646",
"transactionDescription": "Test",
"transactionAmount": 10,
"transactionCurrency": "GMD",
"transactionCountry": "GM",
"successUrl": "",
"errorUrl": "",
"cancelUrl": "",
"operatorCode": "GMAFR",
"webhookUrl": ""
}'
Initiate Collection - QMONEY
BASH
curl --location 'https://subsidiary.dev.mypaygate.co/collection/v1/payin' --header 'Accept: application/json' --header 'X-module: {Base64(amount+transactionReference+customerNumber)}' --header 'X-business: {Base64(Merchant Public Key)}' --header 'Content-Type: application/json' --header 'X-app: api' --data-raw '{
"requestHeader": {
"clientId": "",
"requestType": "B"
},
"customerName": "Ayo Akin",
"customerEmail": "a@a.com",
"customerNumber": "2207700000",
"transactionReference": "TXN10273646",
"transactionDescription": "Test",
"transactionAmount": 10,
"transactionCurrency": "GMD",
"transactionCountry": "GM",
"successUrl": "",
"errorUrl": "",
"cancelUrl": "",
"operatorCode": "GMQMO",
"webhookUrl": ""
}'
Response:
JSON
{
"responseDetails": {
"responseCode": "09",
"responseMessage": "PENDING"
},
"transactionReference": "TXN96096935",
"otpIsRequired": true,
"lengthOfOtp": 6,
"paymentCompletionRequired": true,
"paymentCompletionUrl": "/collection/v1/complete-payin",
"redirectionRequired": false
}
Complete Payment (QMONEY)
QMONEY sends a 6-digit OTP to the customer's mobile number. Collect this OTP and include it in the complete-payin request.
POST https://subsidiary.dev.mypaygate.co/collection/v1/complete-payin
curl --location 'https://subsidiary.dev.mypaygate.co/collection/v1/complete-payin' --header 'Accept: application/json' --header 'X-module: {Base64(amount+transactionReference+customerNumber)}' --header 'X-business: {Base64(Merchant Public Key)}' --header 'Content-Type: application/json' --header 'X-app: api' --data-raw '{
"requestHeader": {
"clientId": "",
"requestType": "B"
},
"customerName": "Ayo Akin",
"customerEmail": "a@a.com",
"customerNumber": "2207700000",
"transactionReference": "TXN10273646",
"transactionDescription": "Test",
"transactionAmount": 10,
"otpCode": "123456",
"transactionCurrency": "GMD",
"transactionCountry": "GM",
"successUrl": "",
"errorUrl": "",
"cancelUrl": "",
"operatorCode": "GMQMO",
"webhookUrl": ""
}'
Quick Reference: Payment Completion Summary
| Operator | Method | Steps | Additional API Call |
|---|---|---|---|
| WAVE | Payment Link | 1. Initiate collection 2. Redirect customer to payment link 3. Customer completes payment | No |
| AFRIMONEY | STK Push | 1. Initiate collection 2. STK Push sent to customer 3. Customer authorizes on device 4. Call /complete-payin | Yes |
| QMONEY | OTP Verification | 1. Initiate collection 2. OTP sent to customer 3. Collect OTP from customer 4. Call /complete-payin with OTP | Yes |
Webhooks
Payment Status Webhook
The API sends POST requests to your webhookUrl when payment status changes.
Sample Webhook
{
"transaction_reference": "176414160871313",
"transaction_status": "Funds Received",
"transaction_fee": 0,
"amount_received": 10,
"initiated_date": "2025-11-26 08:20:08",
"current_status_date": "2025-11-26 08:29:21",
"received_from": {},
"merchant_reference": "QATXN64936072",
"status": "COMPLETED",
"channel": "MOBILE_MONEY",
"currency_code": "GMD"
}
Webhook Status Values
| Status | Description |
|---|---|
| COMPLETED | Payment successfully received |
| FAILED | Payment failed or expired |
Webhook Implementation
Your webhook endpoint must:
- Accept POST requests: Listen for incoming webhook notifications
- Validate payload: Verify merchant_reference matches your records
- Return 200 OK
- Process asynchronously: Handle business logic after responding
- Handle duplicates: Implement idempotency using transaction_reference
Webhook Security
- Verify requests originate from 54Pay IP addresses
- Validate the merchant_reference exists in your system
- Store webhook payloads for audit trail