Skip to main content

Payout (Mobile Money) API

This endpoint allows you to initiate payouts to recipients via mobile money. This is useful for disbursements, refunds, vendor payments, and marketplace seller settlements.

Endpoint

POST /payments/payout/mobile-money

Headers

NameDescription
X-API-KeyYour Zikopay API Key
X-API-SecretYour Zikopay API Secret
AcceptMust be application/json
Content-TypeMust be application/json

Request Parameters

ParameterTypeRequiredDescription
amountnumberYesPayout amount in the specified currency
currencystringYesCurrency code (e.g., XAF, XOF)
phoneNumberstringYesRecipient's mobile money phone number with country code
operatorstringYesMobile money operator (e.g., orange_cm, mtn_cm)
return_urlstringYesURL for status redirection
cancel_urlstringYesURL for cancellation redirection
callback_urlstringYesURL where payout status updates will be sent
descriptionstringYesPayout description or reason
payout_detailsobjectNoAdditional payout metadata
customerobjectYesRecipient information
customer.namestringYesRecipient's full name
customer.phonestringYesRecipient's phone number
customer.emailstringYesRecipient's email address

Example Request

{
"amount": 100,
"currency": "XAF",
"operator": "orange_cm",
"phoneNumber": "237696447402",
"return_url": "https://yourwebsite.com/payout/success",
"cancel_url": "https://yourwebsite.com/payout/cancel",
"callback_url": "https://yourwebsite.com/api/webhook",
"description": "Vendor payment for April services",
"payout_details": {
"invoice_id": "INV-2025-042",
"service": "Website development"
},
"customer": {
"name": "John Doe",
"phone": "696447002",
"email": "john.doe@example.com"
}
}

Success Response

{

"reference": "TXN174506674372585E",
"amount": 100,
"currency": "XAF",
"status": "pending",
"operator": "orange_cm",
"message": "Payout initiated."

}
}

Error Response

{
"success": false,
"message": "Failed to initiate payout",
"errors": {
"amount": ["Insufficient wallet balance for this payout"],
"phoneNumber": ["Invalid phone number format for the selected operator"]
}
}

Response Parameters

ParameterTypeDescription
referencestringUnique transaction reference ID
amountnumberPayout amount
currencystringPayout currency
statusstringCurrent payout status: pending, processing, completed, failed
operatorstringMobile money operator used
phoneNumberstringRecipient's mobile money number
feenumberFee charged for the payout
estimated_deliverystringEstimated delivery time for the funds

Transaction Flow

  1. Your application initiates a payout request
  2. Zikopay verifies your wallet has sufficient balance
  3. The payout is queued for processing
  4. Zikopay initiates the transfer to the recipient's mobile money account
  5. Upon completion or failure, Zikopay sends a webhook to your callback_url
  6. The status of the payout is updated in your merchant dashboard

Supported Mobile Money Operators

OperatorCodePayment TypeCountriesCurrencies
MTN Cameroonmtn_cmMTN Mobile MoneyCameroonXAF
Orange Cameroonorange_cmOrange MoneyCameroonXAF
MTN Côte d'Ivoiremtn_ciMTN MoMoCôte d'IvoireXOF
Orange Côte d'Ivoireorange_ciOrange MoneyCôte d'IvoireXOF
Moov Côte d'Ivoiremoov_ciMoov MoneyCôte d'IvoireXOF
Wave Côte d'Ivoirewave_ciWave Mobile MoneyCôte d'IvoireXOF
Orange Senegalorange_snOrange MoneySenegalXOF
Free Money Senegalfree_money_snFree MoneySenegalXOF
Expresso Senegalexpresso_snExpresso MoneySenegalXOF
MTN Beninmtn_bjMTN Mobile MoneyBeninXOF
Moov Beninmoov_bjMoov MoneyBeninXOF
T Money Togot_money_tgT MoneyTogoXOF

Testing

In the test environment, you can simulate different payout outcomes:

