Asset IDs
Every endpoint except /auth, /create and /addresses 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
Chains
A chain is only live if the deployment you are calling is configured for it. If an address is missing from /addresses, that chain was not configured when the user was created — backfill it with /extend.
Network-dependent assets
51 (POLYGON USDT) and 61 (SOLANA USDT) have no testnet contract address. On a testnet deployment those assetIds do not exist, and requests for them return 400 Unknown assetId.
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 BNB Chain 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.
Minimums and dust
Two different floors, and they are not the same number.
Below the send minimum you get a 400 (Minimum send amount is 0.00001 BTC, Amount below minimum of 0.0001ETH).
A "0" balance does not prove an address is empty. Dust below the floors above is reported as "0". Do not use a zero balance as proof that a wallet can be closed, swept or reused.
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.