# Supported Coins & Networks

Use this page to see which cryptocurrencies and blockchain networks CoinsSend
supports, choose labels for your interface, and find the codes to send in API
requests.

## Supported assets at a glance

The public catalog was checked on **September 17, 2026 (UTC)**: **9 coins,
7 networks, and 18 coin/network pairs**. This is a dated reference; load the
[live catalog](https://api.coinssend.com/v1/coins-and-fee) to build your current
payment or withdrawal choices.

| Network display name | API `network` code | Coins in the catalog |
|----------------------|--------------------|----------------------|
| Bitcoin | `bitcoin` | BTC |
| Ethereum (ERC-20) | `eth` | ETH, USDT, USDC |
| TRON (TRC-20) | `tron` | TRX, USDT |
| BNB Smart Chain (BEP-20) | `bsc` | BNB, USDT, USDC |
| Polygon PoS | `polygon` | POL, USDT, USDC |
| TON (Jetton) | `ton` | TON, USDT |
| Arbitrum One | `arbitrum` | ARB, ETH (deposits only), USDT, USDC |

At that check, deposits and withdrawals were enabled for all listed pairs
except **ETH on Arbitrum One**, where deposits were enabled and withdrawals
were disabled. Check the current operation flags before enabling a choice.

The coin codes for requests are `btc`, `eth`, `trx`, `bnb`, `pol`, `ton`,
`arb`, `usdt`, and `usdc`. Keep these values dynamic in your integration;
new assets may be added and existing pairs may become unavailable.

## Coin codes, network codes, and display labels

A coin and its network form one payment option. **USDT on TRON and USDT on
Ethereum are different options**: always display both the coin and the network
when asking a customer where to send funds.

| Purpose | Value to use | Example |
|---------|--------------|---------|
| Display the coin | Catalog `coin.label` | `USDT` |
| Display the network | Catalog `networks[].title` | `TRON (TRC-20)` |
| Send `coin` in a request | Lowercase catalog `coin.symbol` | `usdt` |
| Send `network` in a request | Lowercase catalog `networks[].network` | `tron` |
| Identify a choice in your UI | Both normalized codes | `usdt:tron` |

Use `eth` for the Ethereum network and `bitcoin` for the Bitcoin network.
Display names and token-standard labels such as `ERC-20`, `TRC-20`, and
`BEP-20` are not API network codes. The native Polygon coin code is `pol`.
Do not combine every coin with every network or infer the network from an
address alone.

## Load the live catalog

Both discovery endpoints are public and require no API key, `Merchant`, or
`Sign` header:

```bash
curl --fail --show-error https://api.coinssend.com/v1/coins-and-fee
curl --fail --show-error https://api.coinssend.com/v1/get-coin-rate
```

| Endpoint | How to use it |
|----------|---------------|
| `GET /v1/coins-and-fee` | Read `data.coins` for the available coin/network pairs, display labels, network fees, service-fee percentages, and minimum withdrawals. |
| `GET /v1/get-coin-rate` | Match `data[].coin.symbol` and `networks[].network` for `deposit_enabled`, `withdraw_enabled`, amount limits, decimals, and exchange rates. |

The catalog includes pairs enabled for deposits, withdrawals, **or both**;
it does not return the individual operation flags. A `min_withdrawal` or
`network_fee` value by itself does not mean withdrawals are enabled.

Use the catalog as the starting list, then match the rate metadata by the
lowercase **coin/network pair**. For receiving payments, require
`deposit_enabled === true`; for withdrawals, require
`withdraw_enabled === true`.

The rates response can contain coins with no available networks and can omit
assets without rate data. For example, at the check above SOL had rate data
but no networks and was absent from the catalog. A price or quote alone is
not evidence that an asset is available for payments. If metadata for a
catalog pair is missing, show its availability as unknown and refresh before
enabling the operation.

### JavaScript: build coin and network choices

This example only reads public data. It keeps catalog entries with missing
metadata visible as unavailable choices, without assuming that they support
either operation.

```javascript
const api = 'https://api.coinssend.com';

async function getData(path) {
  const response = await fetch(`${api}${path}`);
  if (!response.ok) throw new Error(`Discovery failed: ${response.status}`);

  const body = await response.json();
  if (body.status !== 'success') throw new Error('Discovery failed');
  return body.data;
}

const [catalog, rates] = await Promise.all([
  getData('/v1/coins-and-fee'),
  getData('/v1/get-coin-rate'),
]);

const metadata = new Map(rates.flatMap((entry) =>
  entry.networks.map((network) => [
    `${entry.coin.symbol.toLowerCase()}:${network.network.toLowerCase()}`,
    network,
  ])
));

const choices = catalog.coins.flatMap((entry) =>
  entry.networks.map((network) => {
    const coin = entry.coin.symbol.toLowerCase();
    const code = network.network.toLowerCase();
    const id = `${coin}:${code}`;
    const details = metadata.get(id);

    return {
      id,
      coin,
      network: code,
      label: `${entry.coin.label} — ${network.title}`,
      availabilityKnown: details !== undefined,
      depositEnabled: details?.deposit_enabled === true,
      withdrawEnabled: details?.withdraw_enabled === true,
    };
  })
);

const depositChoices = choices.filter((choice) => choice.depositEnabled);
const withdrawalChoices = choices.filter((choice) => choice.withdrawEnabled);
```

If discovery fails, show a loading/error state with a retry option. Do not
replace a failed response with a hardcoded list of enabled payment methods.
The catalog advertises `Cache-Control: public, max-age=900` (15 minutes);
respect that cache window and handle changes between discovery and submission.

## Use a selected pair in requests

| Operation | Fields |
|-----------|--------|
| [Create an invoice](invoices.md#create-invoice) | Use lowercase `coin` and `network` to preselect a pair. `allowed_coins` is an array of lowercase coin codes, not network codes or `coin:network` identifiers. |
| [Create a static wallet](static-wallets.md#create-wallet-address) | Send the selected lowercase `coin` and `network` with the other required wallet fields. |
| [Create a withdrawal](withdrawals.md#initiate-withdrawal) | Send the selected lowercase `coin` and `network`; check withdrawal availability and limits for that pair. |

For example, a selected USDT payment on TRON supplies these fields (this is
only the pair, not a complete request):

```json
{
  "coin": "usdt",
  "network": "tron"
}
```

Discovery is a UI aid. The target endpoint makes the final decision on pair
and amount validation; handle HTTP `422`, refresh the choices, and explain the
validation message to the customer. Do not silently switch the network or
retry a write automatically.

## Fees, limits, and precision

Read current values from the discovery responses; do not copy the examples
into permanent fee or limit tables. Keep monetary values as decimal strings,
and use the selected pair's precision rather than assuming one decimal count
for a coin across every network.

The public catalog's service fee is not a merchant-specific fee quote. For
your merchant's settings, use [Merchant Fees](merchants.md#get-merchant-fees).
See [Coin Rates API](coin-rates.md) for the complete discovery response fields.
