Skip to main content

What Is the Daya API?

The Daya API lets businesses move money between Nigerian Naira (NGN), USD bank rails, and stablecoins such as USDC and USDT through one programmable interface. Instead of building exchange logic, wallet infrastructure, KYC flows, banking rails, and payout operations from scratch, partners can integrate Daya and focus on their product experience. Common products partners can build include:
  • A fintech app that lets Nigerian users buy stablecoins without leaving the product.
  • A savings, payroll, or marketplace app that lets users cash out stablecoins into Nigerian bank accounts.
  • A business banking or creator product that gives customers USD virtual accounts and outbound USD transfer options.
CapabilityWhat it doesPrimary docs
Funding accountsCreate NGN virtual accounts and crypto deposit addresses for receiving funds.Funding Accounts
OnrampsCollect NGN and settle to stablecoins or Daya balance.Onramps
OfframpsCollect USDC/USDT and settle to NGN payout or Daya balance.Offramps
DepositsReconcile inbound NGN, crypto, and virtual account deposits.Deposits
TransfersSend NGN to Nigerian banks or USD through supported rails.Transfers
USD virtual accountsProvision USD receiving accounts for verified customers.Virtual Accounts
WebhooksReceive transaction and verification events in real time.Webhooks
Supported chainsCheck live chain and token availability by direction.Supported Chains

Sandbox vs Production

All new partners should start in sandbox. Sandbox testing protects the partner, Daya, and end users from real-money mistakes while implementation details are still being validated.
AreaSandboxProduction
Base URLhttps://api.sandbox.daya.cohttps://api.daya.co
Real moneyNo. Deposits and money movement are simulated.Yes. Real NGN, USD, and stablecoins move.
API keysSeparate sandbox keys.Issued after KYB approval.
AccessRequest invite from the Daya team.Complete KYB and receive dashboard access.
UseBuild, test, and validate flows.Serve real users after launch checks.
If you receive a dashboard invite but cannot log in, use the exact email address the invite was sent to. Using another email can return a 401 Unauthorized or USER_NOT_FOUND style error.
If production calls return APP_PAUSED or a 503 app-paused response, Daya needs to activate the app on its side. This is not usually a partner code issue. Contact support or your partner channel.

Production Access and KYB

Production access requires KYB verification. Treat KYB as part of the launch path, not as optional admin work. KYB unlocks production API keys, real money movement, USD virtual accounts, and USD transfer rails where available.
  1. Request production access through support@daya.co or the dedicated partner channel.
  2. Submit the KYB form and business documents, including company registration, director details, and proof of business.
  3. Wait for Daya review and approval.
  4. Accept the production dashboard invite using the exact invited email address.
  5. Generate production API keys and configure webhooks.
If the dashboard invite link does not work, ask Daya to resend the invite or verify the email address.

Dashboard Setup

The dashboard is where partners manage API keys, webhooks, team access, balances, and transaction monitoring.
  • Generate and rotate API keys separately for sandbox and production.
  • Configure webhook endpoints before launch.
  • Add team members with appropriate access.
  • Monitor merchant balances, deposits, transfers, and payout status.

Webhook Setup

  1. Add the webhook endpoint URL in the Daya dashboard.
  2. Configure your server to accept Daya webhook requests, including IP allowlisting where required.
  3. Verify webhook signatures using the webhook verification docs.
  4. Log event IDs and resource IDs so support can investigate issues quickly.
For staging and production, use a publicly accessible HTTPS endpoint that remains stable over time. Temporary tunneling services such as ngrok, Cloudflare Tunnel, or localtunnel should only be used during active local development and testing.
Verify the webhook signature and return HTTP 200 as quickly as possible. Process the event asynchronously after the response has been sent. Delayed responses may cause delivery retries and duplicate event processing if handlers are not idempotent.

Balance Model

