Overview
Wallets are multi-asset custodial digital asset wallets. They let you receive on-chain deposits, hold balances across several assets and networks, and send on-chain transfers — all behind the same authenticated Customer API you use for fiat accounts. Balansas is the provider of record for these wallets; under the hood they are powered by Utila, our wallet technology provider, but that detail never surfaces in the API: every wallet is returned withprovider: "balansas".
All wallet responses use internal local UUIDs only (local_id). Vendor wallet
identifiers stay server-side and are never exposed to the caller.
Browse the Wallets API Reference
for the full request/response schemas and a live request playground.
Authentication & scopes
Wallet endpoints follow the same auth model as the rest of the API (see Authentication):read:wallets— required for theGETroutes.write:wallets— required for everyPOST. Writes also require theX-CSRF-Tokenheader and, for the customer, that Wallets are enabled on the account.- Money-moving
POSTroutes accept anIdempotency-Keyheader. Repeating a call with the same key replays the original stored response — success or failure — so a flaky network can never double-send. See Idempotency.
Listing wallets
GET /wallets returns every wallet you own. Balansas wallets are multi-asset,
so they have no single currency or deposit_address — addresses are generated
per asset and network.
Wallet balances
GET /wallets/{walletId}/balances returns per-network balances for a single
wallet, each grouped with its chain receive address. Use this on a wallet detail
view.
Creating a wallet
POST /wallets provisions a new Balansas wallet and returns 201. The body is
optional — you may bind the wallet to an end user or an umbrella link, but no
fields are required.
UUID. Bind the wallet to an end user.
pending and flips to active once provisioning
completes and the wallet.created event fires.
Receive addresses
To receive funds, generate a receive address for a specific asset and network.POST /wallets/{walletId}/addresses creates a fresh address and returns 201.
Asset symbol, e.g.
USDC.Network, e.g.
ethereum.(asset, network) pairs at launch:
| Asset | Network |
|---|---|
BTC | bitcoin |
ETH | ethereum |
USDC | ethereum |
USDT | ethereum |
USDC | polygon |
USDT | tron |
403.
GET /wallets/{walletId}/addresses lists all addresses generated for a wallet.
Sending from a wallet
POST /wallets/{walletId}/transfers initiates an on-chain transfer to an
external destination address and returns 201.
Asset symbol, e.g.
USDC.Network, e.g.
ethereum.Positive decimal string to preserve precision (e.g.
"125.50").External on-chain destination address.
Optional free-text note (max 500 characters).
Webhook events
Subscribe to these events from the Webhooks surface. All payloads use localwallet_id / transaction_id UUIDs only.
Wallet lifecycle
Wallet lifecycle
wallet.created— wallet provisioned and ready.
On-chain activity
On-chain activity
wallet.incoming_transaction— an on-chain deposit was detected.wallet.outgoing_transaction— an on-chain withdrawal was broadcast.wallet_transaction.confirming— first network confirmations seen.wallet_transaction.confirmed— required confirmations reached.wallet_transaction.failed— transaction failed or was dropped.wallet_transaction.quarantined— AML screening returned DENY; the transaction is held and will not credit the wallet.

