- Freelancers in emerging markets receiving USD or EUR payments
- Banking apps issuing multi-currency accounts
- Crypto/DeFi wallets offering named accounts with local payment rails
Named Accounts
Each virtual account is issued in the user’s own name, not a pooled or generic account. Incoming payments clear faster, pass compliance checks more reliably, and feel like a real bank account to the sender. Example: a USD account issued for Jane Doe:| Field | Value |
|---|---|
| Account holder | Jane Doe |
| Account number | xxxxxxx |
| Routing number | xxxxxxx |
| Account type | Checking |
| Bank name | Banking Circle |
How It Works
A user can hold European bank credentials (IBAN) while having all funds auto-ramped into a USD-denominated stablecoin like USDC. No manual conversion required.
Key Concepts
Virtual Accounts are payment routing targets, not holding accounts. They’re designed for efficient payment ingestion and reconciliation.- Payment routing only: Virtual Accounts don’t hold funds. Every received payment is immediately processed per your configured autoramp settings.
- Whitelisted senders only: Only payments from pre-approved fiat addresses are accepted. Add the sender’s address to the whitelist before initiating any transaction.
- Automatic returns: Payments that fail due to incorrect details are automatically returned to the sender.
- Non-whitelisted rejections: Payments from addresses not on the whitelist are rejected and returned to their source.
Quick Start
This tutorial walks through the full flow in Sandbox: create a customer, complete identification, handle signings, register a wallet, create an autoramp, and receive your customer’s virtual bank account credentials. Prerequisites:- A Sandbox API key from the Partner Dashboard
- An Ethereum wallet with signing capability (e.g. ethers.js, viem, or a similar library) — required in Step 5 to sign a proof-of-ownership message
Create a customer
POST /customersCreate a customer record with customer_type set to Person (individual) or Business (company). The customer starts in IdentificationRequired status.API Example
API Example
id from the response. You need it in every subsequent step.Create a Link identification
POST /customers/{id}/identifications/v2Create an identification with type: "Link". Iron returns a URL where your customer completes KYC (individuals) or KYB (businesses) through Iron’s hosted verification interface.API Example
API Example
url to your customer to complete verification. Save the identification id for the next step.Approve the identification (Sandbox only)
POST /sandbox/identification/{id}In Sandbox, you control whether an identification is approved or rejected. Approve it to move the customer forward.API Example
API Example
SigningsRequired. In production, Iron’s compliance team handles this review (typically 24-48 hours).Retrieve and complete signings
GET /customers/{id}/required-signingsRetrieve the documents your customer must sign (e.g. Terms and Conditions), present each document to them, then mark it as signed.API Example
API Example
content_type to "Url" in the signing request.Active.Register a crypto address
POST /addresses/crypto/selfhostedRegister the wallet address where stablecoins will be delivered. This is required for Travel Rule compliance before creating any autoramp.For self-hosted wallets, sign a proof-of-ownership message with the wallet’s private key. See Crypto Addresses for the full signing process and hosted wallet registration.API Example
API Example
The proof message must include today’s date in DD/MM/YYYY format (UTC). You can also register a hosted wallet if the wallet is custodied by another VASP.
Create an autoramp
POST /autorampsCreate an autoramp that converts incoming fiat to stablecoins. The recipient_account.address must match a wallet you registered in the previous step.This example converts EUR to EURC on Ethereum:API Example
API Example
View deposit rails
The autoramp response includes a
Virtual accounts are named. No payment references or special deposit instructions are required. Any fiat sent to this account auto-converts to the destination stablecoin and delivers to the registered wallet.
deposit_rails array with the customer’s virtual bank account credentials. Display these to your customer so they (or third parties) can send fiat payments.| Field | Description |
|---|---|
type | Rail type: Iban (EUR), UsAccount (USD), or SortCode (GBP) |
iban | IBAN number (EUR accounts) |
name | Account holder name, matching the customer’s verified identity |
bic | Bank identifier code |
bank_name | Name of the issuing bank |
bank_country | Country of the issuing bank |
currency | The fiat currency for this rail |
The
deposit_rails array contains the payment details. The legacy deposit_account field is deprecated.Test with a sandbox transaction (Sandbox only)
POST /sandbox/transactionSimulate an incoming fiat payment to verify the full end-to-end flow. Pass the autoramp ID and a deposit amount.API Example
API Example
Monitoring Payments
Webhooks are the recommended way to track incoming payments on a Virtual Account. Without them, you would need to poll the API for transaction updates.Setup
Register a webhook endpoint in the Partner Dashboard under the Webhooks section, or use the Webhooks API. Subscribe to at least thetransaction and transaction_status topics.
Relevant Events
When a payment arrives at a Virtual Account, Iron fires the following events in order:| Event | Type | When it fires |
|---|---|---|
| New transaction | transaction | Fiat payment is received at the vIBAN |
| Status update | transaction_status | Each time the transaction progresses (FundsReviewInProgress, ConversionInProgress, PayoutInProgress, Completed) |
| Autoramp status | register_autoramp_status | Autoramp state changes (e.g. Authorized, Approved) |
transaction event tells you a payment arrived. The transaction_status events tell you where it is in the conversion pipeline.
Example: Transaction Received
When fiat lands on the vIBAN, you receive atransaction event with the customer_id and a transaction id you can use to query details:
Example: Transaction Status Update
As the payment moves through conversion and payout, you receivetransaction_status events. Use transaction_status (not the deprecated status field) for the current state:
transaction_status becomes Completed and transaction_hash contains the on-chain transaction hash.
Transaction Status Reference
transaction_status | Description |
|---|---|
FundsReviewInProgress | Deposit received, undergoing AML/compliance check |
ConversionInProgress | Fiat is being converted to the destination stablecoin |
PayoutInProgress | Stablecoin sent to blockchain, awaiting confirmation |
Completed | Funds delivered to the destination wallet |
Failed | Processing error |
RejectedAml | Rejected by compliance checks |
RejectedFraud | Rejected by fraud review |
RejectedMinAmount | Amount below the minimum threshold |
Your webhook endpoint must return
200 OK to acknowledge receipt. Non-2xx responses trigger retries with exponential backoff. See Webhooks for signature verification and full implementation details.Related Guides
Onboarding Lifecycle
Full customer status flow from creation to activation
Crypto Addresses
Register self-hosted or hosted wallets for Travel Rule compliance
Autoramp
Create and manage persistent conversion rules
Webhooks
Signature verification, payload schemas, and example code
Transaction Status
Status mapping, settlement times, and polling API
Sandbox
Test environment setup and mock transaction APIs

