Skip to main content
A virtual account gives a customer a dedicated bank account number. When fiat arrives via the assigned rail, OMS automatically creates a fiatToCrypto transaction and delivers USDC to the customer’s linked wallet. No developer action required after setup.
Programmatic virtual account provisioning is not yet available in the OMS API. To be notified when it launches, register your interest.

Register interest

Share your use case and we’ll reach out when programmatic virtual account provisioning is available.
Virtual accounts do not expire. OMS keeps them active until they are paused or removed.

Object

{
  "id": "va_...",
  "object": "virtualAccount",
  "customerId": "cst_...",
  "status": "active",
  "source": {
    "asset": "usd",
    "network": "usBank"
  },
  "bankDetails": {
    "bankName": "OMS Trust Bank",
    "accountNumber": "123456789",
    "routingNumber": "021000021",
    "accountType": "checking",
    "ownerName": "Polygon OMS Payments Inc.",
    "reference": "VA-..."
  },
  "destination": {
    "wallet": { "wallet": "wlt_..." },
    "asset": "usdc",
    "network": "polygon"
  },
  "accountholderName": "oms",
  "createdAt": "2025-01-15T10:33:00Z"
}
Give your customers the bankDetails to display in your UI. Any bank transfer (ACH or wire) to that account number delivers USDC to the linked wallet.

Deposit address vs. virtual account

Both are persistent auto-route configurations. The difference is the rail:
Deposit addressVirtual account
Source typeCrypto (onchain)Fiat (bank rail)
Deposit detailsBlockchain addressBank account number + routing
Auto-creates transactionYesYes
ReusableYesYes

Status lifecycle

StatusMeaning
activeAccepting fiat deposits
pausedTemporarily inactive; deposits are not processed
deletedPermanently removed

Webhook events

OMS fires transaction.fiatToCrypto.completed (or .failed) when a virtual account deposit is processed. Polling is not required.

Provisioning

Virtual accounts are provisioned by Polygon during onboarding and early access. In the sandbox, a simulation endpoint POST /virtual-accounts/{virtualAccountId}/simulate is available for testing inbound ACH, wire, and SWIFT deposits.