Balance handling is one of the most important concepts to understand before building on Daya. Many issues come from assuming Daya maintains individual user balances or that all funds are immediately withdrawable.
Balance typeWhat goes inWhat comes out
Collection balanceFunding account deposits and virtual account deposits.Funds moved to withdrawal balance through merchant balance transfer.
Withdrawal balanceMerchant funding deposits and funds moved from collection balance.Transfers, bank payouts, and supported withdrawals.
Transfers and payouts are funded from withdrawal balance, not collection balance. Ensure sufficient withdrawal balance is available before initiating outbound money movement.
Daya does not maintain balances for each end user. Partners must maintain their own ledger using webhooks, deposit records, transfer records, and reconciliation jobs.
A typical ledger flow:
  1. A user deposits funds or receives money through a Daya-powered flow.
  2. The funds settle into the merchant’s Daya balance.
  3. Daya sends webhook events and exposes transaction state through the API.
  4. The partner credits or debits the user on the partner’s own ledger.
  5. The partner initiates payout, transfer, or withdrawal from merchant balance when needed.

Rates and Rate IDs

Temporary funding account flows may require a rate before creation.
FlowDirectionWhy it matters
Onramp, or NGN funding accountBUYUser sends NGN and receives stablecoin settlement.
Offramp, or crypto funding accountSELLUser sends stablecoin and receives NGN payout.
Use GET /v1/rates to retrieve rates and pass the returned rate_id when the funding account requires one. Respect the rate expiry window. If a rate expires before creation or before payment arrives, the deposit may be flagged for review instead of settling automatically.
The Business API rate and the Pro app order book rate are different pricing surfaces. The Pro app order book reflects bids and offers from users in the market at that moment. The Business API rate is what Daya can offer and execute within the rate expiry window. They may differ.
When comparing rates, compare the same asset, amount, direction, timestamp, and whether you are looking at a gross FX rate or final net destination amount after fees.

Onramps: NGN to USDC/USDT

An onramp lets a customer pay NGN into a Daya bank account. Daya records the incoming money as a deposit, then settles the value to your Daya balance or to an onchain stablecoin address. New integrations create onramps with POST /v1/funding-accounts using:
FieldValue
railNGN_VIRTUAL_ACCOUNT
currencyNGN
typeTEMPORARY or PERMANENT
TypeUse caseExpiryRateVerificationSettlement
TEMPORARYOne-off deposit at a locked rate.Yes.rate_id required for ONCHAIN settlement.Usually not required.INTERNAL_BALANCE or ONCHAIN.
PERMANENTRecurring deposits from the same customer.No expiry.Applied at deposit time.Tier 1 KYC required.INTERNAL_BALANCE or ONCHAIN.

Onramp Fees

FeeAmountWhen chargedImportant note
NGN deposit chargeNGN 1 flatWhen Naira lands in the virtual account.Deducted before conversion.
Crypto settlement feeUSD 0.10 flatWhen stablecoin is paid out.Deducted from stablecoin received.
For temporary onramps, always display the exact payable amount returned by the API response. Do not recalculate, round, or let the user edit it. Amount mismatch can trigger an automatic refund or review state.
Pass the customer’s name when creating an onramp. The name can appear on the virtual account holder details, and Nigerian users often verify the account name before sending a bank transfer.

Offramps: USDC/USDT to NGN

An offramp gives your customer a crypto address for sending USDC or USDT into Daya. Daya records the incoming crypto as a deposit, then settles the value to your Daya balance or to a Nigerian bank account. New integrations create offramps with POST /v1/funding-accounts using:
FieldValue
railCRYPTO_ADDRESS
assetUSDC or USDT
chainSupported network
typeTEMPORARY or PERMANENT
TypeUse caseAddress expirySettlement modes
TEMPORARYOne-time crypto deposit.Yes.NGN_PAYOUT only.
PERMANENTRecurring deposits from the same customer.No expiry.INTERNAL_BALANCE or NGN_PAYOUT.

Offramp Fees

FeeAmountCapNotes
Crypto sent to addressNo Daya feeNoneUser pays only blockchain gas or network fees.
NGN bank payout0.1%NGN 100Charged when NGN is paid to the bank account. No separate stamp duty or VAT is expected on top of this fee.

Bank Account Resolution

