Skip to main content
POST
Changed in this version.

Authorizations

Authorization
string
header
required

Access token from POST /auth (the data.access_token value).

x-api-key
string
header
required

API key issued by Kira. Required on every request, including /auth.

Headers

X-Api-Version
string

Optional. The date-versioned API version to apply for this request (e.g. 2026-04-14). When sent it always wins, even over your pinned account default. When omitted, the API uses your account's pinned version if set, otherwise a baseline default.

Example:

"2026-04-14"

Idempotency-Key
string<uuid>
required
Example:

"{{idempotency_key}}"

Body

application/json

Request body for POST /v1/virtual-accounts. bank is required for US_BANK unless provider is supplied. destination is required for crypto mode and must be omitted for mode: "fiat". A Idempotency-Key (UUID) request header is also required.

user_id
string<uuid>
required

A user with status: VERIFIED, eligible for the product.

type
enum<string>
required

Virtual-account product. The US_BANK path is the documented golden path.

Available options:
US_BANK
bank
enum<string>

Selects the provider/rail for US_BANK. Recommended default: the international/crypto railslovak_savings_bank (sandbox) / portage (production). Environment-scoped: sandbox accepts slovak_savings_bank, austin_capital_trust; production accepts portage, austin_capital_trust. Required for US_BANK unless provider is given.

Available options:
portage,
slovak_savings_bank,
austin_capital_trust
provider
enum<string>

Alias that selects a bank (actaustin_capital_trust). Provide this instead of bank to satisfy the bank requirement for US_BANK.

Available options:
act
mode
enum<string>

Fixed at creation and cannot be changed. fiat must omit destination; crypto requires it.

Available options:
fiat,
crypto
destination
object

Crypto payout target. Omit entirely for fiat mode.

description
string

Human-readable label, echoed back on create and on GET /v1/virtual-accounts/{id}.

metadata
object

Stripe-style key/value map: up to 50 keys; key ≤ 40 chars (no [ or ]); value ≤ 500 chars.

markup
object

Optional per-VA fee-markup overrides (decimal strings).

Response

Created. Returns the new virtual account.

Response for POST /v1/virtual-accounts (HTTP 201).

id
string<uuid>
required
status
string
required

KYB-mapped status at version 2026-04-14: typically approved, rfi, or declined. approved does not mean funds-ready — confirm readiness via account_number and the virtual_account.activated webhook.

type
enum<string>
required

Virtual-account product type — US_BANK for the US virtual accounts documented in this reference.

Available options:
US_BANK
mode
enum<string>
required

Funding mode echoed back. crypto accounts return a populated destination (wallet address); fiat accounts return destination: null.

Available options:
fiat,
crypto
created_at
string
required

ISO 8601.

bank
enum<string>

Present for US_BANK; the effective bank (after any provider alias is resolved).

Available options:
portage,
slovak_savings_bank,
austin_capital_trust
destination
object | null

Null for fiat virtual accounts.

source_deposit_instructions
object | null

Provider deposit details; null while the VA is still activating.

description
string

Present only when supplied on create.

markup
object

Present only when a non-empty markup was supplied on create.

metadata
object

Your own key/value metadata, echoed back verbatim. {test_key: "test_value"} sent on create was returned unchanged.