Skip to main content
POST
Create a Virtual Account

Authorizations

Authorization
string
header
required

Token from POST /auth/token

Headers

Idempotency-Key
string
required

Required on POST and PUT requests. Use a unique value per logical mutation attempt, for example a UUID.

Body

application/json

Create a Virtual Account: the inbound bank rail plus the destination that receives the converted funds.

customerId
string
required

Owning customer (cus_… or legacy public id).

source
object
required

Expected inbound bank rail.

destination
US bank account · object
required

V0.10 side-shaped destination: walletOms (OMS wallet) or walletExternal (registered ExternalAccount). The server validates asset/network against the resolved EA.

accountHolder
string
required

Closed for Alpha: must be "customer" (additive later — bankMexico / more accountHolders land within 6-12 months).

type
string
required

Closed for Alpha: must be "bankUs".

returnDestination
US bank account · object

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.

sponsorGas
boolean
default:true

When true, OMS absorbs the on-chain gas cost for the destination delivery. Only true is currently supported.

bankMemo
string

Optional wire/ACH memo the customer can include.

label
string

Partner display label.

metadata
object

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.

id
string

Virtual Account ID (va_ prefix).

Pattern: ^[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})$
object
enum<string>

Resource type discriminator. Always "virtualAccount".

Available options:
virtualAccount
customerId
string

The OMS customer that owns this record (cst_ prefix).

Pattern: ^[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})$
status
enum<string>

Current lifecycle status of the virtual account.

Available options:
pending,
active,
frozen,
closed,
deleted,
failed,
inactiveActionRequired
sourceToDestination
enum<string>

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).

Available options:
cryptoToCrypto,
cryptoToCash,
cryptoToFiatAccount,
cashToCrypto,
fiatAccountToCrypto,
fiatAccountToFiatAccount
statusReason
string

Human-readable explanation of the current status.

source
object

Expected inbound rail detail.

depositInstructions
object

Null until Erebor provisions the DDA (DEPOSIT_ACCOUNT.OPEN).

destination
OMS wallet · object

V0.10: unified side shape.

returnDestination
US bank account · object

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).

sponsorGas
boolean

Whether OMS absorbs the on-chain gas cost for the destination delivery. Persisted from the create/update request (currently only true is accepted).

bankMemo
string

Wire/ACH memo the customer can include with deposits.

label
string

Partner display label.

metadata
object

Free-form key-value pairs supplied at creation or update.

createdAt
string<date-time>

When the virtual account was created.

updatedAt
string<date-time>

When the virtual account was last updated.

failureReason
enum<string>

Set when status = failed; closed enum identifying the failure category.

Available options:
provisioningTimeout,
systemError,
ereborRejected,
deletePendingTimeout
deletionRequestedAt
string<date-time>

Set when DELETE has been requested but the close webhook has not yet finalized.

deletionRequestedBy
string

Identity (JWT subject claim) of the caller who invoked DELETE.

finalBalance
object

DDA balance snapshot at the moment the VA flipped to deleted.