> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daya.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Transfers

> How merchant-initiated transfers work for NGN and USD

## What is a Transfer?

A **transfer** is a merchant-initiated send of funds to a bank recipient. Transfers support both Nigerian Naira (NGN) and US Dollar (USD) destinations.

| Currency | Recipient Types                                       |
| -------- | ----------------------------------------------------- |
| `NGN`    | `BANK_ACCOUNT`                                        |
| `USD`    | `US_BANK_ACCOUNT` (ACH or wire), `SWIFT_BANK_ACCOUNT` |

Transfers are the API resource for sending money from your Daya withdrawal balance to an external bank destination. They emit `transfer.*` webhooks.

***

## Funding Transfers

Transfers are funded from your **withdrawal balance**. There are two ways to ensure your balance has funds:

1. **From funding account and USD virtual account deposits** — these land in your **collection balance**. Move them to the withdrawal balance via [`POST /v1/merchant/balance/transfer`](/api-reference/merchant-balance/transfer-merchant-balance).
2. **Via merchant funding** — send crypto or NGN directly to your [funding accounts](/api-reference/merchant-funding/get-merchant-funding). These go straight into the withdrawal balance. NGN funding deposits are converted to USD at the current rate.

***

## Saved vs Inline Recipients

Transfers support two modes for specifying the destination:

### Saved recipients

Create a recipient once via [`POST /v1/recipients`](/api-reference/recipients/create-recipient), then reference it by `recipient_id` in future transfers. This is ideal for recurring payments.

### Inline recipients

Provide full destination details in the `destination` field of the transfer request. The recipient is created implicitly. This is convenient for one-off payments.

<Warning>
  For inline USD destinations (`US_BANK_ACCOUNT` or `SWIFT_BANK_ACCOUNT`), `on_behalf_of.customer_id` is effectively required. That customer must have completed [tier 2 verification](/api-reference/customers/submit-tier2-verification).
</Warning>

***

## Transfer Lifecycle

| Status       | Meaning                                          | Terminal |
| ------------ | ------------------------------------------------ | -------- |
| `PROCESSING` | Transfer has been accepted and is being executed | No       |
| `SETTLED`    | Funds delivered to the recipient                 | Yes      |
| `FAILED`     | Transfer failed permanently                      | Yes      |

Webhook events expose the lifecycle in more detail than the external status field:

| Event                      | Meaning                                            |
| -------------------------- | -------------------------------------------------- |
| `transfer.created`         | Transfer record and first attempt were created     |
| `transfer.processing`      | Funds were locked and submission was queued        |
| `transfer.requires_review` | Transfer was flagged for manual review             |
| `transfer.submitted`       | Provider accepted the transfer submission          |
| `transfer.completed`       | Provider success and ledger finalization completed |
| `transfer.failed`          | Transfer failed terminally after reconciliation    |
| `transfer.reversed`        | A completed transfer was reversed                  |

<Info>
  Use `/v1/transfers` and `transfer.*` webhooks for merchant-created bank sends.
</Info>

***

## NGN Transfers

When you create an NGN transfer:

* The `amount` is in Naira (e.g. `50000.00`)
* The `debit_amount` in the response is the total USD debited from your withdrawal balance, including fees
* The `rate` field captures the exchange rate snapshot used
* A minimum effective USD debit of \$0.50 is enforced. For NGN transfers, the corresponding Naira amount varies with the effective `SELL` exchange rate.

***

## USD Transfers

When you create a USD transfer:

* The `amount` is in USD (e.g. `100.00`)
* `debit_currency` remains `USD`
* The recipient's customer must have completed tier 2 verification

***

## Idempotency

`POST /v1/transfers` is idempotent. Include an `Idempotency-Key` header (or `X-Idempotency-Key` as a fallback) with a unique value to safely retry requests without creating duplicate transfers.

***

## API Routes

* [Create Transfer](/api-reference/transfers/create-transfer)
* [List Transfers](/api-reference/transfers/list-transfers)
* [Get Transfer](/api-reference/transfers/get-transfer)

***

## Next Steps

<CardGroup cols={3}>
  <Card title="Create Transfer" icon="paper-plane" href="/api-reference/transfers/create-transfer">
    Send funds to a bank recipient
  </Card>

  <Card title="Create Recipient" icon="user-plus" href="/api-reference/recipients/create-recipient">
    Save a recipient for reuse
  </Card>

  <Card title="Merchant Balance" icon="wallet" href="/api-reference/merchant-balance/get-merchant-balance">
    Check your available balance
  </Card>
</CardGroup>
