---
title: "Create a virtual bank account fixed route"
method: POST
path: "/v1/fixed-routes/virtual-bank-accounts"
tags: ["fixed-routes"]
---

# Create a virtual bank account fixed route

`POST /v1/fixed-routes/virtual-bank-accounts`

Creates a virtual bank account that automatically sweeps fiat deposits. Route type (FIAT_TO_CRYPTO or FIAT_TO_CRYPTO_TO_FIAT) is inferred from the sweep target account type. Use the Idempotency-Key header to safely retry on network failure.

## Headers

- `X-API-Key` string
- `Idempotency-Key` string

## Request body

- CreateVbaFixedRouteDto
  - `correspondentBankName` string — Correspondent/intermediary bank name
  - `correspondentBankSwiftCode` string — Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)
  - `correspondentAccountNumber` string — Correspondent/intermediary account number
  - `customerId` string, required — Customer ID
  - `braleAutomationId` string — Optional. Existing Brale automation id (admin / advanced). When omitted, the API creates a wire onramp automation after registering the settlement wallet on Brale.
  - `onrampSettlementInwAccountId` string — Optional. TRANSACTION Infinite Wallet for on-chain settlement (Ethereum). When omitted, one is created or reused for the customer.
  - `onrampPayoutTreasuryInwAccountId` string — Optional. TRANSACTION Infinite Wallet on the receive chain for post-settlement payout when the receive chain is not Ethereum. When omitted, one is created or reused.
  - `sweepTargetAccountId` string, required — Sweep / destination account id. For FIAT_TO_CRYPTO: a crypto wallet, or an ACTIVE provider-balance account (USDT on Ethereum) when the organization is enabled for provider-balance onramps (developer fees are not supported on that target).
  - `sourceRail` 'ACH' | 'ACH_SAME_DAY' | 'WIRE' | 'FED_NOW' | 'RTP' | 'EREBOR' | 'EREBOR_RAIL' | 'BALANCE' | 'SWIFT' | 'SEPA' | 'SEPA_INSTANT' | 'TIPS' | 'FASTER_PAYMENTS' | 'BACS' | 'CHAPS' | 'ELIXIR' | 'NICS' | 'EFT' | 'INTERAC' | 'NPP' | 'BECS' | 'UPI' | 'IMPS' | 'IMPS_WITH_FIRC' | 'NEFT' | 'RTGS' | 'BI_FAST' | 'ARTAJASA' | 'PIX' | 'TED' | 'TEF' | 'SPEI' | 'COELSA' | 'SINPE' | 'CIPS' | 'CFXPS' | 'CHATS' | 'ZENGIN' | 'KFTC' | 'FAST_SG' | 'MEPS' | 'DUITNOW' | 'PROMPTPAY' | 'INSTAPAY' | 'PESONET' | 'NAPAS' | 'BEFTN' | 'SLIPS' | 'ZAHAV' | 'GHIPSS' | 'NIBSS' | 'PESALINK' | 'RTC_ZA' | 'TZS_RTGS' | 'EGP_ACH' | 'JOD_ACH' | 'NPSS' | 'MADA' | 'QPS' | 'DOP_ACH' | 'GTQ_ACH' | 'HNL_ACH' | 'PEN_ACH' | 'JMD_ACH' | 'USD_ACH_SV' | 'USD_ACH_EC' | 'CLP_TEF' | 'PSE' | 'COP_ACH' | 'BOB_RTGS' | 'PYG_ACH' | 'CERTIS' | 'DKK_TIPS' | 'SENT' | 'NKS' | 'BANKGIROT' | 'HKD_FPS' | 'IBFT' | 'TRY_FAST' | 'ETHEREUM' | 'BASE' | 'POLYGON' | 'SOLANA' | 'TRON' | 'BITCOIN' | 'ARBITRUM' — Source rail - payment rail for incoming deposits
  - `sourceRails` string[] — Optional list of inbound rails for a USD bank pay-in deposit account. Omit to accept ACH and wire. SWIFT is included only when listed. When sourceRail is sent instead, it is treated as a one-element list. Crypto deposit routes still use a single sourceRail.
  - `sourceCurrency` string — Source currency for deposits
  - `destinationRail` 'ACH' | 'ACH_SAME_DAY' | 'WIRE' | 'FED_NOW' | 'RTP' | 'EREBOR' | 'EREBOR_RAIL' | 'BALANCE' | 'SWIFT' | 'SEPA' | 'SEPA_INSTANT' | 'TIPS' | 'FASTER_PAYMENTS' | 'BACS' | 'CHAPS' | 'ELIXIR' | 'NICS' | 'EFT' | 'INTERAC' | 'NPP' | 'BECS' | 'UPI' | 'IMPS' | 'IMPS_WITH_FIRC' | 'NEFT' | 'RTGS' | 'BI_FAST' | 'ARTAJASA' | 'PIX' | 'TED' | 'TEF' | 'SPEI' | 'COELSA' | 'SINPE' | 'CIPS' | 'CFXPS' | 'CHATS' | 'ZENGIN' | 'KFTC' | 'FAST_SG' | 'MEPS' | 'DUITNOW' | 'PROMPTPAY' | 'INSTAPAY' | 'PESONET' | 'NAPAS' | 'BEFTN' | 'SLIPS' | 'ZAHAV' | 'GHIPSS' | 'NIBSS' | 'PESALINK' | 'RTC_ZA' | 'TZS_RTGS' | 'EGP_ACH' | 'JOD_ACH' | 'NPSS' | 'MADA' | 'QPS' | 'DOP_ACH' | 'GTQ_ACH' | 'HNL_ACH' | 'PEN_ACH' | 'JMD_ACH' | 'USD_ACH_SV' | 'USD_ACH_EC' | 'CLP_TEF' | 'PSE' | 'COP_ACH' | 'BOB_RTGS' | 'PYG_ACH' | 'CERTIS' | 'DKK_TIPS' | 'SENT' | 'NKS' | 'BANKGIROT' | 'HKD_FPS' | 'IBFT' | 'TRY_FAST' | 'ETHEREUM' | 'BASE' | 'POLYGON' | 'SOLANA' | 'TRON' | 'BITCOIN' | 'ARBITRUM' — Destination rail - chain/network for crypto sweep
  - `destinationCurrency` string — Destination currency to convert to
  - `developerFeeFixed` string — Fixed fee in minor units of source currency
  - `developerFeePercent` number — Variable fee as decimal percentage (0.01 = 1%)
  - `externalReference` string — Client-provided external reference
  - `metadata` AccountMetadataDto
    - `nickname` string — Account nickname
    - `purpose` string — Account purpose
    - `tags` string[] — Account tags
  - `allowedSenderBanks` AllowedSenderBankDto[] — Allowed sender banks for deposits into this route. When set, deposits from sender banks not on this list are held for review instead of being processed automatically. Each entry must include at least one identifier.
    - `bankName` string — Sender bank name. Matched ignoring case, whitespace, and punctuation.
    - `routingNumber` string — Sender bank routing number (e.g. US ABA). Matched on digits only.
    - `swiftBic` string — Sender bank SWIFT/BIC code (8 or 11 characters)

