Overview
Throwaway Auto-Withdraw onramps create short-lived NGN virtual accounts (25-minute TTL) that automatically convert deposits to USDC/USDT and send them to a specified on-chain address.This is the recommended type for one-time transactions with guaranteed exchange rates.
Use Cases
One-time Purchases
User wants to buy a specific amount of USDC/USDT once
Rate Certainty
User needs a guaranteed exchange rate before transferring
Direct Wallet Payment
User wants funds sent directly to their wallet, not merchant balance
Time-sensitive Transactions
Transactions with strict timing requirements
Characteristics
| Property | Value | Description |
|---|---|---|
| TTL | 25 minutes | Virtual account expires after 25 minutes |
| FX Rate | Locked to rate_id | Guaranteed rate within validity window |
| VA Reuse | No | VA number not reused for 365 days |
| Rate Guarantee | Yes | Firm quote honored |
| Settlement | AUTO_WITHDRAW | Automatically sent to specified address |
| Destination | Per-onramp | Can differ for each onramp |
FX Behavior
The onramp locks to a specificrate_id at creation:
Settlement Configuration
Requires destination address and chain:| Chain | Network | Asset Support |
|---|---|---|
BASE | Base mainnet | USDC, USDT |
ETH | Ethereum mainnet | USDC, USDT |
POLYGON | Polygon mainnet | USDC, USDT |
The destination address is not permanently bound to the VA. Each new onramp can specify a different address, even for the same user.
Creating a Throwaway Auto-Withdraw Onramp
Step 1: Get Rate
Step 2: Create Onramp
User Experience
Display to users:Complete Your Payment
Guaranteed rate: 1 USDC = 1545.50 NGN
Transfer NGN to:
| Bank: | Wema Bank |
| Account Number: | 9876543210 |
| Account Name: | Daya - [email protected] |
| Reference: | DAYA-3J5K8N2Q |
⏰ Complete within 25 minutes
Expires at: 15:30:00
USDC will be sent to: 0x742d…5f0bEb
Lifecycle
State changes:- ACTIVE: Can receive deposits (within 25-minute window)
- EXPIRED: TTL elapsed, deposits are flagged
- DISABLED: Manually disabled before expiry
- FLAGGED: Risk or compliance issue
Late Deposit Handling
Deposits arriving after expiry are flagged:| Scenario | Outcome | Status | Reason |
|---|---|---|---|
| Deposit at 15:20 (before expiry) | ✅ Success | SETTLED | Within validity |
| Deposit at 15:35 (after expiry) | ❌ Flagged | FLAGGED | "Deposit after onramp expiry" |
| Deposit at 15:40 (rate expired) | ❌ Flagged | FLAGGED | "Deposit after rate expiry" |
Deposit Flow
Happy path:1
User transfers NGN
User sends NGN to virtual account within 25 minutes
2
Deposit detected
Status:
PENDING_FXWebhook: deposit.created3
FX executed
NGN converted to USDC at locked rateStatus:
PENDING_WITHDRAWAL4
Risk check
Risk engine evaluates withdrawal (address screening, limits)
5
On-chain broadcast
USDC transaction broadcast to specified chain (e.g., BASE)
6
Settlement
Transaction confirms on-chainStatus:
SETTLEDWebhook: deposit.settledWhen to Use
- ✅ Use Throwaway Auto-Withdraw When
- ❌ Avoid When
- User needs guaranteed exchange rate
- One-time transaction
- User wants funds directly in their wallet
- Transaction has tight timing
- Minimal on-chain settlement delay acceptable
Comparison with Other Types
| Feature | B1: Auto-Withdraw | B2: Merchant Balance | A: Permanent |
|---|---|---|---|
| Expiry | 25 minutes | 25 minutes | Never |
| FX Rate | Locked | Locked | Current rate |
| Settlement | On-chain | Merchant balance | On-chain |
| Destination | Per-onramp | N/A | Fixed |
| Best for | One-time, direct payment | Aggregation | Recurring |
Best Practices
Always show countdown timer
Always show countdown timer
Display remaining time prominently. Users must understand the urgency.
Validate destination address
Validate destination address
Verify the address is valid for the specified chain before creating the onramp.
Request fresh rate each time
Request fresh rate each time
Don’t reuse old
rate_id values. Request a new rate immediately before onramp creation.Handle expired onramp errors
Handle expired onramp errors
If user returns after expiry, create a new onramp with a fresh rate.
Show tx_hash to users
Show tx_hash to users
Display the on-chain transaction hash so users can track their funds on block explorers.
Limits
Subject to standard limits:- Per-onramp: Max $1,000 per deposit
- Per-merchant daily: Max $10,000
- System-wide daily: Max $100,000
Error Scenarios
- Rate Expired
- Invalid Address
- Limit Exceeded
Error:Fix: Request a fresh rate via
GET /v1/rates and retry.