The naming problem
Every exchange invented its own names for everything.
Here's what six exchanges call the BNB Chain network:
| Exchange | Their string |
|---|---|
| Binance | BSC |
| MEXC | BNB Smart Chain(BEP20) |
| Bitget | BEP20 |
| KuCoin | BSC |
| Bybit | BSC (BEP20) |
| Kraken | BNB Chain |
Same story with assets. Kraken calls Bitcoin XXBT. Hyperliquid calls it 197. Everyone else calls it BTC.
If you've built anything that touches more than one exchange, you've spent time on this. Tribulnation Catalogue is the translation layer — a free, open dataset of canonical crypto assets, networks, and instruments, with per-exchange translation tables baked in.
API
Every record is available as a static JSON API — no auth, no rate limits, served from GitHub Pages.
Browse: catalogue.tribulnation.com
GET /api/assets.json
GET /api/assets/{id}.json
GET /api/platforms.json
GET /api/platforms/{id}.json
GET /api/instruments/spot/{platform}.json
GET /api/instruments/perpetual/{platform}.json
GET /api/indexes/symbols.json
GET /api/indexes/external/coingecko.json
Full route list and interactive try-it at catalogue.tribulnation.com/api.
You can also download everything at once:
| Archive | Contents |
|---|---|
data.zip |
Raw catalogue data (JSON) |
icons.zip |
SVG icons for assets, platforms, networks |
Clients
Python
pip install tribulnation-catalogue
from tribulnation.catalogue import Catalogue
catalogue = Catalogue.load()
btc = catalogue.assets['bitcoin']
binance = catalogue.platforms['binance']
Catalogue.load() downloads the catalogue on first use and caches it locally.
JavaScript / TypeScript
npm install @tribulnation/catalogue
import { Catalogue } from '@tribulnation/catalogue';
const client = new Catalogue();
const matches = await client.findBySymbol('BTC');
const bitcoin = await client.fetchAsset('bitcoin');
const pairs = await client.getSpotInstruments('mexc');
Pricing
The MarketData SDK uses each asset's external IDs to route price requests to the right provider automatically:
from tribulnation.catalogue import Catalogue, MarketData
catalogue = Catalogue.load()
sdk = MarketData.new('usd', 'coingecko', 'twelvedata', 'alphavantage')
await sdk.current_price(catalogue.assets['bitcoin']) # → CoinGecko
await sdk.current_price(catalogue.assets['gold']) # → Twelve Data
await sdk.current_price(catalogue.assets['west-texas-intermediate']) # → Alpha Vantage
| Provider | Source | Covers |
|---|---|---|
| CoinGecko | 'coingecko' |
Crypto — price, market cap, history |
| CoinMarketCap | 'coinmarketcap' |
Crypto — price, market cap, history |
| Twelve Data | 'twelvedata' |
Precious metals (XAU, XAG†), forex |
| Alpha Vantage | 'alphavantage' |
Energy & agricultural commodities, forex |
† XAG requires a paid Twelve Data plan.
What's inside
Assets — canonical records keyed by slug (e.g. bitcoin, usd-coin). Each carries a display name, symbol, icon, tags, peg information for stablecoins and wrapped tokens, and external IDs for CoinGecko, CoinMarketCap, Twelve Data, and Alpha Vantage.
Platforms — trading venues and blockchain networks keyed by slug (e.g. binance, ethereum). Blockchains carry namespace, chain ID, native asset, and EVM/SVM category.
Instruments — spot pairs, perpetual futures, debt positions, and liquidity pools — each mapped to canonical asset IDs. Resolves exchange-specific tickers like XBTUSDT back to ('bitcoin', 'tether').
Translations — per-exchange asset and network name mappings. The BNB Chain table above is real data from this.
Icons — square, maskable SVGs for assets, platforms, and networks. Designed to be displayed cropped to a circle or rounded square; API responses include absolute icon URLs.
Contributing
The data lives in plain JSON files — easy to read, easy to contribute to.
git clone https://github.com/tribulnation/catalogue.git
cd catalogue
python -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python scripts/validate.py
New assets, platforms, icons, translations, and corrections welcome on GitHub.