A Massive security master for US stocks comes from the date parameter on the All Tickers endpoint rather than from a file. A list for a past date includes companies that have since delisted, under the symbol, name and exchange they had that day. Two things make the job harder than it looks: older records leave some fields blank, so a filter on those fields drops real stocks without an error, and Massive publishes no permanent identifier that survives every change to a security.
Applies to
- Plans: every Stocks plan. The docs list two years of history for the ticker reference endpoints on Stocks Basic, and all history back to 10 September 2003 on Stocks Starter, Developer, Advanced and Business.
- Endpoints: /v3/reference/tickers with date and active, /v3/reference/tickers/{ticker} for list_date, and /vX/reference/tickers/{id}/events for renames.
- Asset classes: US stocks (market=stocks).
What Massive offers instead of a file
Massive's flat files hold market data, not reference data. The stocks flat files are day aggregates, minute aggregates, trades and quotes, and the options, indices, forex, futures and crypto flat files hold the same kinds of market data plus index values. None of them is a ticker or security master file. Tickers, names, exchanges, identifiers and delisting dates come from the REST reference endpoints, and All Tickers returns up to 1,000 rows per page. To ask for a downloadable version, start a chat at massive.com/contact.
How to build a point-in-time list of tickers
- Call All Tickers with market=stocks, a date and limit=1000, and follow next_url until a response has none. active defaults to true, so the result is the stocks marked active on that date.
- Repeat for each date you need, such as every trading day or every month-end.
- Compare consecutive lists. A symbol that appears is a new listing or the new side of a rename; a symbol that disappears is a delisting or the old side of a rename.
- Tell renames from delistings with the identifiers described below and the ticker events endpoint, and read delisting dates with active=false.
curl -X GET "https://api.massive.com/v3/reference/tickers?market=stocks&date=2008-01-15&ticker.gte=LEH&limit=2&apiKey=YOUR_API_KEY"
Response
{
"results": [
{
"ticker": "LEH",
"name": "LEHMAN BROTHERS HOLDINGS",
"primary_exchange": "XNYS",
"type": "CS",
"active": true,
"cik": "0000806085"
},
{
"ticker": "LEHpC",
"name": "LEHMAN BRS DP(RP1/10 5.94%PF C",
"primary_exchange": "XNYS",
"type": "PFD",
"active": true,
"cik": "0000806085"
}
],
"status": "OK"
}
Lehman Brothers is active in the list for 15 January 2008, eight months before its delisted_utc of 18 September 2008. The same request without date leaves it out, because the default is the list for today.
For the date a stock first listed, including dates before 2003, Ticker Overview (/v3/reference/tickers/{ticker}) returns list_date where one is recorded, which the docs define as the date the symbol was first publicly listed.
How to find what delisted before a date
All Tickers with active=false and a date lists the stocks that had already delisted by that date, each with its delisted_utc where one is recorded. Comparing two such lists gives what delisted in between.
curl -X GET "https://api.massive.com/v3/reference/tickers?market=stocks&active=false&date=2008-01-15&limit=2&apiKey=YOUR_API_KEY"
Response
{
"results": [
{
"ticker": "AAA",
"name": "ALTANA AKTIENGESELLSCHAFT SPON ADR",
"active": false,
"delisted_utc": "2007-05-22T04:00:00Z"
},
{
"ticker": "AAAA",
"name": "ALTAS INDUSRIES HOLDINGS LLC COM",
"active": false,
"delisted_utc": "2007-11-30T05:00:00Z"
}
],
"status": "OK"
}
Both delisted before 15 January 2008. Some inactive records have no delisted_utc at all, so treat the field as optional. How delisted_utc relates to the last trading day is covered in How does Massive handle ticker changes and acquisitions?.
Which field to use as the join key
The join key for a security master built from All Tickers has to be the best field available, because Massive publishes no permanent identifier for a US stock. composite_figi and share_class_figi follow a company through a rename: Facebook's 2015 record as FB and Meta's record as META carry the same pair. On the day of a rename, both symbols can appear in one list:
curl -X GET "https://api.massive.com/v3/reference/tickers?market=stocks&cik=0001326801&date=2022-06-09&apiKey=YOUR_API_KEY"
Response
{
"results": [
{
"ticker": "FB",
"active": true,
"cik": "0001326801",
"composite_figi": "BBG000MM2P62",
"share_class_figi": "BBG001SQCQC5"
},
{
"ticker": "META",
"active": true,
"cik": "0001326801",
"composite_figi": "BBG000MM2P62",
"share_class_figi": "BBG001SQCQC5"
}
],
"status": "OK"
}
FB and META are both active on 9 June 2022, the date of the change, with the same FIGIs. De-duplicate each list on FIGI before you count it.
Both FIGIs can change over the years without a rename, and composite_figi changes more often than share_class_figi, which makes share_class_figi the better of the two to key on.
Both FIGI fields are also missing on many records: on most rows from the 2000s, and today on some large companies incorporated outside the US, such as Accenture (ACN) and Medtronic (MDT). cik fills most of those gaps, because almost every active common stock has one, but it identifies the company that files with the SEC rather than the share class: GOOG and GOOGL share one CIK, as do BRK.A and BRK.B. A workable key is share_class_figi where it is present and cik with the ticker where it is not, with the ticker events endpoint to confirm a rename.
Older lists leave fields blank
Older All Tickers records for US stocks leave type and primary_exchange blank on many rows, Nasdaq listings especially, and a filter on a blank field drops the row without an error. Apple has no type on 15 January 2008, so asking for common stock removes it:
curl -X GET "https://api.massive.com/v3/reference/tickers?market=stocks&date=2008-01-15&type=CS&ticker=AAPL&apiKey=YOUR_API_KEY"
Response
{
"results": [],
"status": "OK"
}
The same request without type=CS returns Apple, with no type and no primary_exchange in the row. For older dates, pull the list without type or exchange filters and classify the rows yourself.
Is a past list what you would have seen that day?
A past-date list from All Tickers is effective-dated, not a copy saved on that day. The symbol, name, exchange and active status are the ones in force on the date you ask for, which is why Apple's 2003 record is APPLE COMPUTER INC. Each row is still the record as Massive maintains it now: rows for 2003 carry a last_updated_utc in 2025, which the docs describe as the time the information is accurate up to, and All Tickers has no parameter that returns an earlier version of a record.
If you see an error
An empty results array with "status": "OK" for a date before 10 September 2003 is the start of the history, not a fault. All Tickers returns no stocks for earlier dates.
A stock missing from a filtered list for an older date is usually a blank type or primary_exchange on its record. Remove the filter and check the row.
{"status":"NOT_FOUND","message":"No events found for given ID"} from the ticker events endpoint can come back for a delisted stock even when you pass its FIGI. Use active=false on All Tickers for the delisting instead.

