How to get a list of every US stock ticker, delisted ones included
Every US-listed ticker, the dead ones included — which free files stop at today's names, which go back years, and why a ticker is the wrong key to store.
Nobody publishes one official master list. The SEC's free ticker files map today's symbols to CIKs and contain no delisted names at all. Alpha Vantage's free LISTING_STATUS call returns active and delisted US stocks and ETFs as CSV, for any date since 2010. Massive, EODHD and Norgate Data go deeper. Whichever you use, store a permanent identifier beside the ticker, because symbols are reused, renamed and spelled differently by every source.
The short way
Alpha Vantage answers the whole question in two requests on a free key.
LISTING_STATUS returns active listings by default and delisted ones with state=delisted, and
it returns CSV rather than JSON:
import csv
import io
import requests
URL = "https://www.alphavantage.co/query"
def listing(state, date=None):
params = {"function": "LISTING_STATUS", "state": state, "apikey": "YOUR_API_KEY"}
if date:
params["date"] = date # any YYYY-MM-DD after 2010-01-01
return list(csv.DictReader(io.StringIO(requests.get(URL, params=params).text)))
universe = listing("active") + listing("delisted")
# columns: symbol, name, exchange, assetType, ipoDate, delistingDate, status
The date parameter is the part worth noticing. Without it you get the list as of the latest
trading day; with it, the endpoint returns the listings as they stood on that date. That is not
the same thing as today's list filtered by IPO date, and the difference is the whole of
survivorship bias: a list rebuilt from today's names backwards
contains nothing that died in between.
Two requests is two of the free key's 25 a day. What it does not give you is anything before
2010, an asset type finer than Stock and ETF, or — in the file served while this page was
written — any over-the-counter venue.
What the options are
The regulator's mapping, current names only. SEC EDGAR publishes three
JSON files, free and keyless with a User-Agent that names you: company_tickers.json (CIK,
ticker, name), company_tickers_exchange.json (the same plus an exchange, with OTC names in it),
and company_tickers_mf.json (fund CIK, series, class and ticker). The SEC says it updates them
periodically for EDGAR's own search and does not guarantee accuracy or scope. They are the right
way to attach a CIK to a live ticker. They are no help with the past: there is no delisted file.
A reference endpoint with the history kept. Massive, formerly Polygon.io,
serves /v3/reference/tickers. active defaults to true; set it false for delisted names, each
carrying a delisted_utc. A date parameter returns the tickers available on that day, and each
record carries cik, composite_figi and share_class_figi where known. Pages hold at most 1,000
rows and chain through next_url, and the free Basic plan is five requests a minute, so a full
pull is minutes rather than seconds. Stocks and OTC are separate market values: ask for
market=stocks and the OTC tier is not in the answer. Renames live in a separate, experimental
ticker events endpoint, which records ticker_change and nothing else, back to September 2003 on
paid plans and two years on Basic.
The whole US composite in one call. EODHD serves
/api/exchange-symbol-list/US, a composite code returning every US listing across venues — about
51,600 tickers by its own count, of which NASDAQ, NYSE, NYSE Arca and BATS are the
exchange-traded part and the rest sit on the OTC tiers and in the mutual-fund listing. Add
delisted=1 for the dead ones. Each request is one API call, and the lists are on every plan,
including the free one at 20 calls a day. A separate symbol-change-history endpoint covers
renames, US exchanges only.
Survivorship-free, delivered as software. Norgate Data is the deep end: its US listed-and-delisted dataset is, in its own words, essentially complete back to late 1992. It is not an API. The data sits in a local database kept by a Windows updater, read through a Python package or a charting plugin, and delisted securities start at the Platinum tier, $630 a year. The two cheaper tiers are current listings only.
Where this breaks
There is no neutral list. Every source above is somebody's answer to "what counts as listed", and they draw the line differently. Alpha Vantage's file is US stocks and ETFs on exchanges. The SEC's exchange file includes OTC names. EODHD's composite includes the OTC tiers and mutual funds. Two correct lists of "every US ticker" can differ by tens of thousands of rows before a single one of them is wrong. Decide what your universe is, then filter to it, rather than treating any one vendor's default as the definition.
One share class, three spellings. Berkshire Hathaway's class B is BRK-B in the SEC's file
and in Alpha Vantage's CSV, and BRK.B in Massive, which writes class shares with a dot and
preferreds with a lower-case p. Nasdaq's own convention table lists the class suffix as .B
under CQS and in its integrated platform, and as a bare B after a space under CMS; warrants,
units and rights diverge further. The dangerous part is not the difference but the failure mode:
Massive's documentation says an unknown symbol returns an empty result rather than an error, so a
dash sent where a dot was expected reads as "no data". Normalise punctuation on the way in, once,
in one function. Symbology is the longer version of this.
A ticker is a lease. Symbols are reassigned after a delisting, and Massive says plainly that a ticker reused by a different company is possible and that you should check the details for the date range you care about. A table keyed on the bare ticker will concatenate two unrelated companies into one row and nothing will error. Keep a permanent identifier beside every symbol — a CIK for the issuer, a composite FIGI for the instrument — and store the ticker with the dates it was valid. Note the CIK is one level too coarse for share classes: both Berkshire tickers sit under a single CIK in the SEC's file.
The same rename, three answers. When a company changes its symbol, Norgate moves the entire price history under the new symbol and drops the old one from the database. Massive does the opposite: the history stays under both symbols as it was published, unstitched, and the events endpoint is how you find the join. EODHD keeps a separate change log. None of these is wrong, but a list assembled from one vendor and prices fetched from another will disagree about whether the old symbol exists at all.
Delisted is not always the end. Norgate's own example is Enron: it traded on the NYSE as ENE
until 10 January 2002, then over the counter as ENRNQ until November 2004. An exchange-only list
records the first date; a list that includes OTC records the second. Norgate only appends its
-YYYYMM suffix, ENRNQ-200411 here, once a security really stops trading, which is also how
it keeps a reused symbol from colliding with its previous owner.
ETFs, warrants and units are mixed in, and the type field is coarse. Alpha Vantage has two
asset types, so in the file served while this page was written a SPAC's warrants and units sat
under Stock beside its class A shares. EODHD's type filter accepts fewer values than its
Type field returns — warrants, units and notes cannot be filtered for and have to be selected
after the download. The SEC's files split ETFs by legal structure: a standalone trust like SPY is
in the exchange file, while an ETF that is one series of a larger trust, such as IVV or VTI, is
in the fund file instead. Filter by asset type deliberately, and expect to clean what the filter
misses.
Depth is the number that differs most. Alpha Vantage goes back to 2010. Massive's rename log starts in September 2003. EODHD's delisted names carry end-of-day prices only if they left before 2018, with fundamentals, dividends and splits after that and intraday after 2021, and the vendor asks you to contact support to confirm coverage for a specific ticker. Norgate reaches late 1992. Any universe older than your source's floor is survivorship-biased by construction, whatever the list looks like.
If you outgrow this
When the list has to feed a price history, the next page is how to download historical prices in Python — and the same rename problem arrives there as a gap in a series.
When the question is "what was in the index", a list of every ticker is the wrong object. Constituent history is its own dataset, and historical index constituents explains who sells it and why it is licensed separately.
When the identifiers themselves are the problem, CUSIP, ISIN, FIGI and the rest sets out which registry covers what, and which of them costs money to use.
The rest of the field is in market data APIs.
The tools that do this
In the order this page recommends trying them. Paid placement does not affect this order.
Alpha Vantage
One free CSV call for active listings and one for delisted, as of any date after 2010. US stocks and ETFs, in two asset types only.
The API most people's first script talks to — free key, wide coverage, hard rate limits.
$49.99/moFree tier
SEC EDGAR
Free, keyless JSON mapping today's tickers to CIKs, OTC included. No delisted names, and ETFs split across two files by legal structure.
Every US filing since 1994, free and keyless — the limit is ten requests a second.
FreeFree tier
Massive
A paged tickers endpoint with active=false, a point-in-time date, FIGIs and a delisting timestamp. Free at five calls a minute.
Full-tick US equities, options and futures from a direct exchange feed.
$29/moFree tier
EODHD
One request returns the whole US composite, OTC and funds included, and a second with delisted=1 returns the dead. One call each.
End-of-day and fundamentals for 60+ exchanges worldwide, at a hobbyist price.
$19.99/moFree tier
Norgate Data
Delisted US securities essentially complete back to late 1992, renames stitched into one series. Windows only, from $630 a year.
Survivorship-bias-free end-of-day history with delisted stocks and index constituents.
$150/yr
FAQ
Is there an official list of every US ticker?
Not one that covers the dead. The SEC publishes ticker-to-CIK files for EDGAR's own search and says it does not guarantee their accuracy or scope, and they hold current associations only. Each exchange publishes its own listings. A list that includes delisted names is always a vendor's reconstruction, and the vendors disagree at the edges — which is why the depth of their delisted history is the number to compare.
Can I get delisted tickers for free?
Yes, within limits. Alpha Vantage's LISTING_STATUS call returns delisted US stocks and ETFs on the free key, for any date after 1 January 2010. Massive's free Basic plan serves the same tickers endpoint with active=false, at five requests a minute. EODHD's free package includes the exchange ticker lists at 20 calls a day. None of the three reaches the 1990s; that is what Norgate Data's paid tiers sell.
What should I use as the key instead of the ticker?
Something that survives a rename and is never reassigned. A CIK identifies the filer, so it is one value for both Berkshire Hathaway share classes. A composite FIGI identifies the instrument in a market, and a share-class FIGI the class across markets. Store the ticker as an attribute with the date range it was valid for, and join on the identifier.
Why does a ticker I know exists come back empty?
Usually punctuation. Massive writes share classes with a dot, BRK.A, where the SEC's file and Alpha Vantage's CSV write BRK-A, and Massive's documentation says an unknown symbol returns an empty result rather than an error. The other common cause is that the list was filtered to active listings by default and the name has since been delisted or renamed.
Sources
- Alpha Vantage API Documentation — Listing & Delisting Status — Alpha Vantage, read
- Accessing EDGAR Data — CIK, ticker, and exchange associations — U.S. Securities and Exchange Commission, read
- All Tickers — Stocks REST API — Massive, read
- Ticker Events — Stocks REST API — Massive, read
- What does Massive do with delisted tickers? — Massive, read
- How does Massive handle ticker changes and acquisitions? — Massive, read
- Why are ticker symbols with dashes not showing in Massive's system? — Massive, read
- Exchanges API — Supported Exchanges and Ticker Lists — EODHD, read
- Delisted Stock Companies Data — EODHD, read
- Norgate Data FAQ — Norgate Data, read
- CQS Symbol Convention — Nasdaq, Inc., read
The catalogue next door
This page names a handful of cards. The rest of them are in Stock Market Data APIs, each filled in against the same schema, with the fields to narrow it yourself.
Last updated . Corrected in place: this is a reference page, not a dated post.