By FeeAtlas — neutral exchange-plumbing research. No sponsored placements in this article.
Ask three exchanges for the price of Bitcoin and you will get three numbers within a few basis points of each other. Ask their APIs for Bitcoin itself, and you will get three different words back — and one of those exchanges uses two different words depending on which product you touch. This is not a trivia question. It is the first wall every cross-exchange script hits, and it is documented in none of the fee tables.
On 2026-09-22 we queried the public, no-key endpoints of Kraken, KuCoin and Coinbase Exchange in the same session. Everything below is a literal field value or a literal error string from those endpoints, so you can repeat every check yourself.
Kraken: the asset is XXBT, the label is XBT
Kraken's asset registry returns the canonical code XXBT:
-
GET /0/public/Assets?asset=XXBTreturns a record whosealtnamefield isXBT. -
GET /0/public/AssetPairs?pair=XXBTZUSDreturns a pair whosebaseisXXBT, whosealtnameisXBTUSD, and whose WebSocket name (wsname) isXBT/USD.
So under one roof there are already two spellings: XXBT in the REST asset/pair identifiers, XBT in display names and the WebSocket stream names. A REST script that hard-codes BTC gets nothing; a WebSocket script that hard-codes XXBT/USD gets rejected. Both spellings are "correct" — in different halves of the same API.
KuCoin: spot says BTC, futures say XBT — and each half rejects the other's spelling
KuCoin is the most instructive case, because the split runs through the middle of one company's product line.
Spot side:
-
GET /api/v1/currencies/BTCreturns a normal record (precision8, withdrawal fields present). -
GET /api/v1/currencies/XBTreturns error code900003with the literal message:"XBT currency does not exist."
Derivatives side (a different host, api-futures.kucoin.com):
-
GET /api/v1/contracts/XBTUSDTMreturns the perpetual withsymbol: "XBTUSDTM"andbaseCurrency: "XBT". -
GET /api/v1/contracts/BTCUSDTMreturns error code404000with the literal message:"The contract information you requested does not exist."
Read those two negative responses together with the two positive ones and the picture is unambiguous: the same company calls spot Bitcoin BTC and futures Bitcoin XBT, and each service will tell you, in as many words, that the other service's spelling does not exist. There is no alias translation layer between them. A portfolio tool that resolves "BTC" once and reuses the result across spot and perpetuals must special-case this venue.
Coinbase Exchange: only BTC-USD has ever lived here
Coinbase Exchange keeps it simple, in its own way:
-
GET /products/BTC-USDreturns an online product withbase_currency: "BTC". -
GET /products/XBT-USDreturns HTTP 404 with the body{"message":"NotFound"}.
No XBT spelling exists on this venue at all. The full product list (public, no key) contains no XBT-prefixed pairs — the ticker namespace is consistently BTC.
Why this matters beyond trivia
1. Cross-venue mapping is not optional. Three independent venues, three regimes: XXBT/XBT (Kraken, REST vs WebSocket), BTC on spot but XBT on perpetuals (KuCoin, spot vs derivatives), and plain BTC everywhere (Coinbase). A symbol-resolution table is table stakes before any comparison logic — fee, spread, or depth — can run.
2. The split can happen inside one roof. The KuCoin case is the genuinely surprising finding: you cannot even cache "what does this venue call Bitcoin" at the venue level. The correct answer is per-product-line.
3. Error handling tells you the truth. Both KuCoin negatives come back as explicit, greppable error strings ("XBT currency does not exist." / "The contract information you requested does not exist."). If you are building the mapping table from scratch, probing candidate spellings and reading the error messages is a legitimate discovery method — it is exactly what we did.
4. This is not a one-token problem. If Bitcoin — the most liquid, most-listed asset in the industry — cannot settle on one symbol, assume nothing about the long tail. Stablecoins, wrapped tokens and tokenized equities inherit the same naming autonomy, often worse.
What we deliberately did not do: explain why the three-letter code XBT exists at all. That story gets retold often, but we could not verify it against two reachable primary sources today, and FeeAtlas does not publish what it cannot cross-check. The observable facts — which endpoints accept which spelling, and what the rejection messages say — stand on their own.
Method and reproducibility
All values above were captured on 2026-09-22 (around 02:2x UTC) from the public, authentication-free endpoints of the three venues, with repeat fetches confirming identical responses. Ticker conventions can change without notice; re-run the calls before building anything on them.
- AI-assisted research and drafting; human-owned channel reviewed the output.
- This article contains no affiliate links — there are currently no sponsored placements or referral arrangements attached to it. Any future sponsored content will be labeled with #ad.
- Not financial advice. This is a technical observation about public API interfaces, nothing more.
Verify with official sources
Do not take our word for any of it — every claim is one unauthenticated request away:
- Kraken public API:
api.kraken.com/0/public/Assetsand/0/public/AssetPairs - KuCoin spot API:
api.kucoin.com/api/v1/currencies/{currency} - KuCoin futures API:
api-futures.kucoin.com/api/v1/contracts/{symbol} - Coinbase Exchange API:
api.exchange.coinbase.com/products/{product-id}
The index is public; the recipes are yours to check.
Top comments (0)