> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.walletstech.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.walletstech.com/_mcp/server.

# 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

| assetId | Chain    | Symbol | Kind   | Decimals           |
| ------- | -------- | ------ | ------ | ------------------ |
| `1`     | BITCOIN  | BTC    | native | 8                  |
| `2`     | ETHEREUM | ETH    | native | 18                 |
| `21`    | ETHEREUM | USDT   | ERC20  | 6                  |
| `22`    | ETHEREUM | USDC   | ERC20  | 6                  |
| `3`     | BNB      | BNB    | native | 18                 |
| `31`    | BNB      | USDT   | BEP20  | 18                 |
| `32`    | BNB      | USDC   | BEP20  | 18                 |
| `4`     | TRON     | TRX    | native | 6                  |
| `41`    | TRON     | USDT   | TRC20  | 6                  |
| `42`    | TRON     | USDC   | TRC20  | 6                  |
| `5`     | POLYGON  | POL    | native | 18                 |
| `51`    | POLYGON  | USDT   | ERC20  | 6 — *mainnet only* |
| `52`    | POLYGON  | USDC   | ERC20  | 6                  |
| `6`     | SOLANA   | SOL    | native | 9                  |
| `61`    | SOLANA   | USDT   | SPL    | 6 — *mainnet only* |
| `62`    | SOLANA   | USDC   | SPL    | 6                  |

## Chains

| Chain    | Family | Native asset |
| -------- | ------ | ------------ |
| BITCOIN  | UTXO   | BTC          |
| ETHEREUM | EVM    | ETH          |
| BNB      | EVM    | BNB          |
| TRON     | TVM    | TRX          |
| POLYGON  | EVM    | POL          |
| SOLANA   | SVM    | SOL          |

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.

|                        | Minimum you can **send**  | Balance below which you read `"0"` |
| ---------------------- | ------------------------- | ---------------------------------- |
| BTC                    | `0.00001`                 | `0.0001`                           |
| ETH, BNB, POL (native) | `0.0001`                  | `0.00001`                          |
| TRX, SOL (native)      | must exceed the fee       | `0.00001`                          |
| USDT, USDC (any chain) | must be greater than zero | `0.0001`                           |

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](/get-started/reliability) and the `/send` reference.