South Africa
Transfer funds to South African bank accounts.
Send ZAR directly to bank accounts in South Africa. This guide walks you through the steps required to initiate and verify a transfer.
Prerequisites
- Complete KYC and ensure your account is approved for transactions.
- Whitelist your server IP addresses. See this guide for more information.
- Enable Transfers via API. See this guide for more information.
- Ensure you have sufficient funds in the ZAR wallet. For cross-currency transfers, the transfer amount is debited from the
debit_currencywallet, while the transfer fee is debited from the ZAR wallet. See the supported currencies and transfer fees page for more information.
Payout Flow
Follow these steps to send money to a bank account in South Africa.
- Collect the beneficiary details
Gather the beneficiary's name, bank, and account number.
See the table below for the required and optional parameters.
| Parameter | Description | Format | Example | Is required |
|---|---|---|---|---|
account_bank | The beneficiary's bank code. Use the Get Banks endpoint to retrieve the bank code. | String | "Nedbank" | Yes |
account_number | The beneficiary's account number. | String | "1080621210" | Yes |
beneficiary_name | The beneficiary's full name. | String | "Thabo Dlamini" | Yes |
amount | The amount to send. | Integer | 1000 | Yes |
currency | The transfer currency. Must be ZAR. | String | "ZAR" | Yes |
debit_currency | The wallet currency to debit for the transfer. | String | "XAF" | No |
narration | A description for the transfer. | String | "South Africa Withdrawal" | No |
reference | Unique reference to identify the transfer. | String | "Your-Unique-Reference" | No |
meta[0].first_name | The beneficiary’s first name. If passed, must match the first name value provided for the beneficiary_name. | String | "Thabo" | No |
meta[0].last_name | The beneficiary’s last name. If passed, must match the last name value provided for the beneficiary_name. | String | "Dlamini" | No |
meta[0].email | The beneficiary’s email address. | String | “[email protected]” | Yes |
meta[0].recipient_address | The beneficiary’s address. | String | "Cape Town South Africa" | Yes |
meta[0].mobile_number | The beneficiary’s mobile number. | String | "+27830000000" | Yes |
- Initiate the transfer
Send aPOSTrequest to the transfer endpoint with the beneficiary and transfer details.
curl --request POST \
--url https://api.flutterwave.com/v3/transfers \
--header 'Authorization: Bearer {{YOUR_SECRET_KEY}}' \
--header 'Content-Type: application/json' \
--data '{
"amount": 1000,
"account_bank": "Nedbank",
"account_number": "1080621210",
"currency": "ZAR",
"debit_currency": "XAF",
"beneficiary_name":"Nelson Nelson",
"narration": "South Africa withdrawal",
"reference": "STk_kfndl_PMCKDU_1",
"meta":[
{
"first_name": "Nelson",
"last_name": "Nelson",
"email": "[email protected]",
"mobile_number": "+27830000000",
"recipient_address": "Johannesburg South Africa"
}
]
}'
{
"status": "success",
"message": "Transfer Queued Successfully",
"data": {
"id": 2242314,
"account_number": "1080621210",
"bank_code": "Nedbank",
"full_name": "Nelson Nelson",
"created_at": "2026-09-22T13:22:14.000Z",
"currency": "ZAR",
"debit_currency": "XAF",
"amount": 1000,
"fee": 45,
"status": "NEW",
"reference": "STk_kfndl_PMCKDU_1",
"meta": [
{
"FirstName": "Nelson",
"LastName": "Nelson",
"EmailAddress": "[email protected]",
"MobileNumber": "+27830000000",
"Address": "Johannesburg South Africa",
"MerchantName": "Dotuns Fashion Limited",
"SenderCountry": "ZA",
"SenderAddress": "138 West Street, Sandown, Sandton, JHB",
"AccountNumber": "1080621210",
"RoutingNumber": "Nedbank",
"Sender": "Dotuns Fashion Limited"
}
],
"narration": "South Africa withdrawal",
"complete_message": "",
"requires_approval": 0,
"is_approved": 1,
"bank_name": "Nedbank Limited"
}
}
- Verify the transfer status
There are two ways to verify the transfer status:
- Call the transfer status endpoint using the transfer ID (
data.id) returned in the transfer response.
curl --request GET \
--location 'https://api.flutterwave.com/v3/transfers/2242314' \
--header 'Authorization: Bearer {{YOUR_SECRET_KEY}}'
{
"status": "success",
"message": "Transfer fetched",
"data": {
"id": 2242314,
"account_number": "1080621210",
"bank_code": "Nedbank",
"full_name": "Nelson Nelson",
"created_at": "2026-09-22T13:22:14.000Z",
"currency": "ZAR",
"debit_currency": "XAF",
"amount": 1000,
"fee": 45,
"status": "SUCCESSFUL",
"reference": "STk_kfndl_PMCKDU_1",
"meta": [
{
"first_name": "Nelson",
"last_name": "Nelson",
"email": "[email protected]",
"mobile_number": "+27830000000",
"account_number": "1080621210",
"routing_number": "Nedbank",
"sender": "Dotuns Fashion Limited"
}
],
"narration": "South Africa withdrawal",
"approver": null,
"complete_message": "Successful",
"requires_approval": 0,
"is_approved": 1,
"bank_name": "Nedbank Limited"
}
}
- Listen for webhooks. Configure your webhook URL on the Flutterwave Dashboard to receive real-time transfer updates. See the webhooks guide for more information.
{
"event": "transfer.completed",
"event.type": "Transfer",
"data": {
"id": 2242314,
"account_number": "1080621210",
"bank_name": "Nedbank Limited",
"bank_code": "Nedbank",
"fullname": "Nelson Nelson",
"created_at": "2026-09-22T13:22:14.000Z",
"currency": "ZAR",
"debit_currency": "XAF",
"amount": 1000,
"fee": 45,
"status": "SUCCESSFUL",
"reference": "STk_kfndl_PMCKDU_1",
"meta": [
{
"first_name": "Nelson",
"last_name": "Nelson",
"email": "[email protected]",
"mobile_number": "+27830000000",
"sender": "Dotuns Fashion Limited"
}
],
"narration": "South Africa withdrawal",
"approver": null,
"complete_message": "Successful",
"requires_approval": 0,
"is_approved": 1
}
}
Testing Transfers
Check the testing guide for mocking transfers in the test environment.
Updated 10 days ago
Did this page help you?