## Response `201`

Fixed route created successfully

- FixedRouteResponseDto
  - `id` string, required — Fixed route ID (same as source account ID)
  - `customerId` string, required
  - `type` 'FIAT_TO_CRYPTO' | 'CRYPTO_TO_FIAT' | 'CRYPTO_TO_CRYPTO' | 'FIAT_TO_CRYPTO_TO_FIAT', required
  - `status` string, required
  - `enabled` boolean, required — Whether the fixed route is enabled. When false, deposits land but do not auto-sweep.
  - `metadata` AccountMetadataDto
    - `nickname` string — Account nickname
    - `purpose` string — Account purpose
    - `tags` string[] — Account tags
  - `sourceAccount` SourceAccountDto, required
    - `id` string, required
    - `type` 'VIRTUAL_BANK' | 'VIRTUAL_WALLET' | 'INFINITE_BANK' | 'INFINITE_WALLET' | 'EXTERNAL_BANK' | 'EXTERNAL_WALLET' | 'EXTERNAL_PROXY' | 'PROVIDER_BALANCE', required
    - `metadata` AccountMetadataDto
      - `nickname` string — Account nickname
      - `purpose` string — Account purpose
      - `tags` string[] — Account tags
    - `depositInstructions` BankDepositInstructions
      - `bankName` string
      - `bankAddress` BankAddressDto
        - `addressLine1` string — Address line 1 (optional for bank addresses)
        - `addressLine2` string — Address line 2 (apartment, suite, etc.)
        - `city` string — City
        - `state` string — State / Province
        - `postalCode` string — Postal code / ZIP code (optional for bank addresses)
        - `country` string — Country code (ISO 3166-2)
      - `accountNumber` string, required
      - `routingNumber` string
      - `iban` string
      - `swiftBic` string
      - `bankCountryCode` string
      - `reference` string
      - `depositMessage` string
      - `beneficiaryName` string
      - `beneficiaryAddress` BankAddressDto
        - `addressLine1` string — Address line 1 (optional for bank addresses)
        - `addressLine2` string — Address line 2 (apartment, suite, etc.)
        - `city` string — City
        - `state` string — State / Province
        - `postalCode` string — Postal code / ZIP code (optional for bank addresses)
        - `country` string — Country code (ISO 3166-2)
    - `sourceCurrency` string
    - `sourceRail` string
    - `sourceRails` string[] — Inbound rails accepted by this deposit account. Omitted when the route stores a single rail only.
    - `walletAddress` string
    - `addressType` string
    - `chains` string[]
    - `walletType` 'TREASURY' | 'TRANSACTION' | 'VIRTUAL' — Infinite wallet subtype when source is INFINITE_WALLET (e.g. VIRTUAL for dedicated offramp deposit wallets)
  - `destinationCurrency` string
  - `destinationRail` string
  - `sweepTargetAccountId` string, required — ID of the account funds are swept to
  - `sweepTargetAccount` SweepTargetAccountDto
    - `id` string, required
    - `type` 'VIRTUAL_BANK' | 'VIRTUAL_WALLET' | 'INFINITE_BANK' | 'INFINITE_WALLET' | 'EXTERNAL_BANK' | 'EXTERNAL_WALLET' | 'EXTERNAL_PROXY' | 'PROVIDER_BALANCE', required
    - `isThirdParty` boolean, required — Whether the sweep target belongs to a third party
    - `metadata` AccountMetadataDto
      - `nickname` string — Account nickname
      - `purpose` string — Account purpose
      - `tags` string[] — Account tags
    - `walletAddress` string
    - `addressType` string
    - `chains` string[]
    - `accountNumber` string
    - `routingNumber` string
    - `bankName` string
  - `developerFeeFixed` string, nullable — Fixed fee in minor units of source currency
  - `developerFeePercent` number, nullable — Variable fee as decimal percentage (0.01 = 1%)
  - `refundAccountId` string, nullable — Customer wallet account ID (inw_xxx or ewa_xxx) for refunds on failed transfers or when fees exceed deposit
  - `correspondentBank` FixedRouteCorrespondentBankDto
    - `name` string, nullable — Bank name
    - `swiftCode` string, nullable — SWIFT/BIC code
    - `accountNumber` string, nullable — Account number
  - `allowedSenderBanks` AllowedSenderBankDto[], nullable — Allowed sender banks for deposits into this route. When set, deposits from sender banks not on this list are held for review instead of being processed automatically.
    - `bankName` string — Sender bank name. Matched ignoring case, whitespace, and punctuation.
    - `routingNumber` string — Sender bank routing number (e.g. US ABA). Matched on digits only.
    - `swiftBic` string — Sender bank SWIFT/BIC code (8 or 11 characters)
  - `documentIds` string[], nullable — Standing supporting agreement document ID applied to transfers created by this route.
  - `minimumAmount` MoneyOutputDto
    - `currency` string, required — Currency code
    - `exponent` number, required — Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)
    - `value` string, required — Amount in smallest unit as a string
    - `displayValue` string, required — Human-readable decimal value
  - `sharesBalanceAccountCoordinates` boolean, required — Whether this route's deposit coordinates are shared with a USD balance account. When true, the route and a balance account are mutually exclusive for the customer — one must be closed/disabled before the other can be created or re-enabled. Only bank pay-in routes on the balance-account provider qualify (ACH, WIRE, or SWIFT); crypto routes and payout routes are always false.
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required

