Skip to main content

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

OperatorCodePayment Flow
WAVEGMWAVPayment link redirect
AFRIMONEYGMAFRSTK Push + API completion
QMONEYGMQMOOTP 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

    gambia - paymentLink
  • 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

    gambia - stkPush
  • 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

    gambia - otp

Supported Integration Type

The API supports direct server-to-server communication via the requestType parameter:

TypeRequest TypeDescription
Host-to-Host (H2H)BDirect server-to-server communication

Authentication

All API requests require authentication using your merchant credentials.

Headers

HeaderTypeDescription
X-modulestringBase64(amount+transactionReference+customerNumber)
X-businessstringBase64-encoded Merchant Public Key: {Base64(Merchant Public Key)}
Content-TypestringMust be application/json
x-appstringMust 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

OperatorMethodStepsAdditional API Call
WAVEPayment Link1. Initiate collection
2. Redirect customer to payment link
3. Customer completes payment
No
AFRIMONEYSTK Push1. Initiate collection
2. STK Push sent to customer
3. Customer authorizes on device
4. Call /complete-payin
Yes
QMONEYOTP Verification1. 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

StatusDescription
COMPLETEDPayment successfully received
FAILEDPayment failed or expired

Webhook Implementation

Your webhook endpoint must:

  1. Accept POST requests: Listen for incoming webhook notifications
  2. Validate payload: Verify merchant_reference matches your records
  3. Return 200 OK
  4. Process asynchronously: Handle business logic after responding
  5. 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