What is a virtual account?
A virtual account gives a customer bank details for receiving payments. Daya supports these funding currencies:
Payments into both account types settle in USD. After applicable fees, Daya credits the merchant collection balance. Daya does not currently maintain a separate EUR balance.
Virtual accounts are separate from funding accounts. Use Funding Accounts when customers need to send NGN or crypto into Daya.
Prerequisites
See Submit Tier 2 Verification for individual KYC and business KYB.Individual verification flow
- Create a customer with
POST /v1/customers. - Complete Tier 1 verification with
POST /v1/customers/{id}/tier1-verification. A phone number is required only when the Tier 1 request also includes bank details for Paystack. - Complete Tier 2 verification with
POST /v1/customers/{id}/tier2-verification. - Wait until the Tier 2 status is
VERIFIED. - Create the USD or EUR virtual account.
Business verification flow
- Create a customer with
POST /v1/customers. - Submit business KYB with
POST /v1/customers/{id}/tier2-verificationandcustomer_type: "business". - Wait until
tier_2_kyc_completeistrue. - Create the USD or EUR virtual account for that
customer_id.
Create an account
UsePOST /v1/virtual-accounts. Set currency to usd or eur. If you omit currency, Daya uses usd.
EUR account request
Virtual account properties
Deposit instruction fields
The available fields depend on the account currency.How deposits settle
USD deposit
- The sender pays USD to the returned bank account.
- Daya processes the payment.
- After applicable fees, Daya credits the merchant USD collection balance.
- Daya sends
deposit.receivedanddeposit.completedwebhooks.
EUR deposit
- The sender pays EUR to the returned IBAN through a supported SEPA rail.
- Daya converts the incoming payment and settles it in USD.
- After applicable fees, Daya credits the merchant USD collection balance.
- The deposit response and webhooks include the original EUR amount and applied exchange rate.
Use
/v1/virtual-account-deposits for payments into USD and EUR virtual accounts. Use /v1/deposits for NGN and crypto funding-account deposits.Webhook handling
Virtual account deposits senddeposit.received and deposit.completed. Credit your customer only once, using deposit.completed as the terminal signal. Deduplicate on data.id because separate webhook events for the same deposit have different envelope IDs.
See Webhook Events for the complete delivery and idempotency guidance.
Developer fees
Developer fees let you keep a percentage of each settled virtual account deposit. Adddeveloper_fee.percentage when you create the account.
Use a decimal string from 0 to 50. Omit developer_fee to use 0%.
The value is a percentage, not basis points. For example, 0.5 means 0.5%, 2 means 2%, and 50 means 50%.
For EUR-funded deposits, Daya calculates the developer fee from the converted USD amount after Daya deposit fees. Deposit responses and webhooks include developer_fee and customer_amount for reconciliation.
Relationship to Tier 2 verification
For individual customers, submit Tier 2 KYC. For business customers, submit Tier 2 KYB with
customer_type: "business". Both use Submit Tier 2 Verification.
API routes
- Create Virtual Account
- List Virtual Accounts
- Get Virtual Account
- List Customer Virtual Accounts
- List Virtual Account Deposits
Next steps
Create Virtual Account
Provision USD or EUR receiving details
Tier 2 Verification
Complete the required customer verification
Virtual Account Deposits
Reconcile USD- and EUR-funded deposits