Create a Virtual Account
Create a Virtual Account for a customer. Partner must have virtual_account_provider configured.
Authorizations
Token from POST /auth/token
Headers
Required on POST and PUT requests. Use a unique value per logical mutation attempt, for example a UUID.
Body
Create a Virtual Account: the inbound bank rail plus the destination that receives the converted funds.
Owning customer (cus_… or legacy public id).
Expected inbound bank rail.
V0.10 side-shaped destination: walletOms (OMS wallet) or walletExternal (registered ExternalAccount). The server validates asset/network against the resolved EA.
- US bank account
- IBAN bank account
- Canadian bank account
- OMS wallet
- External wallet (registered)
Closed for Alpha: must be "customer" (additive later — bankMexico / more accountHolders land within 6-12 months).
Closed for Alpha: must be "bankUs".
Optional fiat return destination (v0.11-8): where inbound fiat is sent if
the outbound leg can't be completed. Bank arms only in v1 — bankUs /
bankIban / bankCanada (network swift, USD); walletFiat and
bankCanada with network local (CAD) are rejected with 422
railNotSupported.
- US bank account
- IBAN bank account
- Canadian bank account
- Fiat wallet
When true, OMS absorbs the on-chain gas cost for the destination
delivery. Only true is currently supported.
Optional wire/ACH memo the customer can include.
Partner display label.
Free-form key-value pairs stored on the resource and echoed back on reads.
Response
The request has succeeded and a new resource has been created as a result.
A dedicated bank account number issued for a customer. Inbound fiat deposits are automatically converted and delivered to the configured destination, creating a transaction per deposit.
Virtual Account ID (va_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Resource type discriminator. Always "virtualAccount".
virtualAccount The OMS customer that owns this record (cst_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Current lifecycle status of the virtual account.
pending, active, frozen, closed, deleted, failed, inactiveActionRequired Corridor composite derived from the destination type — fiatAccountToCrypto
for a crypto-wallet destination (inbound fiat auto-converts), or
fiatAccountToFiatAccount for a bank destination (inbound USD forwarded
onward).
cryptoToCrypto, cryptoToCash, cryptoToFiatAccount, cashToCrypto, fiatAccountToCrypto, fiatAccountToFiatAccount Human-readable explanation of the current status.
Expected inbound rail detail.
Null until Erebor provisions the DDA (DEPOSIT_ACCOUNT.OPEN).
V0.10: unified side shape.
- OMS wallet
- External wallet
- Fiat wallet
- US bank account
- IBAN bank account
- Canadian bank account
- Card
- Cash
The configured fiat return destination (v0.11-8) for failed outbound legs; absent/null when none is set (the project return policy applies instead, once T13 wires the waterfall).
- US bank account
- IBAN bank account
- Canadian bank account
- Fiat wallet
Whether OMS absorbs the on-chain gas cost for the destination delivery.
Persisted from the create/update request (currently only true is
accepted).
Wire/ACH memo the customer can include with deposits.
Partner display label.
Free-form key-value pairs supplied at creation or update.
When the virtual account was created.
When the virtual account was last updated.
Set when status = failed; closed enum identifying the failure category.
provisioningTimeout, systemError, ereborRejected, deletePendingTimeout Set when DELETE has been requested but the close webhook has not yet finalized.
Identity (JWT subject claim) of the caller who invoked DELETE.
DDA balance snapshot at the moment the VA flipped to deleted.