Bank account transfers

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

Making transfers

Bank account transfers follow the same basic format: make a POST request to our create transfer endpoint. However, depending on the currency the account is denominated in, you might need to specify some additional information.

Common details

Let's start with the required details for all account types. You'll need to provide these details:

  • account_bank and account_number: The destination's bank account details. The acccount_bank is the bank code (which you can get from the get banks endpoint).

    When in Test Mode, you can use any of our test account numbers as a destination account.

  • amount and currency: The amount and currency you wish to transfer.

As explained in Transfers: Overview, you can also specify narration,reference, debit_currency, and meta.

// Install with: npm i flutterwave-node-v3

const Flutterwave = require('flutterwave-node-v3');
const flw = new Flutterwave(process.env.FLW_PUBLIC_KEY, process.env.FLW_SECRET_KEY);
const details = {
    account_bank: "044",
    account_number: "0690000040",
    amount: 200,
    narration: "Payment for things",
    currency: "NGN",
    reference: generateTransactionReference(),
    callback_url: "https://webhook.site/b3e505b0-fe02-430e-a538-22bbbce8ce0d",
    debit_currency: "NGN"
};
flw.Transfer.initiate(details)
    .then(console.log)
    .catch(console.log);
// Install with: composer require flutterwavedev/flutterwave-v3

$flw = new \Flutterwave\Rave(getenv('FLW_SECRET_KEY')); // Set `PUBLIC_KEY` as an environment variable
$transferService = new \Flutterwave\Transfer();
$details = [
    "account_bank" => "044",
    "account_number" => "0690000040",
    "amount" => 200,
    "narration" => "Payment for things",
    "currency" => "NGN",
    "reference" => generateTransactionReference(),
    "callback_url" => "https://webhook.site/b3e505b0-fe02-430e-a538-22bbbce8ce0d",
    "debit_currency" => "NGN"
];
$response = $transferService->singleTransfer($details);
# Install with: gem install flutterwave_sdk

require 'flutterwave_sdk'

flw = Flutterwave.new(ENV["FLW_PUBLIC_KEY"], ENV["FLW_SECRET_KEY"], ENV["FLW_ENCRYPTION_KEY"])
transfer = Transfer.new(flw)
details = {
    account_bank: "044",
    account_number: "0690000040",
    amount: 200,
    narration: "Payment for things",
    currency: "NGN",
    reference: generate_transaction_reference,
    callback_url: "https://webhook.site/b3e505b0-fe02-430e-a538-22bbbce8ce0d",
    debit_currency: "NGN"
}
response = transfer.initiate_transfer details
print response
# Install with: pip install rave_python

import os
from rave_python import Rave

rave = Rave(os.getenv("FLW_PUBLIC_KEY"), os.getenv("FLW_SECRET_KEY"))
details = {
    "account_bank": "044",
    "account_number": "0690000040",
    "amount": 200,
    "narration": "Payment for things",
    "currency": "NGN",
    "reference": generate_transaction_reference(),
    "callback_url": "https://webhook.site/b3e505b0-fe02-430e-a538-22bbbce8ce0d",
    "debit_currency": "NGN"
}
res = rave.Transfer.initate(details)
print(res)
// Install with: go get github.com/Flutterwave/Rave-go/rave

import (
  "fmt"
  "os"
  "github.com/Flutterwave/Rave-go/rave"
)
var r = rave.Rave{
  false,
  os.Getenv("FLW_PUBLIC_KEY"),
  os.Getenv("FLW_SECRET_KEY"),
}
var transfer = rave.Transfer{
    r,
}
details := rave.SinglePaymentData {
    AccountBank:   "044",
    AccountNumber: "0690000044",
    Amount:        500,
    Narration:     "Payment for things",
    Currency:      "NGN",
    Reference:     GenerateTransactionReference(),
}
err, response := transfer.InitiateSingleTransfer(details)
if err != nil {
    panic(err)
}
fmt.Println(response)
curl --request POST 'https://api.flutterwave.com/v3/transfers' \
  --header 'Authorization: Bearer YOUR_SECRET_KEY' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "account_bank": "044",
    "account_number": "0690000040",
    "amount": 200,
    "narration": "Payment for things",
    "currency": "NGN",
    "reference": "jh678b3kol1Z",
    "callback_url": "https://webhook.site/b3e505b0-fe02-430e-a538-22bbbce8ce0d",
    "debit_currency": "NGN"
}'

For NGN accounts, this is all you need. For other accounts, Depending on the account's currency/location, you might also need to specify some extra fields:

Nigerian domiciliary accounts

For a Nigerian dormiciliary account, you'll need to specify the beneficiary's first_name, last_name,email, beneficiary_country, mobile_number, sender, and merchant_name within the meta field.

