Where do you find the tickers that no longer exist?
/exchange-symbol-list/{exchangeCode} gives you an exchange's ticker universe. The word "universe" is doing a lot of work in that sentence, because by default the endpoint shows you only the part of it that still exists — and the parameter that reveals the rest does not behave the way its name suggests.
The default view
Parameters: fmt, delisted (0 or 1, default 0), and type, which filters by instrument kind with the enum common_stock, preferred_stock, stock, etf, fund.
Each row carries Code, Name, Country, Exchange, Currency, Type and Isin. A call for Vienna (VI) returned 88 symbols on 2026-07-28 — Erste Group, OMV, Voestalpine, a handful of ETFs, and so on. Any count in this lesson is a count on a date. What matters is the relationship between the two calls below, not the two numbers.
Two field-level warnings before the main point. Isin is nullable and often null, so it cannot be your only join key. And Country describes the listing venue, not the issuer: Merck & Company Inc appears in the Vienna list with Country: Austria and ISIN US58933Y1055. An American company, an American ISIN, an Austrian listing, and a Country field that will mislead any analysis that treats it as domicile.
The parameter that replaces rather than includes
Now add delisted=1. The specification describes it as "Include delisted (inactive) tickers", which reads like a widening. Run both calls for Vienna and compare:
delisted=0(default) → 88 symbolsdelisted=1→ 50 symbols
Fifty is fewer than eighty-eight. The two responses are disjoint sets: OMV appears only in the first, AB Effectenbeteiligungen appears only in the second, and nothing appears in both. delisted=1 returns delisted tickers only.
So the full historical universe of Vienna is not one call. It is the union of two: 88 + 50 = 138 codes. Anyone who reads the parameter description and makes a single call with delisted=1 ends up with a list containing no live companies at all, which is an unusual and confusing way to fail.
What lives in the delisted list
Delisting is only one of the reasons a code stops being current, and the Vienna data shows the others clearly.
The active list has CPI — CPI Europe AG, ISIN AT0000A21KS2. The delisted list has IIA — IMMOFINANZ AG, ISIN AT0000A21KS2. Same ISIN. One company that changed its name; the old code retired, the new one active, and the ISIN is the only field that connects them.
A longer chain: AT0000KTMI02 appears three times. KTMI (KTM Industries AG) and PKTM (PIERER Mobility AG) sit in the delisted list; BMAG (Bajaj Mobility AG) sits in the active one. Two retired codes, one live code, one continuous business — and a bare KTM also sits in the delisted list under the same company name, but with Isin: null, so an ISIN join silently leaves it behind. A symbol list is not a permanent record and its identifiers are not all populated; both facts bite the same pipeline.
If you built a price history by looking up PKTM today, you would get a series that stops. If you built it by ISIN across both lists, you would get the whole thing. /symbol-change-history exists to make those links explicit, and is taught in Course 1 and again in Course 6.
Why this is the survivorship lesson
This is where survivorship-and-biases stops being an abstraction. A study of "Vienna-listed companies" built from the default call studies 88 survivors and silently excludes 50 companies whose stories ended — the acquisitions, the collapses, the takeovers. Every one of those exclusions removes an outcome, and the outcomes removed are not randomly distributed.
The correction is cheap and mechanical: make both calls, union the results, and record which codes came from which list. That last part matters, because "was delisted" is itself a fact about the instrument that you will want later.
One more coverage note in the honest direction: the type enum has no value for indices, yet /exchange-symbol-list/INDX returns rows with Type: INDEX. The filter enum and the values actually present in the data are not the same set. Filter after you fetch when you need to be sure.
Try it now
/exchange-symbol-list/VIcalled twice on 28 September 2026 returned 89 codes withoutdelisted=1and 51 with it, and no code appeared in both. Set those counts against the 88 and 50 of July and say which part of the lesson's claim the drift leaves standing. The first rows of the default call are below, with the fields each row carries.
- Grouped by
Isin, ignoring nulls, ignoring nulls, the union had three groups with more than one code, below. Say which is a rename, which is a chain of renames, and which is a dual line or a data issue, and what you would check to tell.
Isin |
codes (list) |
|---|---|
AT0000KTMI02 |
BMAG (active, Bajaj Mobility AG), KTMI (delisted, KTM Industries AG), PKTM (delisted, PIERER Mobility AG) |
AT0000A21KS2 |
CPI (active, CPI Europe AG), IIA (delisted, IMMOFINANZ AG) |
AT0000625504 |
BTS (delisted), BTV (delisted), both "Bank für Tirol und Vorarlberg AG" |
- In that union of 140 codes, 52 carried
Isin: null. Work out the share, and decide now what your pipeline does with an instrument it cannot key on. Deciding later means deciding under pressure.