Mobile money transfers

You can transfer money directly from your available balance to a mobile money account.

Hey👋. We recommend checking out Transfers: Overview to understand the basics of transfers first. This guide assumes you've read that.

Mobile money transfers work the same as regular bank account transfers. The key difference is that the account_number is the mobile number on the account (including the country code, like "233"), while the account_bank is a code representing the mobile money operator (for example, "MPS" for M-Pesa). A beneficiary_name is also required, so we can identify this account in your list of beneficiaries.

Mobile Money Kenya (M-Pesa) requires you to include the senders fullname as sender sender's country as sender_country and the senders mobile number as mobile_number in the meta object. See Initiate a Transfer for specification

Supported mobile money operators

Here's a list of the current supported countries/currencies and options for mobile money:

Countries/currenciesMobile money options
Rwanda (RWF)
Tanzania (TZS)
Uganda (UGX)
Zambia (ZMW)
MPS
Kenya (KES)
  • M-Pesa (MPS)
  • Airtel Kenya (MPX)
Ghana (GHS)
  • MTN
  • TIGO
  • VODAFONE
  • AIRTEL
    Cameroon (XAF)
    Cote d'Ivoire (XOF)
    FMM

    Here's an example of a mobile money transfer:

    const details = {
      account_bank: "MPS",
      account_number: "2540782773934",
      amount: 1200,
      currency: "KES",
      beneficiary_name: "Akinyi Kimwei",
      meta: {
        "sender": "Flutterwave Developers",
        "sender_country": "ZA",
        "mobile_number": "23457558595"
      }
    };
    await flw.Transfer.initiate(details)
    
    $details = array(
      "account_bank" => "MPS",
      "account_number" => "2540782773934",
      "amount" => 1200,
      "currency" => "KES",
      "beneficiary_name" => "Akinyi Kimwei",
      "meta" => array(
        "sender": "Flutterwave Developers",
        "sender_country": "ZA",
        "mobile_number": "23457558595"
      )
    );
    $response = $transferService->singleTransfer($details);
    
    details = {
      account_bank: "MPS",
      account_number: "2540782773934",
      amount: 1200,
      currency: "KES",
      beneficiary_name: "Akinyi Kimwei",
      meta: {
        "sender": "Flutterwave Developers",
        "sender_country": "ZA",
        "mobile_number": "23457558595"
      }
    }
    response = transfer.initiate_transfer details
    
    details = {
      "account_bank": "MPS",
      "account_number": "2540782773934",
      "amount": 1200,
      "currency": "KES",
      "beneficiary_name": "Akinyi Kimwei",
      "meta": {
        "sender": "Flutterwave Developers",
        "sender_country": "ZA",
        "mobile_number": "23457558595"
      }
    }
    res = rave.Transfer.initate(details)
    
    details := rave.SinglePaymentData {
        AccountBank:     "flutterwave",
        AccountNumber:   "00118468",
        Amount:          500,
        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 '{
        account_bank: "MPS",
        account_number: "2540782773934",
        amount: 1200,
        currency: "KES",
        beneficiary_name: "Akinyi Kimwei",
        meta: {
          "sender": "Flutterwave Developers",
          "sender_country": "ZA",
          "mobile_number": "23457558595"
        }
    }'
    

    Here's an example response:

    {
      "status": "success",
      "message": "Transfer Queued Successfully",
      "data": {
        "id": 127886,
        "account_number": "2540782773934",
        "bank_code": "MPS",
        "full_name": "Akinyi Kimwei",
        "created_at": "2020-06-25T14:03:51.000Z",
        "currency": "KES",
        "amount": 50,
        "fee": 45,
        "status": "NEW",
        "reference": "mk-902837-jk",
        "meta": null,
        "narration": "",
        "complete_message": "",
        "requires_approval": 0,
        "is_approved": 1,
        "bank_name": "FA-BANK"
      }
    }
    
    Supported mobile number formats

    We support different mobile number formats. For KES, mobile numbers are expected to take the following forms:

    • 254700000000
    • 0700000000

    As always, you'll notice that the data.status of the transfer is "NEW". Remember to set up a webhook or call the get transfer endpoint to find out when the transfer is completed. See Transfers: Overview for details.

    Bulk transfers

    You can also transfer to multiple mobile money accounts at once. See the bulk transfers guide for details.

    Loading...