Before creating an offramp with NGN_PAYOUT, resolve the destination account using POST /v1/banks/resolve. This verifies the bank account number and account holder name before funds are committed.

Minimum Deposit Handling

Deposits below the minimum supported threshold can be flagged and may not be eligible for settlement. Do not present a flagged deposit as a failed deposit. Clearly communicate that the deposited amount did not meet the minimum settlement requirement and provide support guidance.

Payout Timing

NGN bank payouts are not guaranteed to be instant. Daya depends on third-party payout providers. Provider incidents can delay completion.
If a user confirms bank receipt but the deposit still appears to be processing, treat the API and webhook state as temporarily out of sync. Do not create a duplicate payout. Poll, reconcile bank receipt, and escalate with IDs if the final webhook does not arrive.

Supported Chains and Tokens

Chain and token support is runtime-configured. Partners should not hard-code support from this guide, screenshots, or old conversations. Always call GET /v1/supported-chains before showing a chain/token option to users or before attempting onchain settlement.
FlagMeaning
deposit_enabledUsers can deposit that token on that chain into Daya. Commonly relevant to offramps.
withdraw_enabledDaya can send that token on that chain out to a wallet. Commonly relevant to onramp ONCHAIN settlement.
Do not rely on a static chain table for production decisions. The supported-chains endpoint is the authoritative live source. This matters during chain rollouts, where individual tokens and directions can go live at different times.
If you receive VALIDATION_FAILED - unsupported settlement chain/token, the chain/token is not enabled for the requested direction. Check both the chain and token with /v1/supported-chains before retrying.

USD Virtual Accounts

A USD virtual account is a US bank account provisioned for a verified customer so the customer can receive USD payments. The sender does not need to understand crypto. Typical prerequisites:
  1. Create a customer.
  2. Complete required verification.
  3. Wait for verification status to become approved.
  4. Create the virtual account.
A USD virtual account does not maintain a separate spendable balance for the customer inside Daya. Deposits settle into the merchant collection balance. The partner must credit the customer on its own ledger using deposit webhooks and reconciliation. Verification failures and provider outages should be handled differently. A verification rejection usually requires corrected information from the customer. A provider outage or upstream service error should be retried after a short backoff before asking the customer to resubmit documents.

Transfers

Transfers are merchant-initiated sends of funds to a bank recipient. They are funded from withdrawal balance, not collection balance. Use POST /v1/transfers to create a transfer.

NGN Transfers

NGN transfers send Naira to Nigerian bank accounts. Resolve bank account details before creating the transfer and make sure the relevant withdrawal balance is funded.

USD Transfers

USD transfers send money through supported USD rails. The customer on whose behalf the partner is sending may need additional verification, especially for inline USD bank or SWIFT destinations.

Idempotency

Always include an Idempotency-Key header when creating transfers or other money-movement requests that may be retried. Use a unique UUID per logical transfer attempt to avoid duplicates.
A timeout or pending state does not necessarily mean a transfer failed. Do not automatically create a replacement transfer. Wait for final status updates, reconciliation results, or webhook notifications before retrying.

Fee Reference

Transaction typeFeeCapNotes
Onramp - NGN depositNGN 1 flatNoneCharged when Naira lands in the virtual account.
Onramp - crypto settlementUSD 0.10 flatNoneDeducted from stablecoin payout.
Offramp - crypto sent to addressNo Daya feeNoneUser pays blockchain gas or network fee only.
Offramp - NGN bank payout0.1%NGN 100Covers applicable NGN payout charges; no separate stamp duty or VAT expected.
USD transfer - ACH0.4%No capConfirm current rail availability and provider behavior before launch.
USD transfer - Wire0.4%No capConfirm current rail availability before launch.
USD transfer - RTP / FedNow0.4%No capAvailable only where the provider and recipient bank support instant rails.
USD transfer - SWIFT0.4%No capConfirm commercial availability before promising it to users.
Partner custom feePartner-definedPartner-definedNot currently natively configurable in the Daya API.
Partners can still charge users in their own product flow, but they must model, collect, and reconcile that fee themselves until Daya exposes native custom-fee support.

