---
title: "Create a Virtual Account"
method: POST
path: "/v2/virtual-account"
---

# Create a Virtual Account

`POST /v2/virtual-account`

Create a new virtual account that converts incoming fiat deposits to crypto.

## Request body

- CreateVirtualAccountRequestDto
  - `destinationCurrency` 'usdc' | 'usdt' | 'eurc', required — The crypto currency deposited funds are converted into. See [Supported Rails & Currencies](/concepts/transfers/supported-rails).
  - `network` 'arbitrum' | 'avalanche' | 'base' | 'ethereum' | 'polygon' | 'sol' | 'tron', required — The blockchain network the destination wallet is on. See [Supported Rails & Currencies](/concepts/transfers/supported-rails).
  - `walletAddress` string, required — The on-chain wallet address where converted crypto is sent. Must be valid for the selected network.
  - `integratorFeeBps` string — Integrator fee in basis points (1 bps = 0.01%). Defaults to 0 if not provided.
  - `customerId` string, required — The customer who will own the virtual account.
  - `sourceCurrency` 'usd' | 'eur', required — The fiat currency the virtual account accepts for deposits.

## Response `201`

- VirtualAccountResponseDto
  - `id` string, required — Unique identifier for the virtual account.
  - `customer` string — The customer ID who owns the virtual account.
  - `active` boolean, required — Whether the virtual account is currently active and accepting deposits.
  - `depositInstructions` object, required — Bank account details that depositors should use to send fiat funds into the virtual account.
    - `currency` 'usd' | 'eur', required — The fiat currency accepted for deposits into the virtual account.
    - `bankName` string, required — Name of the bank holding the virtual account.
    - `bankAddress` string, required — Address of the bank holding the virtual account.
    - `bankAccountNumber` string, nullable, required — Bank account number for deposits (USD accounts). Null for EUR accounts.
    - `bankRoutingNumber` string, nullable, required — Bank routing number for deposits (USD accounts). Null for EUR accounts.
    - `bankBeneficiaryName` string, required — Name of the beneficiary on the account.
    - `bankBeneficiaryAddress` string, required — Address of the beneficiary on the account.
    - `iban` string, nullable, required — IBAN for deposits (EUR accounts). Null for USD accounts.
    - `bic` string, nullable, required — BIC/SWIFT code for deposits (EUR accounts). Null for USD accounts.
  - `destination` object, required — The crypto destination where converted funds are sent after deposit.
    - `currency` 'usdc' | 'usdt' | 'eurc', required — The crypto currency deposited funds are converted into.
    - `walletAddress` string, required — The on-chain wallet address where converted crypto is sent.
    - `network` 'arbitrum' | 'avalanche' | 'base' | 'ethereum' | 'polygon' | 'sol' | 'tron', required — The blockchain network the destination wallet is on.
  - `fee` object — Fee breakdown for the virtual account, including integrator and platform fees.
    - `totalBpsRate` string, required — Total fee rate in basis points (integrator + platform). 1 bps = 0.01%.
    - `integratorFee` object, required — Fee charged by the integrator.
      - `bpsRate` string, required — Integrator fee rate in basis points (1 bps = 0.01%).
    - `platformFee` object, required — Fee charged by the platform.
      - `bpsRate` string, required — Platform fee rate in basis points (1 bps = 0.01%).
  - `created` string, required — Timestamp when the virtual account was created (ISO 8601).
  - `updated` string, required — Timestamp when the virtual account was last updated (ISO 8601).

## Other responses

- `400` — Bad Request
- `404` — Not Found
- `422` — Unprocessable Entity - Validation Error

---

[API](https://skmtc.net/spherepay/apis/docs-spherepay-co.md) · [All operations](https://skmtc.net/spherepay/apis/docs-spherepay-co/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/spherepay/docs-spherepay-co/versions/4f3f5484aed3/schema)
