What is an Onramp?
An onramp is a deposit configuration that defines:- How deposits are received (virtual account details)
- When deposits are valid (TTL and expiry)
- What rate is used for FX conversion
- Where converted funds are sent (settlement mode)
Onramp Properties
Every onramp has the following properties:| Property | Description | Example |
|---|---|---|
onramp_id | Unique identifier | onramp_3j5k8n2q |
merchant_id | Owner (inferred from API key) | merch_abc123 |
type | PERMANENT or THROWAWAY | THROWAWAY |
status | Current state | ACTIVE, EXPIRED, DISABLED, FLAGGED |
user.email | End-user email | [email protected] |
rate_id | Associated FX quote | rate_8x7k2mq9p |
payment_reference | Unique payment identifier | DAYA-3J5K8N2Q |
virtual_account | NGN bank account details | See below |
expires_at | When onramp becomes invalid | 2026-01-14T15:30:00Z |
settlement | Where funds go after conversion | See Settlement Modes |
created_at | Creation timestamp | 2026-01-14T15:05:12Z |
Virtual Account Object
Onramp Types
Daya supports two onramp types:- Permanent VA
- Throwaway VA
Long-lived virtual account for recurring deposits from the same user.Characteristics:
- No expiry (remains
ACTIVEindefinitely) - Uses current FX rate at deposit time (not locked to
rate_id) - Typically tied to one user and one destination address
- Best for repeat customers
Settlement Modes
AUTO_WITHDRAW
Automatically send USDC/USDT to specified on-chain address after FX conversion.Requires:
destination_addressasset(USDC or USDT)chain(BASE, Ethereum, etc.)
MERCHANT_BALANCE
Credit merchant’s internal Daya USD balance. Withdraw later via separate API.Requires:
- No destination address needed
Settlement Configuration
Auto-Withdraw Example:Settlement configuration is immutable. To change destination or mode, create a new onramp.
Onramp Statuses
| Status | Description | Can Receive Deposits? |
|---|---|---|
ACTIVE | Onramp is operational | ✅ Yes (if within TTL) |
EXPIRED | TTL elapsed (throwaway only) | ❌ No (deposits flagged) |
DISABLED | Manually disabled by operations | ❌ No |
FLAGGED | Risk or compliance review triggered | ❌ No |
Status Transitions
Creating Onramps
UsePOST /v1/onramp to create an onramp:
Rate Binding Semantics
- Throwaway Onramps
- Permanent Onramps
Locked to
rate_id at creation:- Merchant requests
rate_idviaGET /v1/rates - Merchant creates onramp with that
rate_id - Deposit arrives before
rate_id.expires_at→ FX uses that rate - Deposit arrives after expiry →
FLAGGED, no automatic FX
Common Patterns
One-time purchase (Throwaway)
One-time purchase (Throwaway)
User buys $10 USDC once:
- Request
GET /v1/rates→ getrate_id - Create throwaway onramp with auto-withdraw
- User transfers NGN within 25 minutes
- USDC sent to user’s wallet
- Onramp expires (cannot be reused)
Recurring deposits (Permanent)
Recurring deposits (Permanent)
User deposits monthly salary:
- Create permanent onramp once
- User saves virtual account details
- User transfers NGN monthly
- Each deposit converts at current rate
- USDC sent to same destination address each time
Merchant aggregation (Merchant Balance)
Merchant aggregation (Merchant Balance)
App processes 1000 small deposits:
- Create throwaway onramps with
MERCHANT_BALANCE - Users transfer NGN
- All deposits credited to merchant’s internal USD balance
- Merchant withdraws in bulk to reduce on-chain fees
Best Practices
1
Always check rate_id expiry
Before creating throwaway onramps, ensure
rate_id.expires_at is at least 25 minutes in the future.2
Use permanent VAs for repeat users
If a user deposits regularly, create one permanent onramp instead of multiple throwaway onramps.
3
Store onramp_id with user records
Link
onramp_id to your user’s profile for easy lookup and support.4
Handle expiry gracefully
Educate users that throwaway onramps expire in 25 minutes. Show countdown timers.
5
Monitor for FLAGGED status
Set up webhooks to detect
onramp.flagged events and alert your operations team.