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.
| Capability | What it does | Primary docs |
|---|
| Funding accounts | Create NGN virtual accounts and crypto deposit addresses for receiving funds. | Funding Accounts |
| Onramps | Collect NGN and settle to stablecoins or Daya balance. | Onramps |
| Offramps | Collect USDC/USDT and settle to NGN payout or Daya balance. | Offramps |
| Deposits | Reconcile inbound NGN, crypto, and virtual account deposits. | Deposits |
| Transfers | Send NGN to Nigerian banks or USD through supported rails. | Transfers |
| USD virtual accounts | Provision USD receiving accounts for verified customers. | Virtual Accounts |
| Webhooks | Receive transaction and verification events in real time. | Webhooks |
| Supported chains | Check 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.
| Area | Sandbox | Production |
|---|
| Base URL | https://api.sandbox.daya.co | https://api.daya.co |
| Real money | No. Deposits and money movement are simulated. | Yes. Real NGN, USD, and stablecoins move. |
| API keys | Separate sandbox keys. | Issued after KYB approval. |
| Access | Request invite from the Daya team. | Complete KYB and receive dashboard access. |
| Use | Build, 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.
- Request production access through
support@daya.co or the dedicated partner channel.
- Submit the KYB form and business documents, including company registration, director details, and proof of business.
- Wait for Daya review and approval.
- Accept the production dashboard invite using the exact invited email address.
- 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
- Add the webhook endpoint URL in the Daya dashboard.
- Configure your server to accept Daya webhook requests, including IP allowlisting where required.
- Verify webhook signatures using the webhook verification docs.
- 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 type | What goes in | What comes out |
|---|
| Collection balance | Funding account deposits and virtual account deposits. | Funds moved to withdrawal balance through merchant balance transfer. |
| Withdrawal balance | Merchant 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:
- A user deposits funds or receives money through a Daya-powered flow.
- The funds settle into the merchant’s Daya balance.
- Daya sends webhook events and exposes transaction state through the API.
- The partner credits or debits the user on the partner’s own ledger.
- 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.
| Flow | Direction | Why it matters |
|---|
| Onramp, or NGN funding account | BUY | User sends NGN and receives stablecoin settlement. |
| Offramp, or crypto funding account | SELL | User 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:
| Field | Value |
|---|
rail | NGN_VIRTUAL_ACCOUNT |
currency | NGN |
type | TEMPORARY or PERMANENT |
| Type | Use case | Expiry | Rate | Verification | Settlement |
|---|
TEMPORARY | One-off deposit at a locked rate. | Yes. | rate_id required for ONCHAIN settlement. | Usually not required. | INTERNAL_BALANCE or ONCHAIN. |
PERMANENT | Recurring deposits from the same customer. | No expiry. | Applied at deposit time. | Tier 1 KYC required. | INTERNAL_BALANCE or ONCHAIN. |
Onramp Fees
| Fee | Amount | When charged | Important note |
|---|
| NGN deposit charge | NGN 1 flat | When Naira lands in the virtual account. | Deducted before conversion. |
| Crypto settlement fee | USD 0.10 flat | When 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:
| Field | Value |
|---|
rail | CRYPTO_ADDRESS |
asset | USDC or USDT |
chain | Supported network |
type | TEMPORARY or PERMANENT |
| Type | Use case | Address expiry | Settlement modes |
|---|
TEMPORARY | One-time crypto deposit. | Yes. | NGN_PAYOUT only. |
PERMANENT | Recurring deposits from the same customer. | No expiry. | INTERNAL_BALANCE or NGN_PAYOUT. |
Offramp Fees
| Fee | Amount | Cap | Notes |
|---|
| Crypto sent to address | No Daya fee | None | User pays only blockchain gas or network fees. |
| NGN bank payout | 0.1% | NGN 100 | Charged 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.
| Flag | Meaning |
|---|
deposit_enabled | Users can deposit that token on that chain into Daya. Commonly relevant to offramps. |
withdraw_enabled | Daya 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:
- Create a customer.
- Complete required verification.
- Wait for verification status to become approved.
- 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 type | Fee | Cap | Notes |
|---|
| Onramp - NGN deposit | NGN 1 flat | None | Charged when Naira lands in the virtual account. |
| Onramp - crypto settlement | USD 0.10 flat | None | Deducted from stablecoin payout. |
| Offramp - crypto sent to address | No Daya fee | None | User pays blockchain gas or network fee only. |
| Offramp - NGN bank payout | 0.1% | NGN 100 | Covers applicable NGN payout charges; no separate stamp duty or VAT expected. |
| USD transfer - ACH | 0.4% | No cap | Confirm current rail availability and provider behavior before launch. |
| USD transfer - Wire | 0.4% | No cap | Confirm current rail availability before launch. |
| USD transfer - RTP / FedNow | 0.4% | No cap | Available only where the provider and recipient bank support instant rails. |
| USD transfer - SWIFT | 0.4% | No cap | Confirm commercial availability before promising it to users. |
| Partner custom fee | Partner-defined | Partner-defined | Not 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 error | Likely cause | What to do |
|---|
APP_PAUSED / 503 | Production app not enabled by Daya. | Contact Daya support or partner channel and ask for app activation. |
401 Unauthorized / USER_NOT_FOUND | Wrong login email or API key context. | Use the exact invited email and correct environment keys. |
Webhook 403 | IP allowlist or signature verification rejection. | Confirm Daya IPs and webhook signature logic. |
VALIDATION_FAILED - unsupported settlement chain/token | Chain/token not enabled for requested direction. | Call /v1/supported-chains and check deposit_enabled or withdraw_enabled. |
| User was refunded on onramp | Amount mismatch or below minimum after fees. | Display the exact API-returned amount and do not round. |
| Deposit stuck in processing | Provider 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 rate | Different pricing surfaces or gross/net comparison. | Confirm side, asset, amount, direction, timestamp, and fee inclusion. |
| Failed to provision wallet address | Temporary wallet/address provisioning issue. | Retry only if safe and escalate with request ID if persistent. |
| Final webhook not received | Webhook delivery issue or payout state lag. | Poll API status, check webhook logs, and reconcile before manual intervention. |
Webhook returns 400 | Signature validation failure or payload parsing error. | Verify signatures using the raw request body and handle unknown event types gracefully. |
Webhook returns 500 | Internal error in webhook processing. | Review application logs and ensure webhook handlers are fault tolerant. |
| Transfer times out or remains pending | Downstream banking infrastructure delay. | Do not create a duplicate transfer. Wait for final status updates and reconciliation. |
| Payout fails despite successful user activity | Insufficient 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.
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
| Channel | Use for |
|---|
| Dedicated partner channel | Fastest route for integration questions, launch blockers, production incidents, and unclear API behavior. |
support@daya.co | General support, dashboard access, non-urgent issues, and production activation requests. |
| docs.daya.co | Concept docs, endpoint references, webhook docs, fee and limits documentation. |
| dashboard.daya.co | API 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.