Massive's US stock data is the whole consolidated tape rather than a selection of venues, which matters because a provider connecting to exchanges one at a time will be missing prints you can see elsewhere. Two processors carry it between them, split by where a security is listed, and off-exchange executions arrive on the same tape through the FINRA facilities.
Applies to
- Plans: every plan. The source is the same on all of them; the tier decides how recent and how far back you can see it.
- Endpoints: /v3/trades, /v3/quotes, /v2/aggs and the /stocks WebSocket cluster.
- Asset classes: US stocks and ETFs, including OTC.
What the sources are
The sources are recorded on the data itself: every trade and quote carries an exchange id, and the exchanges endpoint names each one:
| Type | Examples | What it is |
|---|---|---|
| SIP | Consolidated Tape Association, Unlisted Trading Privileges | The two consolidated feeds |
| exchange | NYSE American, NYSE National, Nasdaq and the rest | The 18 lit venues |
| TRF | FINRA NYSE TRF, FINRA Nasdaq TRF Carteret and Chicago | Where off-exchange executions are reported |
| ORF | OTC Equity Security | Over-the-counter reporting |
Which SIP a security is on depends on where it is listed rather than where it trades, which is why a single stock's prints all come through one of the two.
How to see which source a trade came through
Every trade names its venue and its tape, so you can see the consolidation in the data itself:
curl -X GET "https://api.massive.com/v3/trades/AAPL?timestamp.gte=1789042200000000000&limit=2&order=asc&sort=timestamp&apiKey=YOUR_API_KEY"
Response
{
"results": [
{ "exchange": 4, "trf_id": 202, "tape": 3, "conditions": [12, 37],
"price": 317.6537, "size": 0, "sip_timestamp": 1789042201685102864 },
{ "exchange": 21, "tape": 3, "conditions": [12, 37],
"price": 317.68, "size": 34, "sip_timestamp": 1789042202092389472 }
],
"status": "OK"
}
The first of those carries a trf_id, so it reached the tape through a FINRA reporting facility rather than from a lit exchange; the second has none. tape says which processor consolidated it: 1 and 2 are CTA, 3 is UTP. /v3/reference/exchanges turns the exchange integer into a venue name.
Why the consolidated feed rather than individual exchanges
The consolidated feed is the source because it is the market's own definition of what happened. Taking individual exchange feeds would mean assembling a national best bid and offer ourselves and deciding, thousands of times a second, which venue was best, and any two vendors doing that independently would disagree. The SIPs already perform that consolidation under rules everyone is bound by, so a price from the tape is the price the market agrees on.
The cost is a small processing delay at the SIP, which is why participant_timestamp and sip_timestamp differ on every trade, and that gap is upstream of us.
If you see an error
A trade with an exchange id you do not recognize is likely a reporting facility rather than a venue. Check the type field on the exchanges endpoint.
Prices that differ from a single exchange's own feed are expected: the tape is consolidated and a single venue's feed is not.
Data for a non-US listing is not a sourcing question. Massive's equity coverage is US only.

