Mobile Money Transfer

Learn how to transfer money directly from your available balance to a mobile money account.

📘

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 the beneficiary_name.

Supported Networks

Here's a list of the currently supported countries and available networks:

Countries/CurrenciesCountry CodeMobile Money options
Cote d'Ivoire (XOF)CIFMM, Moov, orangemoney, WAVE
Ghana (GHS)GHAIRTELTIGO, MTN, TELECEL, VODAFONE
Kenya (KES)KESAFARICOM, T-Kash, Airtel, MPS
Rwanda (RWF)RWMPS, MTN
Senegal (XOF)SNfreemoney, orangemoney, WAVE
Uganda (UGX)UGAirtel, MPS, MTN
Egypt (EGP)EGEGPWALLETS

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.


Did this page help you?