Test page
description
Getting Started
>
We recommend checking out the introductory section to understand the basics of making transfers first.
Mobile money transfers work similarly to bank account transfers. The key difference is that account_number contains the recipient's mobile number, including the country code (for example, 233), while account_bank identifies the mobile money operator (for example, MPS for M-Pesa). You must also provide beneficiary_name.
Supported Networks
Here's a list of the currently supported countries and available networks for mobile money:
| Countries/Currencies | Country Code | Mobile Money options |
| -------------------- | ------------ | ----------------------------------------------------------------- |
| Cameroon (XAF) | CM | BICEC, CBC, CCA, LAREGIONALE, ORANGEMONEY, UBC, YUP |
| Cote d'Ivoire (XOF) | CI | FMM, Moov, orangemoney, WAVE |
| Ghana (GHS) | GH | AIRTELTIGO, MTN, TELECEL, VODAFONE |
| Kenya (KES) | KE | SAFARICOM, T-Kash, Airtel, MPS |
| Rwanda (RWF) | RW | MPS, MTN |
| Senegal (XOF) | SN | freemoney, orangemoney, WAVE |
| Uganda (UGX) | UG | Airtel, MPS, MTN |
| Zambia (ZMW) | ZM | Airtel, MPS, MTN, ZAMTE |
| Egypt | EG | EGPWALLETS |
The following examples show how to initiate a mobile money transfer.
const details = {
account_bank: "MPS",
account_number: "2540782773934",
amount: 1200,
currency: "KES",
beneficiary_name: "Akinyi Kimwei"
};
await flw.Transfer.initiate(details)
$details = array(
"account_bank" => "MPS",
"account_number" => "2540782773934",
"amount" => 1200,
"currency" => "KES",
"beneficiary_name" => "Akinyi Kimwei"
);
$response = $transferService->singleTransfer($details);
details = {
account_bank: "MPS",
account_number: "2540782773934",
amount: 1200,
currency: "KES",
beneficiary_name: "Akinyi Kimwei"
}
response = transfer.initiate_transfer details
details = {
"account_bank": "MPS",
"account_number": "2540782773934",
"amount": 1200,
"currency": "KES",
"beneficiary_name": "Akinyi Kimwei"
}
res = rave.Transfer.initate(details)
details := rave.SinglePaymentData {
AccountBank: "MPS",
AccountNumber: "254724003076",
Amount: 1200,
Currency: "KES",
BeneficiaryName: "Akinyi Kimwei"
}
err, response := transfer.InitiateSingleTransfer(details)
curl --request POST 'https://api.flutterwave.com/v3/transfers' \
--header 'Authorization: Bearer YOUR_SECRET_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 1000,
"account_bank": "MPS",
"account_number": "254724003076",
"currency": "KES",
"beneficiary_name": "Akinyi Kimwei"
}'
Here's an example of the response you'll get:
{
"status": "success",
"message": "Transfer Queued Successfully",
"data": {
"id": 2247055,
"account_number": "254724003076",
"bank_code": "MPS",
"full_name": "Akinyi Kimwei",
"created_at": "2026-10-19T21:51:48.000Z",
"currency": "KES",
"amount": 1000,
"fee": 45,
"status": "NEW",
"reference": "47f5707c21ec7aec",
"meta": [
{
"MobileNumber": "254724003076"
}
],
"narration": "From Dotuns Fashion Limited",
"complete_message": "",
"requires_approval": 0,
"is_approved": 1,
"bank_name": "FA-BANK"
}
}
You'll notice that the data.status for the transfer is "NEW". Set up webhooks or call the get transfer endpoint to know when the transfer is complete. See Transfers: Overview for more details.
Bulk Transfers
You can also transfer funds to multiple mobile money accounts in one request. See the bulk transfers guide for details.
Updated 4 days ago