{
  "account_bank": "044",
  "account_number": "0690000040",
  "amount": 2000,
  "currency": "USD",
  "meta": [
    {
+     "first_name": "Mephee",
+     "last_name": "Kizito",
+     "email": "mephee@kizito.me",
+     "beneficiary_country": "NG",
+     "mobile_number": "+2348131133933",
+     "sender": "Statik Selektah",
+     "merchant_name": "Spotify"
    }
  ]
}

US accounts

For a US (dollar) account, you'll need to specify AccountNumber, RoutingNumber,SwiftCode, BankName, BeneficiaryName, BeneficiaryAddress, and BeneficiaryCountry within the meta field. You'll also need to supply a beneficiary_name that we'll use to identify the account in your saved beneficiaries.

{
  "amount": 500,
  "narration": "Test Int'l bank transfers",
  "currency": "USD",
+ "beneficiary_name": "Mark Cuban",
  "meta":
    {
+     "AccountNumber": "09182972BH",
+     "RoutingNumber": "0000000002993",
+     "SwiftCode": "ABJG190",
+     "BankName": "BANK OF AMERICA, N.A., SAN FRANCISCO, CA",
+     "BeneficiaryName": "Mark Cuban",
+     "BeneficiaryAddress": "San Francisco, 4 Newton",
+     "BeneficiaryCountry": "US"
    }
}

EUR and GBP accounts

For an EUR or GBP account, you'll need to specify AccountNumber, RoutingNumber,SwiftCode, BankName, BeneficiaryName, BeneficiaryCountry, and the beneficiary's address details (PostalCode, StreetNumber, StreetName, and City) within the meta field. You'll also need to supply a beneficiary_name that we'll use to identify the account in your saved beneficiaries.

{
  "amount": 500,
  "narration": "Test EU Int'l bank transfers",
  "currency": "EUR",
+ "beneficiary_name": "John Twain",
  "meta":
    {
+     "AccountNumber": "DA091983888373BGH",
+     "RoutingNumber": "BECFDE7HKKX",
+     "SwiftCode": "BECFDE7HKKX",
+     "BankName": "LLOYDS BANK",
+     "BeneficiaryName": "John Twain",
+     "BeneficiaryCountry": "DE",
+     "PostalCode": "80489",
+     "StreetNumber": "31",
+     "StreetName": "Handelsbank Elsenheimer Str.",
+     "City": "München"
    }
}

GHS, UGX, ZMW and TZS accounts

For bank accounts in Ghana, Uganda, Zambia or Tanzania, you'll need to provide the destination_branch_code. A list of bank branch codes can be gotten from the get bank branches endpoint. You'll also need to supply a beneficiary_name that we'll use to identify the account in your saved beneficiaries.

{
    "account_bank": "GH280100",
    "account_number": "0031625807099",
    "amount": 500,
    "narration": "Test GHS bank transfers",
    "currency": "GHS",
+   "destination_branch_code": "GH280103",
+   "beneficiary_name": "Kwame Adew"
}

KES accounts

For KES accounts, you'll need to specify the sender's full name as sender, sender_country and mobile_number in the meta field.

{
    "account_bank": "68",
    "account_number": "0031625807099",
    "amount": 500,
    "narration": "Withdraw Fiat",
    "currency": "KES",
    "meta": 
        {
+           "sender": "James Arthur",
+           "sender_country": "ZA",
+           "mobile_number": "+23457558595"
        }
}

ZAR accounts

For ZAR accounts, you'll need to specify the beneficiary's first_name, last_name, email, and mobile_number in the meta field.

{
    "account_bank": "FNB",
    "account_number": "0031625807099",
    "amount": 500,
    "narration": "Withdraw Fiat",
    "currency": "ZAR",
    "meta": 
        {
+           "first_name": "James",
+           "last_name": "Arthur",
+           "email": "test@test.com",
+           "mobile_number": "+23457558595",
+           "recipient_address": "Lavington Nairobi"
        }
}

Response

You'll get a response like this:

{
  "status": "success",
  "message": "Transfer Queued Successfully",
  "data": {
    "id": 190626,
    "account_number": "0690000040",
    "bank_code": "044",
    "full_name": "Alexis Sanchez",
    "created_at": "2021-04-26T11:19:55.000Z",
    "currency": "NGN",
    "debit_currency": "NGN",
    "amount": 200,
    "fee": 10.75,
    "status": "NEW",
    "reference": "jh678b3kol1Z",
    "meta": null,
    "narration": "Payment for things",
    "complete_message": "",
    "requires_approval": 0,
    "is_approved": 1,
    "bank_name": "ACCESS BANK NIGERIA"
  }
}

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 bank accounts at once. See the bulk transfers guide for details.

Loading...