# Introduction

Learn how to transfer funds globally across multiple channels.

Flutterwave Transfers provides a suite of services that enable you to send money seamlessly to bank accounts, mobile numbers, wallets, and even through cash pickups. Depending on your business model, you can choose from the following options to facilitate transfers:

You can complete a transfer using either of the following flows:

* **[Transfer Orchestrator](/v4.0/docs/direct-transfer-flow)** - This flow supports one-time transfers. Using this flow, it is quicker to initiate your transfer requests as all information is collected at once.
* **[General Transfer Flow](/v4.0/docs/general-transfer-flow)** - This supports recurring transfers best, i.e. transfers made to the same recipient or transfers requiring the same sender information. It is a customizable flow that offers more control over the payout process and user experience.

<br />

## Making a Transfer

> ❗️
>
> To effectively use through these instructions, You'll need API credentials. Sign up for test credentials [here](https://onboarding.flutterwave.com/signup/steps/670fd6ca31db5a18fd7d03a7).

This guide demonstrates the orchestrator flow for one-time transfers. Read this [explainer](/v4.0/docs/general-transfer-flow) to initiate recurring transfers on your account.

### Step 1: Generate an Authorization Token

Use the identity endpoint to generate your auth token. Read more about our API authentication [here](/v4.0/docs/authentication).

```curl Example
curl --location 'https://idp.flutterwave.com/realms/flutterwave/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={{YOUR_CLIENT_ID}}' \
--data-urlencode 'client_secret={{YOUR_CLIENT_SECRET}}' \
--data-urlencode 'grant_type=client_credentials'

```

<br />

### Step 2: Collect and verify your customer's account information

