Contents Lesson 14 of 16

5 min read · practitioner

What is the exchange half of a ticker actually naming?

Almost every symbol in this API is SYMBOL.EXCHANGE. AAPL.US, BMW.XETRA, EURUSD.FOREX. A few endpoints take their own form — /us-quote-delayed accepts a bare AAPL, and the WebSocket feeds subscribe to BTC-USD — but the dotted pair is the grammar everywhere else. The first half is familiar. The second half is doing more work than it looks, and /exchanges-list is where you find out what.

What the list contains

/exchanges-list takes one parameter, fmt, and returns an array with seven fields per exchange: Name, Code, OperatingMIC, Country, Currency, CountryISO2, CountryISO3.

Code is the half you put after the dot. Currency is the field that tells you what the price numbers mean, since no price row carries a currency of its own. OperatingMIC is the ISO 10383 market identifier code, which is how the rest of the financial world names venues.

.US is not an exchange

Look at the first row and something is off:

Live API response: exchanges list us row

One code, four MICs. NASDAQ, NYSE, the OTC markets and Cboe, all behind .US. So AAPL.US does not mean "Apple on NASDAQ" — it means Apple on the consolidated US national market, the single tape that all those venues print to. That is why the tick data in Unit 2 showed ten different venue codes inside a quarter of a second for one symbol: several markets, one ticker.

Germany is the mirror image. Frankfurt (F, XFRA), XETRA (XETRA, XETR), Stuttgart (STU), Munich (MU), Hanover (HA), Düsseldorf (DU) and Hamburg (HM) are seven separate codes for one country. The same company listed across several of them gives you several genuinely different price series, with different volumes, different closing times and different liquidity. Choosing the wrong one is not an error the API can catch for you.

The exchange code is a decision about which market's record you want, not a formatting detail.

Virtual exchanges

Some codes name an asset class rather than a venue:

  • FOREX — currency pairs. EURUSD.FOREX. OperatingMIC reads CDSL.
  • CC — cryptocurrencies. BTC-USD.CC. OperatingMIC reads CRYP.
  • GBOND — government bonds. OperatingMIC is null.
  • MONEY — money-market instruments. OperatingMIC is null.
  • EUFUND — European funds. OperatingMIC is null.

These are virtual exchanges: a code that means "this asset class", used so that instruments without a listing venue still fit the SYMBOL.EXCHANGE grammar. It is a sensible design, and it means the suffix sometimes names a place and sometimes names a category. You cannot tell which without checking the list.

The code that is not in the list

Now a genuine gap, verified live. INDX — the code for indices — does not appear in the /exchanges-list response. It works everywhere else: /exchange-symbol-list/INDX returns roughly 1,670 index symbols — 1,668 on 2026-07-28 — including GSPC (S&P 500), DJI (Dow Jones Industrial Average), IXIC (NASDAQ Composite) and N225 (Nikkei 225), each with Type: INDEX.

So a program that discovers the universe by iterating /exchanges-list will never find indices, and will report — correctly, from its own evidence, and wrongly — that they are not covered. This is the kind of thing that only surfaces by testing a code you were told about rather than one you enumerated.

The general lesson is worth more than the specific gap: an index endpoint is not the same as a complete index. Verify coverage claims against the endpoint that serves the data, not the endpoint that lists what exists.

Resolving a symbol you were handed

When somebody gives you "BMW" with no suffix, the list is where you start, but it will not finish the job — the same company can trade under different codes on different exchanges, and the same code can mean different companies in different countries. /search/{query} and the ISIN carried in the symbol lists are the tools for that, and they belong to Course 6.

This is the practitioner's version of exchanges-of-the-world: that lesson explained which exchanges run the world's trading, and this one shows how those institutions are compressed into a two-to-five-character field.

Try it now

  1. Grouped by Country on 28 September 2026, the 70 rows of /exchanges-list?fmt=json fell into 54 values, and 7 of them held more than one code. Below are rows 6 to 12 of that response, the largest group. Name the one of the 7 that is not a country at all (the virtual exchanges below will tell you), then pick one company that trades on several of these seven codes and say which line you would store.
Live API response: mda1 exchanges list germany
  1. None of those 70 rows has Code INDX. Here is /exchange-symbol-list/INDX anyway, its first rows; on 28 September 2026 it held 1,674. Compare that with the count quoted above and say what the drift tells you about quoting it without a date.
Live API response: mda1 indx symbol list head
  1. Here are the last seven rows of /exchanges-list on 28 September 2026, trimmed to three fields; no row above them has a null OperatingMIC. List every row where it is null, then add FOREX and CC. The null test finds only three of the five virtual exchanges, which is its own lesson about deriving a category from a field that was never meant to define it.
[{"Code": "MONEY",  "Country": "Unknown", "OperatingMIC": null},
 {"Code": "EUFUND", "Country": "Unknown", "OperatingMIC": null},
 {"Code": "GBOND",  "Country": "Unknown", "OperatingMIC": null},
 {"Code": "TWO",    "Country": "Taiwan",  "OperatingMIC": "ROCO"},
 {"Code": "LIM",    "Country": "Peru",    "OperatingMIC": "XLIM"},
 {"Code": "CC",     "Country": "Unknown", "OperatingMIC": "CRYP"},
 {"Code": "FOREX",  "Country": "Unknown", "OperatingMIC": "CDSL"}]