## Other responses

- `401` — Unauthorized - Invalid or missing authentication credentials
- `409` — An enabled route with the same source, destination, and sweep target already exists for this customer.

## Changes

- **2026-09-24** `bb2702829ce0` — 2 info
  - added the new optional request property `sourceRails`
  - added the optional property `sourceAccount/sourceRails` to the response with the `201` status
- **2026-09-22** `916d2367a8f8` — 2 breaking, 12 warning, 2 info
  - the response property `sourceAccount/depositInstructions/bankAddress` became nullable for the status `201`
  - the response property `sourceAccount/depositInstructions/beneficiaryAddress` became nullable for the status `201`
  - removed the optional property `sourceAccount/depositInstructions/bankAddress/addressLine1` from the response with the `201` status
  - removed the optional property `sourceAccount/depositInstructions/bankAddress/addressLine2` from the response with the `201` status
  - …12 more
- **2026-09-16** `b83888a376d8` — 2 info
  - added the optional property `documentIds` to the response with the `201` status
  - added the required property `sweepTargetAccount/allOf[#/components/schemas/SweepTargetAccountDto]/isThirdParty` to the response with the `201` status

[Change history](https://skmtc.dev/infinite/apis/infinite-api/changes/v1/fixed-routes/virtual-bank-accounts/post.md)

---

[API](https://skmtc.dev/infinite/apis/infinite-api.md) · [All operations](https://skmtc.dev/infinite/apis/infinite-api/llms.txt) · [OpenAPI document](https://skmtc.dev/infinite/apis/infinite-api/revisions/0b0a3231b482?raw)
