Asset IDs

Every asset the service can address, and the integer that selects it.
View as MarkdownOpen in Claude

Every endpoint except /auth, /refresh, /create, /extend, /addresses, /prices and /config takes an assetId — the integer that selects which chain and which asset you are operating on. It resolves to a chain, a chain manager, and your wallet on that chain.

Send it as an integer (21) or an all-digit string ("21"); both normalise to the same value. A missing assetId returns 400 assetId is required, and an unrecognised one returns 400 Unknown assetId.

Supported assets

assetIdChainSymbolKindDecimals
1BITCOINBTCnative8
2ETHEREUMETHnative18
21ETHEREUMUSDTERC206
22ETHEREUMUSDCERC206
3BSCBNBnative18
31BSCUSDTBEP2018
32BSCUSDCBEP2018
4TRONTRXnative6
41TRONUSDTTRC206
42TRONUSDCTRC206 — limited
5POLYGONPOLnative18
51POLYGONUSDTERC206 — limited
52POLYGONUSDCERC206
6SOLANASOLnative9
61SOLANAUSDTSPL6 — limited
62SOLANAUSDCSPL6

Prices are keyed by symbol

/prices is the one endpoint that takes no assetId. A market price belongs to a coin rather than to a chain deployment, so the response is keyed by the Symbol column above: a single USDT entry prices USDT on every chain it lives on. To value a balance, map your assetId to its symbol here and read that entry.

Chains

ChainFamilyNative asset
BITCOINUTXOBTC
ETHEREUMEVMETH
BSCEVMBNB
TRONTVMTRX
POLYGONEVMPOL
SOLANASVMSOL

Not every chain is available on every endpoint. An address missing from /addresses is either a chain you are not enabled for (see below) or one that was unavailable when the user was created — only the second is fixed by /extend.

Assets with limited availability

42 (TRON USDC), 51 (POLYGON USDT) and 61 (SOLANA USDT) are not available on every endpoint. Where they are not, requests for them return 400 Unknown assetId.

Separately, your api client may be enabled for only some of the assets above. A call for an assetId you are not enabled for returns 403 — permanent until your operator enables it, so do not retry. /create, /extend and /addresses follow the same list: their address maps carry only the chains you are enabled for. Wallets are still derived on every chain, so an address reappears as soon as an asset is enabled — no /extend, no mnemonic.

Ask the service rather than copying the table. /config returns the assets you are enabled for, resolved against the environment you are calling — the limited ones it does not carry are already excluded, so everything it lists is something you can actually use. It also tells you which of them have their network fee covered for you.

Decimals

You never send base units. Amounts are always human-decimal strings"25.5", not 25500000. The service converts to base units using the decimals above.

Watch the one asymmetry: USDT and USDC use 18 decimals on BSC and 6 decimals everywhere else. The service handles the conversion, so this only matters if you are also reading balances straight off-chain.

An amount with more decimal places than the asset supports is rejected — Amount has more than 6 decimal places.

Send minimums

Balances are reported exactly, down to the last base unit — nothing is floored to "0". Sends, however, have minimums:

Minimum you can send
BTC0.00001
ETH, BNB, POL (native)0.0001
TRX, SOL (native)must exceed the fee
USDT, USDC (any chain)must be greater than zero

Below the send minimum you get a 400 (Minimum send amount is 0.00001 BTC, Amount below minimum of 0.0001ETH).

A balance can be real but unspendable. A balance above zero yet below the send minimum — or, for a native asset, below the network fee — cannot be moved on its own. Top the address up before sweeping it.

On a native send the fee is taken out of the amount, so an amount that is above the minimum but smaller than the network fee is rejected with a 422 (Amount does not cover the network fee.). See Reliability and the /send reference.