Skip to main content

What is a Transfer?

A transfer is a merchant-initiated send of funds to a bank account or crypto address. Transfers support Nigerian Naira (NGN), US Dollar (USD), native SOL, and native BNB destinations. Transfers are the API resource for sending money from a Daya withdrawal balance to an external bank account or crypto address. They emit transfer.* webhooks.

Funding Transfers

Transfers are funded from a withdrawal balance. There are three ways to ensure the selected 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.
  2. Via merchant funding — send crypto or NGN directly to your merchant funding accounts. These go straight into a merchant withdrawal balance. NGN deposits convert to USD under USD_BALANCE or remain NGN under NGN_BALANCE.
  3. Via a customer NGN balance — permanent customer funding accounts using CUSTOMER_NGN_BALANCE credit a separate NGN balance for that customer. Create a customer-scoped NGN transfer to spend it.

Saved vs Inline Recipients

Transfers support two modes for specifying the destination:

Saved recipients

Create a recipient once via POST /v1/recipients, 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.
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.

Transfer Lifecycle

Webhook events expose the lifecycle in more detail than the external status field:
Use /v1/transfers and transfer.* webhooks for merchant-created bank sends.

NGN Transfers

When you create an NGN transfer:
  • The amount is in Naira (e.g. 50000.00)
  • Omit debit_currency to preserve the existing USD-funded flow, or set debit_currency: NGN to spend retained NGN without transfer FX conversion.
  • debit_scope defaults to MERCHANT. Set it to CUSTOMER with on_behalf_of.customer_id to debit that customer’s NGN balance.
  • The response debit_amount is the total removed from the selected balance (principal plus fee) in debit_currency. fee is included in that total and does not reduce the recipient amount.
  • The rate field captures the exchange rate snapshot used
  • The recipient must receive at least NGN 100.
  • If the recipient amount is below NGN 1,000, a flat NGN 20 fee applies.
  • At NGN 1,000 or above, the configured percentage fee and NGN cap from GET /v1/fees apply.
  • For USD-funded NGN transfers, the NGN fee is converted to USD. For NGN-funded transfers, it remains NGN. It does not reduce the recipient amount.

Balance selection

Customer-scoped transfers support NGN bank transfers only. The recipient must belong to the same customer, and the customer must have completed Tier 1 KYC. See Limits for worked examples of the balance impact for default USD-funded and retained-NGN transfers.

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
  • A minimum effective USD debit of $0.50 is enforced for USD transfers.
USD transfers may also send USDC or USDT to a CRYPTO_ADDRESS. Use GET /v1/supported-chains to discover withdrawal-enabled asset and chain combinations.

Native SOL and BNB Transfers

For a native-asset transfer, set currency to SOL or BNB and use a matching CRYPTO_ADDRESS recipient. SOL requires the SOLANA chain and supports up to 9 decimal places. BNB requires the BSC chain and supports up to 8 decimal places. Omit debit_currency; Daya debits the matching merchant SOL or BNB withdrawal balance. Native transfers have no transfer fee, but the requested amount must have an effective value of at least USD 0.50. Use GET /v1/supported-chains to verify the current environment’s availability.

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


Next Steps

Create Transfer

Send funds to a bank recipient

Create Recipient

Save a recipient for reuse

Merchant Balance

Check your available balance