Overview
Sandbox is designed to help you test real production behaviors in a safe environment. In particular, you can trigger a mock deposit for an NGN or crypto funding account:What it validates
- Your deposit lifecycle UI/state machine
- Your webhook endpoint (signature verification + idempotency + retries)
- Your handling of edge cases like deposits that require review
Testing specific deposit outcomes
Usescenario with POST /v1/sandbox/deposits when you need to trigger a specific lifecycle state.
For ordinary customer funding, if you omit
scenario, sandbox runs the default processing flow. Use the default flow when you want to test production-like behavior and natural intermediate states, and use scenario when you want deterministic state testing.PROCESSING and COMPLETED scenarios still use the funding account’s active settlement destination. Make sure the funding account is active, has an active settlement destination, and includes any required rate_id, destination wallet, or destination bank details before triggering those outcomes.Flagging behavior (important)
Sandbox follows the same rules engine as production. As a result, simulated deposits may require review automatically:- Rate expired: If the quote/rate tied to the funding account is expired, the deposit will be flagged.
- Re-used temporary NGN account: If a deposit has already been created for the same temporary receive instruction, subsequent simulated deposits may be flagged.
If you want a clean happy path test, create a fresh funding account, then trigger the sandbox deposit immediately. For crypto funding accounts, you can either use this helper with
funding_account_id or send testnet USDC/USDT to the returned address.Temporary crypto balance funding
- Create a sandbox funding account with
TEMPORARY,CRYPTO_ADDRESS, an existing customer,USDTorUSDC,chain: ETHEREUM, andINTERNAL_BALANCE. Omit the rate and payout destination. Include a creation idempotency key. - Within the 30-minute payment window, call the sandbox deposit endpoint with
funding_account_idandscenario: COMPLETED. Do not passamount,asset, orchainfor this customer funding simulation. - Check
/v1/deposits,deposit.completed, and the USD balance credit. Test both assets and any developer fee you use. - Retry the account create with its original key and body. Confirm the address and deadline do not change.
- Verify that your app stops showing payment instructions at
expires_atand handles deposits that require review without crediting them.
Bridges
Create a sandbox bridge withtype: TEMPORARY, asset: USDT, and test addresses from the supported bridge chain list. Your key needs withdraw for creation, read for reads, and both write and withdraw for sandbox deposits.
Follow the create and advance examples, then test:
- Advance
PROCESSINGtoCOMPLETED,FAILED, orUNCERTAIN_PAYOUT. Use a separate deposit for each outcome. - Check the default fees:
100received gives99.000000after fees;500gives498.000000. - Send
0.5to testBELOW_MINIMUM, and test a deposit that crosses the cumulative100000limit. Verify your app handles review without showing a successful payout. - Test
WAITING_FOR_LIQUIDITY,REQUIRES_REVIEW, andLATE. IfLATEreturns409, retry the same request later. Keep your app’s payment window at 30 minutes. - Test
WRONG_ASSETandWRONG_CHAIN. These responses omitdeposit_idand do not emit merchant deposit events. - For refund testing, contact support@daya.co to prepare a deposit with a refund in progress. Advance it with
REFUNDEDand check forREVERSEDandrefund.status: COMPLETED. - Retry with the same key and body and confirm there is no duplicate deposit. Check that your app handles duplicate and out-of-order bridge events.
Sandbox Bank Accounts
When testing crypto funding accounts withNGN_PAYOUT settlement, use the following test bank accounts:
Increment the last digit of the account number to generate additional test accounts. Resolve them with
POST /v1/banks/resolve before use — just like production.
Recommended end-to-end flow
NGN receive instruction
- Call
GET /v1/rates?side=BUYto get a freshrate_id - Create a sandbox NGN funding account with
rail: NGN_VIRTUAL_ACCOUNT - Call
POST /v1/sandbox/depositswith the returned funding accountidasfunding_account_id - Observe status progression and confirm you receive the expected webhooks (
deposit.received, thendeposit.completed/deposit.failed/deposit.requires_review)
Crypto funding account
- Call
POST /v1/banks/resolveto verify the test bank account - Call
GET /v1/rates?side=SELLto get a freshrate_id - Call
POST /v1/funding-accountswithrail: CRYPTO_ADDRESS,asset,chain, andNGN_PAYOUTsettlement - Call
POST /v1/sandbox/depositswith the returned funding accountidasfunding_account_id, or send test crypto to the returnedaddress - Observe deposit webhook events (
deposit.received, thendeposit.completed/deposit.failed/deposit.requires_review)
Getting Testnet USDC
To test crypto deposits in sandbox, you need testnet USDC. Use the Circle faucet to get free testnet USDC:Circle USDC Faucet
Get free testnet USDC to send to your sandbox crypto funding account addresses
Next Steps
Webhooks Overview
Ensure your webhook endpoint is receiving deposit events
Webhook Verification
Verify signatures correctly and handle retries safely