# Chains (v1)

> GET /v1/chains and chain icons, the chains v1 covers, and how to check support for a pair.

> API v1 is deprecated. It stays supported, but new integrations should use the [Khalani API](/). See [Migrate to v2](/v1/migrate/).

## Coverage

`GET /v1/chains` is the live list of chains v1 works with: the EVM chains where Khalani has deposit contracts (the [spokes](/concepts/how-khalani-works/)), plus Solana, TRON and Bitcoin. Read it rather than hard-coding a list.

The list does not tell you which pairs have a route. Support is per pair and per route, and it moves with liquidity: a pair can have a route at one moment and none the next. Request a quote to check a pair. An empty `routes[]` means no route serves that pair and amount right now.

As of 19 October 2026 the list held 21 chains:

| Chain | Chain id | Type |
|---|---|---|
| Ethereum | 1 | `eip155` |
| OP Mainnet | 10 | `eip155` |
| BNB Smart Chain | 56 | `eip155` |
| Unichain | 130 | `eip155` |
| Polygon | 137 | `eip155` |
| Monad | 143 | `eip155` |
| ZKsync Era | 324 | `eip155` |
| Abstract | 2741 | `eip155` |
| Robinhood Chain | 4663 | `eip155` |
| Mantle | 5000 | `eip155` |
| Base | 8453 | `eip155` |
| 0G Mainnet | 16661 | `eip155` |
| Arbitrum One | 42161 | `eip155` |
| Avalanche | 43114 | `eip155` |
| Linea Mainnet | 59144 | `eip155` |
| Berachain | 80094 | `eip155` |
| Katana | 747474 | `eip155` |
| Jovay Mainnet | 5734951 | `eip155` |
| Tron | 728126428 | `tron` |
| Solana | 20011000000 | `solana` |
| Bitcoin | 0 | `bitcoin` |

Solana's `20011000000` and Bitcoin's `0` are ids that v1 assigns; neither is an EVM chain id. To ask for a chain, contact Khalani.

```bash
curl -s https://api.hyperstream.dev/v1/chains | jq -r '.[] | "\(.id)\t\(.type)\t\(.name)"'
```

## List chains

```text
GET /v1/chains
```

Returns an array of chain objects. The response is cached for 5 minutes (`Cache-Control: public, max-age=300`).

```json
[
  {
    "type": "eip155",
    "id": 1,
    "name": "Ethereum",
    "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 },
    "rpcUrls": { "default": { "http": ["https://ethereum.reth.rs/rpc"] } },
    "blockExplorers": {
      "default": { "name": "Etherscan", "url": "https://etherscan.io", "apiUrl": "https://api.etherscan.io/api" }
    },
    "blockTime": 12000
  },
  {
    "type": "bitcoin",
    "id": 0,
    "name": "Bitcoin",
    "nativeCurrency": { "name": "Bitcoin", "symbol": "BTC", "decimals": 8 },
    "rpcUrls": { "default": { "http": [] } },
    "blockExplorers": { "default": { "name": "mempool.space", "url": "https://mempool.space" } }
  }
]
```

Values as of 19 October 2026. The Ethereum entry is shortened.

| Field | Type | Description |
|---|---|---|
| `type` | string | `eip155`, `solana`, `tron` or `bitcoin`. |
| `id` | integer | The chain id the API uses in `fromChainId`, `toChainId` and token objects. |
| `name` | string | Display name. |
| `nativeCurrency` | object | `name`, `symbol` and `decimals` of the native currency. |
| `rpcUrls.default.http` | string[] | Public RPC endpoints. Empty for Bitcoin. Fine for a wallet's add-chain prompt; use your own RPC for production traffic. |
| `blockExplorers.default` | object | Optional. `name`, `url`, and on some chains `apiUrl`. |

EVM entries are viem chain definitions, so they can carry more fields: `blockTime`, `contracts`, `sourceId`, `testnet`, `fees`, `formatters`, `serializers`, `ensTlds`, `network` and `custom`. Rely only on the fields in the table.

## Chain icon

```text
GET /v1/chain/{chainId}/icon
```

Returns the chain's icon as an SVG image (`200`, `Content-Type: image/svg+xml`). It is served directly, not through a redirect, so you can use the URL in an `<img>` tag:

```html
<img src="https://api.hyperstream.dev/v1/chain/42161/icon" alt="Arbitrum One" />
```

- An unknown numeric id returns `200` with a default icon, which is currently the same image as Ethereum's. The icon alone does not tell you the chain exists, so check the id against `GET /v1/chains`.
- A non-numeric id returns `400 ValidationException` as JSON.
