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.


Did this page help you?