How Virtual Accounts Work
Virtual accounts enable fiat-to-stablecoin onramps through a simple three-step process:1
Create the account
Generate a unique bank account number for the user.
2
Deposits fiat
User receives funds via ACH, wire, or RTP.
3
Automatic conversion
Fiat is automatically converted to stablecoins and delivered to the user’s
wallet.
Creating Virtual Accounts
Create a virtual account using the Create Virtual Account endpoint. Request:Fiat currency to accept. Currently only
usd is supported.Stablecoin to receive after conversion. Options:
usdc, usdtBlockchain where stablecoins will be sent. Options:
POLYGON, ETHEREUM,
BASEOptional. If provided, stablecoins are sent to this external wallet instead of
the user’s HIFI wallet.
USD Only: Virtual accounts currently support USD deposits only. For other
currencies, use the Onramp API.
Unique virtual account ID. Save this for managing the account and
monitoring deposits.
Account status.
activated means ready to receive deposits.Source configuration for the virtual account.
Destination configuration for converted stablecoins.
Most Important: Bank account details for users to send deposits. Share
these instructions with your users.
Payment Rails
Virtual accounts support multiple payment methods to accommodate different use cases:| Payment Rail | Speed | Cost | Use Case |
|---|---|---|---|
| ACH | 1-3 business days | Low | Domestic US bank transfers |
| Wire | Same day | Medium | Larger amounts, faster processing |
| RTP | Real-time | Medium | Instant transfers |
Deposit Processing
When a deposit is detected, HIFI automatically:- Validates the deposit - Confirms amount and sender details
- Converts to stablecoin - Exchanges fiat for stablecoins at current rates
- Sends to wallet - Delivers stablecoins to the configured destination
- Triggers webhooks - Sends
ONRAMP.CREATEandONRAMP.UPDATEevents
- ACH: 1-3 business days for funds to clear, then instant conversion
- Wire: Same-day processing, then instant conversion
- RTP: Real-time processing and instant conversion
Webhook Notifications: Subscribe to
ONRAMP.CREATE and ONRAMP.UPDATE
events to track deposits in real-time. See Webhooks for
setup instructions.Tracking Onramps
When deposits arrive at a virtual account, HIFI creates an onramp transaction to handle the conversion. You can see which virtual account was used by checking the onramp’svirtualAccountId field.
List onramps for a user:
The virtual account ID that received the deposit. If
null, this onramp was
created through a different method (not via virtual account).Blockchain transaction hash (available when status is COMPLETED)
Managing Virtual Accounts
Update Configuration
Change the destination chain or currency for an existing virtual account using the Update Virtual Account endpoint. Request:Updating the configuration only affects future deposits. Existing pending
deposits will complete with the original configuration.
Deactivate Account
Temporarily disable a virtual account to prevent new deposits using the Deactivate Virtual Account endpoint. Request:- New deposits are rejected
- Existing pending deposits continue processing
- Account can be reactivated later
Key Concepts
One Account Per Configuration
One Account Per Configuration
Each virtual account is tied to a specific conversion pair (source currency + destination currency + destination chain). To support multiple conversion options, create separate virtual accounts.Example: If you need both USD→USDC on Polygon and USD→USDT on Ethereum, create two virtual accounts.
Beneficiary Name Matching
Beneficiary Name Matching
The beneficiary name on the virtual account must match the user’s KYC name.
Deposits from accounts with mismatched names may be rejected for compliance
reasons.
USDT Fees
USDT Fees
USDT conversions incur an additional 0.1% exchange fee beyond standard
conversion rates. This fee appears on your monthly invoice.
External Wallets
External Wallets
By default, stablecoins are sent to the user’s HIFI wallet. Use the
externalWalletId parameter to send to an external wallet address instead. The external wallet must be pre-registered via the External Wallets API.Registration Required: Unlike regular wallet transfers (which can send directly to any address), virtual accounts require external wallets to be registered first when using the
externalWalletId parameter. If you prefer not to register, create a standard virtual account without externalWalletId and then transfer funds to the external wallet using the Wallet Transfer API.Sandbox Testing
In sandbox, simulate deposits without real bank transfers using the Simulate Deposit endpoint. Request:Sandbox Processing Times: Simulated deposits in sandbox are processed
automatically after a delay: - Wire: ~5 minutes - ACH: ~8 minutes In
production, actual processing times depend on the payment rail used (ACH: 1-3
business days, Wire: same day, RTP: real-time).
Sample Code
Get deposit instructions
1
Create virtual account
2
Extract and display instructions
Extract the
depositInstructions object from the response and present the relevant bank details to your user. Example:ACH Deposit InstructionsBank Name: Cross River Bank
Routing Number: 021214891
Account Number: 344176915009
Beneficiary: John DoeWire Deposit InstructionsBank Name: Cross River Bank
Routing Number: 021214891
Account Number: 344176915009
Beneficiary: John Doe
Bank Address: 885 Teaneck Road, Teaneck, NJ 076663
Track onramp transactions
List onramps to see which virtual account was used and track conversion status:Or subscribe to
ONRAMP.CREATE and ONRAMP.UPDATE webhooks for real-time notifications.Send to external wallet
Option 1: Direct to external wallet Use anexternalWalletId instead of destinationChain when creating a virtual account. Funds will be deposited directly into the specified wallet address.
1
Create virtual account
Create a standard virtual account without
externalWalletId. Funds will arrive in the user’s HIFI wallet first.2
Send to external wallet
Send funds to any external address using the Wallet Transfer API:
Getting Help
- 📧 Email: support@hifibridge.com
- 💬 Slack: Message us in our shared Slack channel
Related Resources
- Quickstart Guide - Step-by-step tutorial including virtual account setup
- Users - Understand user creation and KYC requirements
- Onramps - Alternative onramp methods for non-USD currencies
- Webhooks - Subscribe to account and onramp events
- API Reference - Complete endpoint documentation