Skip to main content

Overview

A balance account is a USD account that holds funds. Bank deposits credit the balance instead of being swept onward, and the held balance can fund bank payouts or (when enabled for your organization) USDC/USDT transfers to an external or treasury wallet.
  1. Open a balance account for a verified customer
  2. Fund it by wiring to the account’s deposit instructions
  3. Track the balance and its transaction history
  4. Pay out by creating transfers sourced from the balance
  5. Close it when the balance is drained

Prerequisites

The customer must be approved for USD balance accounts. Check the capabilities endpoint for USD_BALANCE:
IN_REVIEW means verification is still in progress; the capability is omitted entirely when the customer has no path to it yet.
Sandbox: skip real verification by setting the customer status to ACTIVE, then simulating the capability:
USD_BALANCE becomes READY immediately, and the rest of this guide — opening the account, simulating deposits, reading balances — works as in production.

Open an account

One balance account per customer. Use an idempotency key so retries are safe:
The response is a standard account object with holdsBalance: true and the account’s bank deposit instructions in bankDetails — routing and account number for domestic wires, plus SWIFT details for international senders:
You can rediscover it later with GET /v1/accounts?holdsBalance=true.
If this balance account shares deposit coordinates with USD bank pay-in fixed routes (ACH, wire, or SWIFT), the two cannot both be enabled. Creating the balance account returns 409 while such a route is enabled; closing the balance account makes those routes available again. Crypto routes are unaffected.
A balance held on dedicated deposit coordinates can take a FIAT_TO_FIAT fixed route. Pass this account as sweepTargetAccountId on POST /v1/fixed-routes/virtual-bank-accounts. Deposits to that virtual account settle into the balance in the same currency, with no crypto leg. The route type is inferred. A non-zero developer fee returns Developer fees are not supported when the destination is a balance account. A currency mismatch returns Balance account currency must match the pay-in currency. A different banking partner, or deposit coordinates shared with the balance account, returns This pay-in route cannot settle into a balance account.

Fund it

No API call needed: wire (Fedwire) or SWIFT to the bankDetails above. When the deposit lands, the balance is credited automatically and your organization receives a balance.credited webhook:
Amounts are in minor units (250000 = $2,500.00). Deposits credit net of any deposit fee, so the balance always mirrors funds actually held.

Sandbox

Simulate a deposit instead of sending a real wire. Use the funding-method account id (vba_…) from the create response — not a top-level acct_ id:

Check the balance

GET /v1/accounts/{id}/balance returns the available balance plus any amount pending on in-flight payouts:
GET /v1/accounts/{id}/balance/transactions lists the history — deposit credits, payout debits, and reversals — newest first with cursor pagination.

Pay out

Create a transfer with the balance account as the source and paymentRail: "BALANCE". The destination is any of the customer’s external bank accounts, over ACH, RTP, WIRE, or SWIFT:
The amount is held from the available balance when the transfer is submitted and finalized on completion; if the payout fails, the hold is re-credited. Insufficient balance fails the transfer before any funds move. Track the payout through the standard transfer lifecycle webhooks (transfer.created → transfer.processing → transfer.completed). Balance payouts to banks are USD to USD. Per-transaction limits are $1M for ACH/RTP and $20M for WIRE/SWIFT; a small fee buffer is reserved under each cap, so payouts at exactly the limit are rejected — keep amounts a little below it.

Pay out as stablecoins

When enabled for your organization, the same balance account can fund a transfer to an external wallet or treasury wallet in USDC or USDT. Use source.paymentRail: "BALANCE" with a crypto destination currency and rail. Developer fees are supported the same way as other onramps. Contact your Infinite representative to enable this path.

Close the account

Closing requires the balance to be fully settled at zero and no payouts in flight — pay out any remaining funds first (409 otherwise). In the rare case where the account shows $0.00 available but closing is still rejected, a ledger discrepancy is pending resolution — contact support. After closing, the account no longer accepts deposits, and USD bank pay-in fixed routes become available to the customer again.

Reference