Prerequisites
1
Get API keys
Sign up at dashboard.daya.co and generate sandbox API keys.
2
Create or choose a customer
Funding accounts are created for existing customers. Create one with
POST /v1/customers or use a customer you already have.3
Verify connectivity
curl https://api.sandbox.daya.co/health
Pick the receive flow you want to test:
- Onramp — NGN → Crypto
- Offramp — Crypto → NGN
Create an onramp
Create a temporary onramp to accept NGN and settle to your Daya balance. Daya returns bank account details your customer can pay into.curl --request POST \
--url https://api.sandbox.daya.co/v1/funding-accounts \
--header 'X-Api-Key: YOUR_SANDBOX_API_KEY' \
--header 'X-Idempotency-Key: ngn-onramp-001' \
--header 'Content-Type: application/json' \
--data '{
"type": "TEMPORARY",
"rail": "NGN_VIRTUAL_ACCOUNT",
"customer": {
"customer_id": "650e8400-e29b-41d4-a716-446655440000"
},
"currency": "NGN",
"amount": 50000,
"settlement_destination": {
"type": "INTERNAL_BALANCE"
}
}'
const fundingAccount = await fetch('https://api.sandbox.daya.co/v1/funding-accounts', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_SANDBOX_API_KEY',
'X-Idempotency-Key': 'ngn-onramp-001',
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'TEMPORARY',
rail: 'NGN_VIRTUAL_ACCOUNT',
customer: {
customer_id: '650e8400-e29b-41d4-a716-446655440000'
},
currency: 'NGN',
amount: 50000,
settlement_destination: {
type: 'INTERNAL_BALANCE'
}
})
}).then((response) => response.json());
import requests
funding_account = requests.post(
"https://api.sandbox.daya.co/v1/funding-accounts",
headers={
"X-Api-Key": "YOUR_SANDBOX_API_KEY",
"X-Idempotency-Key": "ngn-onramp-001",
},
json={
"type": "TEMPORARY",
"rail": "NGN_VIRTUAL_ACCOUNT",
"customer": {"customer_id": "650e8400-e29b-41d4-a716-446655440000"},
"currency": "NGN",
"amount": 50000,
"settlement_destination": {"type": "INTERNAL_BALANCE"},
},
).json()
Response 201 Created
{
"object": "funding_account",
"id": "750e8400-e29b-41d4-a716-446655440100",
"type": "TEMPORARY",
"status": "ACTIVE",
"rail": "NGN_VIRTUAL_ACCOUNT",
"customer_id": "650e8400-e29b-41d4-a716-446655440000",
"currency": "NGN",
"amount": 50000,
"settlement_destination": {
"type": "INTERNAL_BALANCE"
},
"instructions": [
{
"type": "NGN_VIRTUAL_ACCOUNT",
"status": "ACTIVE",
"bank_name": "Wema Bank",
"bank_code": "035",
"account_number": "0690000031",
"account_name": "Daya - Customer",
"currency": "NGN"
}
],
"expires_at": "2026-01-14T15:25:12Z"
}
instructions bank details to your customer. When the customer pays, reconcile deposits with /v1/deposits and match rows by funding_account_id:curl --request GET \
--url 'https://api.sandbox.daya.co/v1/deposits' \
--header 'X-Api-Key: YOUR_SANDBOX_API_KEY'
Create an offramp
First resolve the destination bank account:curl --request POST \
--url https://api.sandbox.daya.co/v1/banks/resolve \
--header 'X-Api-Key: YOUR_SANDBOX_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"account_number": "0690000031",
"bank_code": "044"
}'
curl --request POST \
--url https://api.sandbox.daya.co/v1/funding-accounts \
--header 'X-Api-Key: YOUR_SANDBOX_API_KEY' \
--header 'X-Idempotency-Key: crypto-offramp-001' \
--header 'Content-Type: application/json' \
--data '{
"type": "TEMPORARY",
"rail": "CRYPTO_ADDRESS",
"customer": {
"customer_id": "650e8400-e29b-41d4-a716-446655440000"
},
"asset": "USDC",
"chain": "BASE",
"settlement_destination": {
"type": "NGN_PAYOUT",
"rate_id": "550e8400-e29b-41d4-a716-446655440000",
"destination_bank": {
"account_number": "0690000031",
"bank_code": "044"
}
}
}'
const fundingAccount = await fetch('https://api.sandbox.daya.co/v1/funding-accounts', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_SANDBOX_API_KEY',
'X-Idempotency-Key': 'crypto-offramp-001',
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'TEMPORARY',
rail: 'CRYPTO_ADDRESS',
customer: {
customer_id: '650e8400-e29b-41d4-a716-446655440000'
},
asset: 'USDC',
chain: 'BASE',
settlement_destination: {
type: 'NGN_PAYOUT',
rate_id: '550e8400-e29b-41d4-a716-446655440000',
destination_bank: {
account_number: '0690000031',
bank_code: '044'
}
}
})
}).then((response) => response.json());
import requests
funding_account = requests.post(
"https://api.sandbox.daya.co/v1/funding-accounts",
headers={
"X-Api-Key": "YOUR_SANDBOX_API_KEY",
"X-Idempotency-Key": "crypto-offramp-001",
},
json={
"type": "TEMPORARY",
"rail": "CRYPTO_ADDRESS",
"customer": {"customer_id": "650e8400-e29b-41d4-a716-446655440000"},
"asset": "USDC",
"chain": "BASE",
"settlement_destination": {
"type": "NGN_PAYOUT",
"rate_id": "550e8400-e29b-41d4-a716-446655440000",
"destination_bank": {"account_number": "0690000031", "bank_code": "044"},
},
},
).json()
Response 201 Created
{
"object": "funding_account",
"id": "750e8400-e29b-41d4-a716-446655440200",
"type": "TEMPORARY",
"status": "ACTIVE",
"rail": "CRYPTO_ADDRESS",
"customer_id": "650e8400-e29b-41d4-a716-446655440000",
"asset": "USDC",
"chain": "BASE",
"settlement_destination": {
"type": "NGN_PAYOUT",
"destination_currency": "NGN",
"destination_bank": {
"account_number": "0690000031",
"bank_code": "044"
}
},
"instructions": [
{
"type": "CRYPTO_ADDRESS",
"status": "ACTIVE",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f2bd18",
"chain": "BASE"
}
]
}
/v1/deposits and match rows by funding_account_id:curl --request GET \
--url 'https://api.sandbox.daya.co/v1/deposits' \
--header 'X-Api-Key: YOUR_SANDBOX_API_KEY'
Track with Webhooks
Subscribe to webhook events so your system updates without polling.| Event | Use it for |
|---|---|
funding_account.active | Show payment details to the customer |
funding_account.failed | Stop the flow and ask the customer to retry |
deposit.received | Mark incoming funds as detected |
deposit.processing | Settlement has started |
deposit.completed | Settlement reached its destination |
deposit.requires_review | The deposit needs review before continuing |
deposit.failed | The deposit failed |
Next Steps
Funding Accounts
Learn the receive-money model.
Create Funding Account
See every request field.
Deposits API
Reconcile incoming money.