Mobile Money Transfers
Learn how to make mobile money transfers.
Flutterwave allows customers to transfer funds directly from their Flutterwave balance to a mobile money wallet. This feature enables merchants to seamlessly process payouts into wallets linked to recipients' mobile numbers.
Prerequisites
Before initiating a mobile money transfer:
- Whitelist your IP addresses
- Ensure your balance has sufficient funds. You can fund your balance by one of the following methods:
- Directly funding via collections.
- Indirect funding by converting funds from a different currency balance (i.e., wallet-to-wallet transfers).
Payout Flow
Each successful mobile money transfer follows a two-step process:
- Initiate Payout
- Verify Payout
Initiate Payout
Integration Method
This guide follows the direct transfer flow for demonstration. Please refer to the general transfer flow for the alternative integration method.
To initiate a mobile money transfer, send a request to the create transfer endpoint with the following required parameters:
action
: Specifies how the transfer should be processed. Accepted values areinstant
,deferred
, orscheduled
.type
: Specifies the type of transfer. Use"mobile_money"
for mobile money transfers.payment_instruction
: An object containing details of the payment, including:amount
currency
(source_currency
anddestination_currency
)- Recipient details, such as the phone number linked to the mobile money wallet and the associated mobile money network.
Sample Requests
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"MTN",
"msisdn":"2339012345678"
}
},
"destination_currency":"GHS"
},
"type":"mobile_money",
"narration":"GHS MOMO TRANSFER EXAMPLE",
"reference":"REF-00107099IEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"Mpesa",
"msisdn":"2549012345678"
}
},
"destination_currency":"KES"
},
"type":"mobile_money",
"narration":"KES MOMO TRANSFER EXAMPLE",
"reference":"REF-001GVSDVDSU2Y"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John ",
"last":"Doe"
},
"mobile_money":{
"msisdn":"2559012345678",
"network":"airtel"
}
},
"destination_currency":"TZS"
},
"type":"mobile_money",
"narration":"TZS MOMO TRANSFER EXAMPLE",
"reference":"REF-001JEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"orangemoney",
"country":"CM",
"msisdn":"23709929220"
}
},
"destination_currency":"XAF"
},
"type":"mobile_money",
"narration":"XAF MOMO TRANSFER EXAMPLE",
"reference":"REF-00100IEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"wave",
"country":"CI",
"msisdn":"22509929220"
}
},
"destination_currency":"XOF"
},
"type":"mobile_money",
"narration":"XOF MOMO TRANSFER EXAMPLE",
"reference":"REF-0010099IEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"EMONEY",
"country":"SN",
"msisdn":"22109929220"
}
},
"destination_currency":"XOF"
},
"type":"mobile_money",
"narration":"XOF MOMO TRANSFER EXAMPLE",
"reference":"REF-00108099IEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"MPS",
"msisdn":"2509012345678"
}
},
"destination_currency":"RWF"
},
"type":"mobile_money",
"narration":"RWF MOMO TRANSFER EXAMPLE",
"reference":"REF-00147099IEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"AIRTELMW",
"msisdn":"2659012345678"
}
},
"destination_currency":"MWK"
},
"type":"mobile_money",
"narration":"MWK MOMO TRANSFER EXAMPLE",
"reference":"REF-001JYDWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"ETBAMOLE",
"msisdn":"2519012345678"
}
},
"destination_currency":"ETB"
},
"type":"mobile_money",
"narration":"ETB MOMO TRANSFER EXAMPLE",
"reference":"REF-001JYDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"MPS",
"msisdn":"2569012345678"
}
},
"destination_currency":"UGX"
},
"type":"mobile_money",
"narration":"UGX MOMO TRANSFER EXAMPLE",
"reference":"REF-001OEDeWDSUYB"
}'
curl --request POST \
--url 'https://api.flutterwave.cloud/developersandbox/direct-transfers' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
--data '{
"action":"instant",
"payment_instruction":{
"source_currency":"NGN",
"amount":{
"applies_to":"destination_currency",
"value":1000
},
"recipient":{
"name":{
"first":"John",
"last":"Doe"
},
"mobile_money":{
"network":"MPS",
"msisdn":"2609012345678"
}
},
"destination_currency":"ZMW"
},
"type":"mobile_money",
"narration":"ZMW MOMO TRANSFER EXAMPLE",
"reference":"REF-001O9EDeWDSUYB"
}'
Handling Mobile Number
The
msisdn
field must contain the recipient’s mobile number starting with the country code.
- For example, a
GHS
mobile money transfer should begin with233
.- For
XAF
andXOF
transfers, include the country field explicitly in the request.
You can initiate scheduled or deferred mobile money transfers by setting the action
field to scheduled
or deferred
.
For scheduled transfers, include the disburse_option
object in the request. This object defines when the transfer should be executed and must contain:
date_time
: The exact date and time to trigger the transfer.timezone
: The timezone for the scheduled time.
Refer to the transfer overview for a complete walkthrough on creating and managing these transfer types.
Handling International Transfers
To manage cross-currency payouts, refer to the managing currency section.
Handling the Response
When you successfully initiate a mobile money transfer, the API returns a response similar to the following:
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_5JnyBhdTdj42zA",
"type":"mobile_money",
"action":"instant",
"reference":"REF-00107099IEDeWDSUYB",
"status":"NEW",
"narration":"GHS MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"GHS",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_R8XvW9gXRP",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"GHS",
"mobile_money":{
"network":"MTN",
"msisdn":"2339012345678"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:10:38.039Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_MNk7e9ups3VgZh",
"type":"mobile_money",
"action":"instant",
"reference":"REF-001GVSDVDSU2Y",
"status":"NEW",
"narration":"KES MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"KES",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_VgJamvD4fE",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"KES",
"mobile_money":{
"network":"Mpesa",
"msisdn":"2549012345678"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:21:47.932Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_O13h3LmPak5LBk",
"type":"mobile_money",
"action":"instant",
"reference":"REF-001JEDeWDSUYB",
"status":"NEW",
"narration":"TZS MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"TZS",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_MQzTgQgkQe",
"name":{
"first":"John ",
"last":"Doe"
},
"currency":"TZS",
"mobile_money":{
"network":"airtel",
"msisdn":"2559012345678"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:31:11.232Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_fTdRGZIG7OGe20",
"type":"mobile_money",
"action":"instant",
"reference":"REF-00100IEDeWDSUYB",
"status":"NEW",
"narration":"XAF MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"XAF",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_8z3I4ICHIL",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"XAF",
"mobile_money":{
"network":"orangemoney",
"country":"CM",
"msisdn":"23709929220"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:35:12.797Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_EJ2vQnQvFzeBFK",
"type":"mobile_money",
"action":"instant",
"reference":"REF-0010099IEDeWDSUYB",
"status":"NEW",
"narration":"XOF MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"XOF",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_c1ZhDIPcm7",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"XOF",
"mobile_money":{
"network":"wave",
"country":"CI",
"msisdn":"22509929220"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:39:23.780Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_p5kyu7ZCrgQpgI",
"type":"mobile_money",
"action":"instant",
"reference":"REF-00108099IEDeWDSUYB",
"status":"NEW",
"narration":"XOF MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"XOF",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_ckorR5bbk0",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"XOF",
"mobile_money":{
"network":"EMONEY",
"country":"SN",
"msisdn":"22109929220"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:43:40.755Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_pZwUKMs9usU5QD",
"type":"mobile_money",
"action":"instant",
"reference":"REF-00147099IEDeWDSUYB",
"status":"NEW",
"narration":"RWF MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"RWF",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"RWF",
"mobile_money":{
"network":"MPS",
"msisdn":"2509012345678"
},
"id":"rcm_q1boxqkoC3"
},
"meta":{
},
"created_datetime":"2024-12-13T05:13:14.569373217Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_ESaFaZjxqnNmm2",
"type":"mobile_money",
"action":"instant",
"reference":"REF-001JYDWDSUYB",
"status":"NEW",
"narration":"MWK MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"MWK",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_YfQrGYgC5B",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"MWK",
"mobile_money":{
"network":"AIRTELMW",
"msisdn":"2659012345678"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:49:04.563Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_ktnCglatt92k8n",
"type":"mobile_money",
"action":"instant",
"reference":"REF-001JYDeWDSUYB",
"status":"NEW",
"narration":"ETB MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"ETB",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_uodrObhEa5",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"ETB",
"mobile_money":{
"network":"ETBAMOLE",
"msisdn":"2519012345678"
}
},
"meta":{},
"created_datetime":"2025-06-04T18:51:36.235Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_V5zoB57shPwgac",
"type":"mobile_money",
"action":"instant",
"reference":"REF-001OEDeWDSUYB",
"status":"NEW",
"narration":"UGX MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"UGX",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_yJBzZTFEnj",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"UGX",
"mobile_money":{
"network":"MPS",
"msisdn":"2569012345678"
}
},
"meta":{
},
"created_datetime":"2024-12-12T12:59:15.403332030Z"
}
}
{
"status":"success",
"message":"Transfer created",
"data":{
"id":"trf_ejDNIQngjLzUTx",
"type":"mobile_money",
"action":"instant",
"reference":"REF-001O9EDeWDSUYB",
"status":"NEW",
"narration":"ZMW MOMO TRANSFER EXAMPLE",
"source_currency":"NGN",
"destination_currency":"ZMW",
"amount":{
"value":1000,
"applies_to":"destination_currency"
},
"recipient":{
"type":"mobile_money",
"id":"rcm_1aaTfsip3I",
"name":{
"first":"John",
"last":"Doe"
},
"currency":"ZMW",
"mobile_money":{
"network":"MPS",
"msisdn":"2609012345678"
}
},
"meta":{
},
"created_datetime":"2024-12-12T13:02:53.774008555Z"
}
}
Thedata.status
field in the response will always return NEW
upon initiating a transfer. This indicates that the transfer has been successfully initiated, but not yet completed. To determine the final status, you must verify the payout.
Verify Payout
There are three ways to verify the final status of a mobile money transfer:
Webhooks (Recommended):
Enable webhooks on your Flutterwave dashboard to receive automatic transfer status updates.
When the transfer completes (or fails), Flutterwave will send a POST request to your configured webhook URL with the transfer details.
{
"webhook_id":"wbk_emXAIzd4Dd7495SG3NOX",
"timestamp":1749071772784,
"type":"transfer.disburse",
"data":{
"id":"trf_Fj62qmZOhSneRu",
"type":"MOBILE_MONEY",
"source_currency":"NGN",
"destination_currency":"KES",
"amount":1000,
"reference":"REF-001GVSDVDSU2Yhgu",
"status":"SUCCESSFUL",
"mobile_money":{
"network":"Mpesa",
"country":null,
"msisdn":"2549012345678"
},
"fee":{
"currency":"KES",
"value":10
},
"debit_information":{
"currency":"KES",
"actual_debit_amount":1000,
"rate_used":0.00123,
"vat":75
},
"payment_information":{
"proof":"815423162782592573350591343763"
},
"meta":{}
}
}
Callback
If you included a callback_url
in your transfer request, Flutterwave will send a POST request to that URL once the transfer completes or fails.
This behaves similarly to webhooks but is specific to each transfer.
Query Payout Status
To manually check the status of a transfer:
- Use the
id
value from thedata.id
field in the transfer initiation response. - Send a
GET
request to the retrieve a transfer endpoint, passing the id as a path parameter.
This is useful for polling or verifying status in systems where webhooks or callbacks are not used.
curl --request GET \
--url 'https://api.flutterwave.cloud/developersandbox/transfers/id' \
--header 'Authorization: Bearer {{YOUR_ACCESS_TOKEN}}' \
--header 'Content-Type: application/json' \
--header 'X-Trace-Id: {{YOUR_UNIQUE_TRACE_ID}}' \
--header 'X-Idempotency-Key: {{YOUR_UNIQUE_INDEMPOTENCY_KEY}}' \
You'll get a response like this:
{
"status": "success",
"message": "Transfer fetched",
"data": {
"id": "trf_Hu3QERCeuWk8",
"type": "mobile_money",
"reference": "4dc065cc-08a3-4158-9f9b-e4e2f79120e7",
"status": "NEW",
"narration": "Testing transfers",
"source_currency": "NGN",
"destination_currency": "RWF",
"amount": {
"value": 1000,
"applies_to": "source_currency"
},
"callback_url": "https://www.flutterwave.com",
"recipient": {
"type": "mobile_money",
"name": {
"first": "Jane",
"middle": "The",
"last": "Janet"
},
"mobile_money": {
"network": "MPS",
"msisdn": "9012345678"
}
},
"meta": {},
"created_datetime": "2024-11-21T08:52:37.845Z"
}
}
{
"status":"failed",
"error":{
"type":"TRANSFER_NOT_FOUND",
"code":"301404",
"message":"Transfer not found",
"validation_errors":[
]
}
}
Testing Mobile Money Transfers
Check out the testing section to learn how to simulate various transfer scenarios.
Updated about 3 hours ago