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.

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  1. Alpha Vantage API Documentation — Listing & Delisting Status — Alpha Vantage, read
  2. Accessing EDGAR Data — CIK, ticker, and exchange associations — U.S. Securities and Exchange Commission, read
  3. All Tickers — Stocks REST API — Massive, read
  4. Ticker Events — Stocks REST API — Massive, read
  5. What does Massive do with delisted tickers? — Massive, read
  6. How does Massive handle ticker changes and acquisitions? — Massive, read
  7. Why are ticker symbols with dashes not showing in Massive's system? — Massive, read
  8. Exchanges API — Supported Exchanges and Ticker Lists — EODHD, read
  9. Delisted Stock Companies Data — EODHD, read
  10. Norgate Data FAQ — Norgate Data, read
  11. 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.