[Validate](https://developer.flutterwave.com/reference/bank_account_resolve_post) your customer's bank account information. This step is important to ensure that your transfer is processed successfully to the correct recipient.

```curl Example Request
curl --request POST \
     --url https://developersandbox-api.flutterwave.com/banks/account-resolve \
     --header 'content-type: application/json' \
     --data '
{
  "account": {
    "code": "044",
    "number": "0690000040"
  },
  "currency": "NGN"
}
'
```
```json 200 Ok
{
  "status": "success",
  "message": "string",
  "data": {
    "bank_code": "044",
    "account_number": "0690000040",
    "account_name": "Alex James"
  }
}
```

<br />

### Step 3: Initiate the Transfer

Send the transfer reference, payment instruction and transfer type to initiate the transfer. Read more about initiating transfers [here](https://developer.flutterwave.com/reference/direct_transfers_post).

```curl Example Request
curl --request POST \
--url 'https://developersandbox-api.flutterwave.com/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": {
      "bank": {
        "account_number": "0122333334",
        "code": "044"
      }
    },
    "destination_currency": "NGN"
  },
  "type": "bank",
  "reference": "574874568ufdgjhvbjhcdbchb"
}'
```
```json 200 Ok
{
  "status": "success",
  "message": "Transfer created",
  "data": {
    "id": "trf_pGoKPGH7rEgY4v",
    "type": "bank",
    "reference": "574874568ufdgjhvbjhcdbchb",
    "status": "NEW",
    "source_currency": "NGN",
    "destination_currency": "NGN",
    "amount": {
      "value": 50000,
      "applies_to": "destination_currency"
    },
    "recipient": {
      "type": "bank",
      "bank": {
        "account_number": "0122333334",
        "code": "044"
      }
    },
    "meta": {},
    "created_datetime": "2024-12-05T12:36:20.069512926Z"
  }
}

```
```json 400 Bad Request
{
    "status": "failed",
    "error": {
        "type": "REFERENCE_ALREADY_EXISTS",
        "code": "201409",
        "message": "Transfer with reference already exists",
        "validation_errors": []
    }
}
```

<br />

### Step 4: Query the Transfer status

Before closing out the transfer, confirm its final status. See more details about status retrieval [here](https://developer.flutterwave.com/reference/transfer_get).

```json 200 Ok
{
  "status": "success",
  "message": "Transfer fetched",
  "data": {
    "id": "trf_ighwLOK9pHxoo9",
    "type": "bank",
    "action": "instant",
    "reference": "5748745ug8ufdgjhveyyeebjhcdbchb",
    "status": "SUCCESSFUL",
    "source_currency": "NGN",
    "destination_currency": "NGN",
    "amount": {
      "value": 50000,
      "applies_to": "destination_currency"
    },
    "fee": {
      "currency": "NGN",
      "value": 500
    },
    "debit_information": {
      "currency": "NGN",
      "actual_debit_amount": 50000,
      "rate_used": 0.00123,
      "vat": 3750
    },
    "payment_information": {
      "proof": "754119292904667985302775753026"
    },
    "callback_url": "https://webhook.site/352c4518-7797-4044-becc-669fc5b1e928",
    "recipient": {
      "type": "bank",
      "id": "rcb_TDk7vKxUkj",
      "name": {
        "first": "Ajadi",
        "last": "Jackson"
      },
      "currency": "NGN",
      "bank": {
        "account_number": "0122333334",
        "code": "044"
      }
    },
    "meta": {},
    "created_datetime": "2025-02-18T11:20:37.282Z"
  }
}

```

<br />

## Next reading

[block:html]
{
  "html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <title>Responsive Cards</title>\n  <style>\n    * {\n      box-sizing: border-box;\n    }\n\n    .card-container {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 32px;\n      max-width: 1200px;\n      margin: 0 auto;\n      justify-content: flex-start;\n    }\n\n    .card {\n      flex: 1 1 calc(50% - 16px);\n      text-decoration: none;\n      color: inherit;\n      border: 1px solid #E0E0E0;\n      border-radius: 10px;\n      padding: 24px;\n      margin-bottom: 6px;\n      max-width: 370px;\n      text-align: left;\n    }\n\n    .card h3 {\n      font-size: 1.5em;\n      font-family: Millik, sans-serif;\n      margin: 0;\n      font-weight: 400;\n      color: #100F0D !important;\n    }\n\n    .card p {\n      margin-top: 4px;\n      font-size: 1em;\n      font-family: Moderat, sans-serif;\n      font-weight: 400;\n      color: #828282;\n    }\n\n    /* Card background variations */\n    .bg-orange { background-color: #fff3e0; }\n    .bg-purple { background-color: #e8e6ff; }\n    .bg-pink   { background-color: #FAD7E5; }\n\n    /* Responsive behavior */\n    @media (max-width: 768px) {\n      .card {\n        flex: 1 1 100%;\n        max-width: 100%;\n      }\n    }\n  </style>\n</head>\n<body>\n\n<div class=\"card-container\">\n\n  <a href=\"/v4.0/docs/direct-transfer-flow\" class=\"card\">\n    <h3>Transfer Orchestrator</h3>\n    <p>Quickly initiate one-time transfers.</p>\n  </a>\n  \n<a href=\"/v4.0/docs/general-transfer-flow\" class=\"card\">\n    <h3>General Transfer</h3>\n    <p>Make recurring transfers to different beneficiaries.</p>\n  </a>\n  \n<a href=\"/v4.0/docs/bank-transfer\" class=\"card\">\n    <h3>Bank Account Transfer</h3>\n    <p>Send funds directly to a recipient's bank account.</p>\n  </a>\n\n    <a href=\"/v4.0/docs/mobile-money-1\" class=\"card\">\n    <h3>Mobile Money Transfer</h3>\n    <p>Transfer money to recipients using their mobile phone numbers.</p>\n  </a>\n  \n    <a href=\"/v4.0/docs/wallet-to-wallet\" class=\"card\">\n    <h3>Wallet Transfer</h3>\n    <p>Transfer funds to digital wallets supported by Flutterwave.</p>\n  </a>\n\n</div>\n\n</body>\n</html>"
}
[/block]