Skip to main content

Goal

Set up a customer with an omnibus account and use it end-to-end: create the account, fund it, read its balance, and move funds both within your platform (off-chain) and to external wallets (on-chain). If you’re not familiar with the two custody models, read Crypto custody first.

How omnibus custody works

With omnibus accounts, customer funds are pooled in a Bastion custody vault. Bastion tracks each account’s balance on a secure double-entry ledger. This differs from segregated accounts, where each customer holds funds at their own dedicated on-chain addresses. Both account types are fully custodial under Bastion’s US regulated licensing, and your platform uses the same APIs either way.

Key entities

Flow overview

  1. Onboard the customer and wait for their identity to become ACTIVE.
  2. Create an account with type: OMNIBUS.
  3. Fund the account via on-ramp, crypto deposit, or off-chain transfer.
  4. Check the chain-agnostic balance.
  5. Move funds off-chain (within your platform) or on-chain (external withdrawals).

Prerequisites

  • You have access to your dashboard
  • You’ve created an API key
  • You’ve registered a webhook

Step 1 – onboard the customer

Omnibus accounts follow the same onboarding flow as any other account. Create an identity, submit KYC or KYB data, and track status until the identity is ACTIVE: Accounts cannot be created until the identity’s status is ACTIVE.

Step 2 – create an omnibus account

Call POST /v2/accounts with type set to OMNIBUS.
The type field defaults to SEGREGATED. You must set type: "OMNIBUS" explicitly to create an omnibus account.
Use a unique request_id (UUID) as an idempotency key. Reuse the same request_id on retries to avoid duplicate accounts. Request
The response returns the new account. Capture these fields: If the identity has not passed compliance and jurisdiction checks, the request returns HTTP 422.

Step 3 – fund the account

An omnibus account can receive funds in three ways: In all cases, Bastion credits the balance and delivers a webhook when funds arrive. For deposits, that is the deposit_v2 event. Off-chain deposits from another account on your platform arrive with source_type: ACCOUNT and source_account_id identifying the sender.

Step 4 – check the balance

Response:
Omnibus balances differ from segregated balances:
  • Balances are chain-agnostic. The type field is OMNIBUS and chain is CHAIN_UNSPECIFIED. A customer holding USDC has one balance entry, regardless of which chains the funds arrived on. Segregated accounts instead return one entry per chain.
  • contract_address is omitted.
Balances are returned in atomic units as strings. Use the decimals field to convert to a human-readable amount (e.g., "975000000" with decimals: 6 = 975.00 USDC). The available field reflects the amount the customer can use for transfers or conversions. total may differ from available if funds are held for a pending operation.

Step 5 – move funds

Both transfer modes use the same endpoint, POST /v2/crypto/transfers. The destination field determines the mode.

Off-chain: send to another account on your platform

Off-chain transfers move funds instantly on Bastion’s internal ledger. There is no blockchain transaction, no gas fee, and no chain selection. Both sender and recipient must have omnibus accounts on the same platform.
Off-chain transfers settle immediately, with a status lifecycle of ACCEPTEDCONFIRMED / FAILED. For the full walkthrough, including webhook payloads and status handling, see Send crypto off-chain.

On-chain: withdraw to an external wallet

On-chain withdrawals send funds through the blockchain to any wallet address. Omnibus accounts support on-chain withdrawals on Solana and EVM chains, with gas sponsored by Bastion. Specify the destination address and chain:
Because the omnibus balance is chain-agnostic, the customer’s full available balance can be withdrawn to any supported chain. On-chain transfers settle after block confirmation, with a status lifecycle of ACCEPTEDSUBMITTEDCONFIRMED / FAILED / CANCELED / DROPPED. For the full walkthrough, see Send crypto on-chain.

Step 6 – verify setup

Confirm the customer is fully ready:
  1. Check identity statusGET /v2/identities/{identity_id} returns status: ACTIVE
  2. Check the accountGET /v2/accounts/{id} returns type: OMNIBUS and status: ACTIVE
  3. Check balancesGET /v2/accounts/{account_id}/balances shows the funded, chain-agnostic balance

Implementation notes