Going Live Checklist

  • Complete KYB and receive production approval.
  • Log in to the production dashboard with the exact invited email.
  • Generate production API keys and store them securely server-side.
  • Set up the production webhook endpoint and signature verification.
  • Configure webhook IP allowlisting if required.
  • Check /v1/supported-chains at runtime and build direction-aware controls.
  • Test onramp flows with exact amounts and minimum-amount edge cases.
  • Test offramp flows including bank account resolution, delayed processing states, and webhook finalization.
  • Confirm pricing accounts for Daya fees and any partner-side fee.
  • Add idempotency keys to retryable money-movement requests.
  • Implement reconciliation jobs for webhooks, API state, and partner ledger state.

Troubleshooting

Symptom or errorLikely causeWhat to do
APP_PAUSED / 503Production app not enabled by Daya.Contact Daya support or partner channel and ask for app activation.
401 Unauthorized / USER_NOT_FOUNDWrong login email or API key context.Use the exact invited email and correct environment keys.
Webhook 403IP allowlist or signature verification rejection.Confirm Daya IPs and webhook signature logic.
VALIDATION_FAILED - unsupported settlement chain/tokenChain/token not enabled for requested direction.Call /v1/supported-chains and check deposit_enabled or withdraw_enabled.
User was refunded on onrampAmount mismatch or below minimum after fees.Display the exact API-returned amount and do not round.
Deposit stuck in processingProvider delay or API/webhook finalization lag.Do not duplicate payout. Poll, reconcile receipt, and escalate with IDs if delayed.
API rate differs from Pro app rateDifferent pricing surfaces or gross/net comparison.Confirm side, asset, amount, direction, timestamp, and fee inclusion.
Failed to provision wallet addressTemporary wallet/address provisioning issue.Retry only if safe and escalate with request ID if persistent.
Final webhook not receivedWebhook delivery issue or payout state lag.Poll API status, check webhook logs, and reconcile before manual intervention.
Webhook returns 400Signature validation failure or payload parsing error.Verify signatures using the raw request body and handle unknown event types gracefully.
Webhook returns 500Internal error in webhook processing.Review application logs and ensure webhook handlers are fault tolerant.
Transfer times out or remains pendingDownstream banking infrastructure delay.Do not create a duplicate transfer. Wait for final status updates and reconciliation.
Payout fails despite successful user activityInsufficient withdrawal balance.Confirm funds are available in withdrawal balance before initiating payouts.

FAQ

Why did the user get refunded?

Temporary onramps require the exact amount returned by the API response. Amount mismatch can trigger an automatic refund or review state.

Why is the API offramp rate different from the Pro app market or order book rate?

The Pro app order book reflects user bids and offers at that moment, while the Business API rate is what Daya can offer and execute within the rate expiry window. They are separate pricing surfaces and may differ. For offramps, confirm the partner is using the SELL rate and comparing the same asset, amount, direction, and timestamp.

Is Aptos supported?

Aptos support is available only when the live supported-chains endpoint says the exact token and direction are enabled. Check USDT and USDC separately and check deposit_enabled versus withdraw_enabled.

Can partners configure a custom flat fee in Daya?

Not currently. Partners should implement any additional fee in their own product flow until Daya exposes native custom-fee support.

Are virtual accounts and ACH the same thing?

No. Virtual accounts receive funds. ACH, Wire, RTP/FedNow, and SWIFT are transfer rails for sending funds.

Support and Escalation

ChannelUse for
Dedicated partner channelFastest route for integration questions, launch blockers, production incidents, and unclear API behavior.
support@daya.coGeneral support, dashboard access, non-urgent issues, and production activation requests.
docs.daya.coConcept docs, endpoint references, webhook docs, fee and limits documentation.
dashboard.daya.coAPI keys, webhook endpoints, balances, transaction monitoring, and team access.
When escalating, include environment, endpoint, request body with secrets removed, request_id, funding account ID, deposit ID, transfer ID, chain/token, bank name where relevant, timestamp, and webhook event IDs or delivery logs.