---
title: "Update a virtual account"
method: POST
path: "/v2/users/{userId}/virtual-accounts/{accountId}/update"
tags: ["Virtual Account"]
---

# Update a virtual account

`POST /v2/users/{userId}/virtual-accounts/{accountId}/update`

## Request

- Base URL: `https://production.hifibridge.com`
- URL: `https://production.hifibridge.com/v2/users/{userId}/virtual-accounts/{accountId}/update`
- Auth: HTTP bearer

Update an existing virtual account.

## Path parameters

- `userId` string, required
- `accountId` string, required

## Request body

- union: Update the virtual account's destination routing, its automatic USDT onramp conversion-fee threshold, or both. `maxBps` may be sent by itself.
  - object
    - `sourceCurrency` 'usd'
    - `destinationCurrency` 'usdc' | 'usdt' | 'usdg' | 'pyusd'
    - `destinationChain` 'POLYGON' | 'ETHEREUM' | 'SOLANA' | 'BASE' | 'TRON', required: Either `externalWalletId` or `destinationChain` must be provided. If provided, the token will be delivered to user's HIFI wallet on the destination chain.
    - `externalWalletId` string: Either `externalWalletId` or `destinationChain` must be provided.
    - `maxBps` union: Maximum USDT conversion fee, supplied as an integer or decimal-integer string representing 0 through 10,000 basis points, allowed for automatic onramps through this virtual account. Omit to preserve the current value; use `null` to disable the threshold.
      - integer, nullable
      - string
  - object
    - `sourceCurrency` 'usd'
    - `destinationCurrency` 'usdc' | 'usdt' | 'usdg' | 'pyusd'
    - `destinationChain` 'POLYGON' | 'ETHEREUM' | 'SOLANA' | 'BASE' | 'TRON': Either `externalWalletId` or `destinationChain` must be provided. If provided, the token will be delivered to user's HIFI wallet on the destination chain.
    - `externalWalletId` string, required: Either `externalWalletId` or `destinationChain` must be provided.
    - `maxBps` union: Maximum USDT conversion fee, supplied as an integer or decimal-integer string representing 0 through 10,000 basis points, allowed for automatic onramps through this virtual account. Omit to preserve the current value; use `null` to disable the threshold.
      - integer, nullable
      - string

## Response `200`

Success

- UpdateVirtualAccountObject
  - `message` string
  - `virtualAccountInfo` VirtualAccountObject
    - `id` string, uuid
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `userId` string, uuid
    - `source` object
      - `paymentRail` string[]
      - `currency` string
    - `destination` object
      - `chain` string
      - `currency` string
      - `walletAddress` string
      - `externalWalletId` string
    - `status` 'activated' | 'deactivated'
    - `maxBps` integer, nullable: Maximum USDT conversion fee, as a whole number of basis points from 0 through 10,000, allowed for automatic onramps through this virtual account. `null` means disabled.
    - `microDeposits` object
      - `count` integer
      - `data` object[]
        - `createdAt` string, date-time
        - `currency` string
        - `amount` string: Amount received, in dollars as a decimal string (for example `"0.71"`). Not cents.
        - `sourceBankInfo` InboundObject
          - `bankName` string, nullable
          - `senderName` string, nullable
          - `routingNumber` string, nullable
          - `accountNumber` string, nullable
          - `accountType` string, nullable: ACH field. `null` when the inbound payment did not carry it.
          - `fedBatchId` string, nullable: ACH field. `null` when the inbound payment did not carry it.
          - `imad` string, nullable: Fedwire input message identifier. `null` when the inbound payment did not carry it.
          - `omad` string, nullable: Fedwire output message identifier. `null` when the inbound payment did not carry it.
          - `traceNumber` string, nullable: Trace number for the inbound payment. `null` when the payment did not carry one.
          - `bankAddress` string, nullable
          - `description` string, nullable
          - `references` object, nullable: Remittance and reference information supplied by the sender. `null` when the payment carried none.
            - `senderReference` string, nullable
            - `beneficiaryReference` string, nullable
            - `remittance` string[]
          - `paymentRail` 'ach' | 'wire' | 'rtp', nullable
    - `depositInstructions` object
      - `bankName` string
      - `bankAddress` string
      - `swiftCode` string
      - `beneficiary` object
        - `name` string
        - `address` string
      - `ach` object
        - `routingNumber` string
        - `accountNumber` string
      - `wire` object
        - `routingNumber` string
        - `accountNumber` string
      - `rtp` object
        - `routingNumber` string
        - `accountNumber` string
      - `reference` string
      - `depositBy` string, date-time
      - `instruction` string
    - `settlementRuleId` string, uuid

## Other responses

- `401`: Unauthorized
- `404`: Resource not found
- `500`: Internal Server Error

## Changes

- **2026-11-03** `319fa6bd5bc6`: 1 warning, 5 info
  - removed the optional property `accountInfo` from the response with the `200` status
  - added the new optional request property `maxBps`
  - added `subschema #1: Update conversion-fee threshold only, subschema #2: Update destination routing` to the request body `oneOf` list
  - the request property `destinationCurrency` became optional
  - …2 more

[Operation history](https://skmtc.dev/hifi/apis/hifi-api/changes/v2/users/:userId/virtual-accounts/:accountId/update/post.md)

---

[API](https://skmtc.dev/hifi/apis/hifi-api.md) - [All operations](https://skmtc.dev/hifi/apis/hifi-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hifi/apis/hifi-api/revisions/319fa6bd5bc6?raw)
