Asset IDs
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
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
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:
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.