Phone NumberResult
237600000001Successful payout
237600000002Failed payout (recipient not found)
237600000003Delayed payout (will succeed after 30 minutes)
237600000004Cancelled payout

Notes

  • Payouts require sufficient balance in your merchant wallet
  • Processing times vary by operator (typically 5 minutes to 24 hours)
  • Maximum payout limits apply and vary by country and operator
  • Name verification may be performed by some operators
  • Payout fees are deducted from your wallet balance, not the payout amount

Code Examples

PHP

<?php
$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.payment.zikopay.com/v1/payments/payout/mobile-money",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'amount' => 100,
'currency' => 'XAF',
'phoneNumber' => '237696447402',
'operator' => 'orange_cm',
'return_url' => 'https://yourwebsite.com/payout/success',
'cancel_url' => 'https://yourwebsite.com/payout/cancel',
'callback_url' => 'https://yourwebsite.com/api/webhook',
'description' => 'Vendor payment for April services',
'payout_details' => [
'invoice_id' => 'INV-2025-042'
],
'customer' => [
'name' => 'John Doe',
'phone' => '696447002',
'email' => 'john.doe@example.com'
]
]),
CURLOPT_HTTPHEADER => [
"Accept: application/json",
"Content-Type: application/json",
"X-API-Key: your_api_key",
"X-API-Secret: your_api_secret"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
$data = json_decode($response, true);
if ($data['success']) {
echo "Payout initiated. Reference: " . $data['data']['reference'];
echo "Estimated delivery: " . $data['data']['estimated_delivery'];
} else {
echo "Error: " . $data['message'];
}
}
?>

JavaScript

const initiatePayout = async () => {
try {
const response = await fetch('https://api.payment.zikopay.com/v1/payments/payout/mobile-money', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-API-Key': 'your_api_key',
'X-API-Secret': 'your_api_secret'
},
body: JSON.stringify({
amount: 100,
currency: 'XAF',
phoneNumber: '237696447402',
operator: 'orange_cm',
return_url: 'https://yourwebsite.com/payout/success',
cancel_url: 'https://yourwebsite.com/payout/cancel',
callback_url: 'https://yourwebsite.com/api/webhook',
description: 'Vendor payment for April services',
payout_details: {
invoice_id: 'INV-2025-042'
},
customer: {
name: 'John Doe',
phone: '696447002',
email: 'john.doe@example.com'
}
})
});

const data = await response.json();

if (data.success) {
console.log(`Payout initiated with reference: ${data.data.reference}`);
console.log(`Estimated delivery: ${data.data.estimated_delivery}`);
} else {
console.error('Payout initiation failed:', data.message);
}
} catch (error) {
console.error('Error:', error);
}
};

Python

import requests
import json

url = "https://api.payment.zikopay.com/v1/payments/payout/mobile-money"

payload = json.dumps({
"amount": 100,
"currency": "XAF",
"phoneNumber": "237696447402",
"operator": "orange_cm",
"return_url": "https://yourwebsite.com/payout/success",
"cancel_url": "https://yourwebsite.com/payout/cancel",
"callback_url": "https://yourwebsite.com/api/webhook",
"description": "Vendor payment for April services",
"payout_details": {
"invoice_id": "INV-2025-042"
},
"customer": {
"name": "John Doe",
"phone": "696447002",
"email": "john.doe@example.com"
}
})

headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-API-Key': 'your_api_key',
'X-API-Secret': 'your_api_secret'
}

response = requests.post(url, headers=headers, data=payload)

if response.status_code == 200:
data = response.json()
if data['success']:
print(f"Payout initiated. Reference: {data['data']['reference']}")
print(f"Estimated delivery: {data['data']['estimated_delivery']}")
else:
print(f"Error: {data['message']}")
else:
print(f"HTTP Error: {response.status_code}")

Regional Considerations

  • Service availability: Different operators have varying service availability and processing times
  • Verification requirements: Some operators require more stringent recipient verification
  • Transaction limits: Daily and monthly transaction limits vary by country and operator
  • Bulk payouts: For multiple payouts, consider using our bulk payout API (separate documentation)