Skip to main content

Overview

Permanent Virtual Accounts are long-lived NGN bank accounts that remain active indefinitely. They’re ideal for users who deposit regularly.
This onramp type is planned for future release. The current v0.1 focuses on throwaway virtual accounts.

Use Cases

Recurring Payments

Users who deposit monthly (e.g., salary, subscriptions)

Known Customers

Established users with consistent deposit patterns

Reduced Friction

No need to generate new VAs for each transaction

Long-term Relationships

Users who value convenience over transaction-specific rates

Characteristics

PropertyValueDescription
TTLNone (permanent)Virtual account never expires
FX RateCurrent rate at settlementUses latest rate, not locked to rate_id
VA ReuseYesSame VA used for all deposits
Rate GuaranteeNoSubject to current market rate
SettlementAUTO_WITHDRAW onlyPermanently bound to one destination address

FX Behavior

Unlike throwaway onramps, permanent VAs do not lock to a specific rate_id:
Each deposit executes at the current market rate at settlement time. Users do not get a firm quote.

Settlement Configuration

Permanent VAs require AUTO_WITHDRAW mode with a fixed destination address:
{
  "settlement": {
    "mode": "AUTO_WITHDRAW",
    "asset": "USDC",
    "chain": "BASE",
    "destination_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
  }
}
The destination address is immutable once the onramp is created.
If a user needs to change their destination address, you must create a new permanent onramp.

Creating a Permanent VA Onramp

curl --request POST \
  --url https://api.daya.xyz/v1/onramp \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "type": "PERMANENT",
    "user": {
      "email": "[email protected]"
    },
    "rate_id": "rate_8x7k2mq9p",
    "settlement": {
      "mode": "AUTO_WITHDRAW",
      "asset": "USDC",
      "chain": "BASE",
      "destination_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
    }
  }'
Response:
{
  "onramp_id": "onramp_5m8k3n2q",
  "type": "PERMANENT",
  "status": "ACTIVE",
  "rate_id": "rate_8x7k2mq9p",
  "payment_reference": "DAYA-5M8K3N2Q",
  "virtual_account": {
    "account_number": "1234567890",
    "account_name": "Daya - [email protected]",
    "bank_name": "Wema Bank",
    "bank_code": "035"
  },
  "expires_at": null,
  "settlement": {
    "mode": "AUTO_WITHDRAW",
    "asset": "USDC",
    "chain": "BASE",
    "destination_address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"
  },
  "created_at": "2026-01-14T15:05:12Z"
}
expires_at is null for permanent VAs, indicating no expiry.

User Experience

For users:
  1. One-time setup: Merchant creates permanent onramp
  2. Save details: User saves the virtual account details
  3. Recurring deposits: User transfers NGN anytime (no expiry)
  4. Automatic settlement: USDC sent to their wallet each time
Display to users:

Your Daya Account

Transfer NGN to this account anytime:

Bank:Wema Bank
Account Number:1234567890
Account Name:Daya - [email protected]

✓ This account never expires

Lifecycle

State changes:
  • ACTIVE: Can receive deposits indefinitely
  • DISABLED: Manually disabled by merchant or operations
  • FLAGGED: Risk or compliance issue detected
Permanent VAs do not transition to EXPIRED state because they have no TTL.

Late Deposit Handling

Since permanent VAs never expire, there’s no concept of “late deposits” due to expiry. However, deposits can still be flagged for:
  • Limits exceeded
  • Risk triggers
  • Suspicious activity

When to Use

  • User deposits regularly (weekly, monthly)
  • User wants to save VA details for future use
  • Rate volatility is acceptable
  • Reducing onramp creation overhead
  • Building trust with long-term users

Comparison: Permanent vs Throwaway

FeaturePermanent VAThrowaway VA
ExpiryNever25 minutes
FX RateCurrent rateLocked to rate_id
VA ReuseYesNo (365-day cooldown)
Rate GuaranteeNoYes (within validity)
Use CaseRecurring depositsOne-time transactions
DestinationFixedPer-onramp

Best Practices

Create one permanent VA per user per destination address. Don’t create multiple for the same user.
Clearly communicate that rates may change between deposits.
Link onramp_id to user profiles for easy lookup and reuse.
Set up alerts for deposit.flagged events on permanent VAs.
When a user closes their account, disable their permanent VA to prevent accidental deposits.

Limits

Permanent VAs are subject to the same limits as throwaway onramps:
  • Per-onramp limit: $1,000 per deposit
  • Per-merchant daily limit: $10,000
  • System-wide limit: $100,000/day
See Limits & Risk for details.

Disabling Permanent VAs

To disable a permanent VA, contact support or use the admin API (if available). When to disable:
  • User account closed
  • Suspicious activity detected
  • Compliance requirement
  • User requested

Next Steps