> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polygon.technology/llms.txt
> Use this file to discover all available pages before exploring further.

# Virtual accounts

> Dedicated bank account numbers that auto-convert incoming fiat to USDC.

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.

<Note>
  Programmatic virtual account provisioning is not yet available in the OMS API. To be notified when it launches, register your interest.

  <Card title="Register interest" icon="envelope" href="https://info.polygon.technology/get-early-access?utm_source=docs&utm_medium=card&utm_campaign=oms_access">
    Share your use case and we'll reach out when programmatic virtual account provisioning is available.
  </Card>
</Note>

Virtual accounts do not expire. OMS keeps them active until they are paused or removed.

## Object

```json theme={null}
{
  "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 address    | Virtual account               |
| ------------------------ | ------------------ | ----------------------------- |
| Source type              | Crypto (onchain)   | Fiat (bank rail)              |
| Deposit details          | Blockchain address | Bank account number + routing |
| Auto-creates transaction | Yes                | Yes                           |
| Reusable                 | Yes                | Yes                           |

## Status lifecycle

| Status    | Meaning                                          |
| --------- | ------------------------------------------------ |
| `active`  | Accepting fiat deposits                          |
| `paused`  | Temporarily inactive; deposits are not processed |
| `deleted` | Permanently 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.

## Related

* [Virtual accounts guide](/payments/guides/virtual-accounts): full walkthrough with request/response and webhook handling
* [Deposit addresses](/payments/deposit-addresses): the crypto equivalent for onchain deposits
