Pre-market trading does reach Massive's full-market stocks snapshot, /v2/snapshot/locale/us/markets/stocks/tickers, from 4:00 AM Eastern, but not through day. The last trade, the last quote, the minute bar min and the change fields move with pre-market trades while day holds zeros for every ticker. Once day fills after 9:30 AM, its volume includes the pre-market shares, but its open, high, low and close do not include pre-market prices.
Applies to
- Plans: Stocks Advanced, which is real-time. Stocks Starter and Stocks Developer include the snapshot 15 minutes delayed; Stocks Starter has no lastTrade and Stocks Developer no lastQuote. This article describes the real-time snapshot.
- Endpoints: /v2/snapshot/locale/us/markets/stocks/tickers, and /v3/snapshot for the pre-market change after the open.
- Asset classes: US stocks and ETFs.
What the stocks snapshot holds through the morning
The stocks snapshot changes at three points in the morning, all in Eastern time. The full-market snapshot documentation states the first two: snapshot data is cleared at 3:30 AM and starts to repopulate as early as 4:00 AM.
| From | day | lastTrade, lastQuote and min | todaysChange | prevDay |
|---|---|---|---|---|
| The 3:30 AM reset | Every value 0 | Every value 0 | 0 | The session that just closed |
| 4:00 AM, the first pre-market trades | Every value 0 | The latest pre-market trade, quote and minute bar | The last trade minus prevDay.c | The session that just closed |
| The ticker's first regular-session trade, at or after 9:30 AM | The regular-session open, high, low and close, with a volume that includes the pre-market shares | The latest trade, quote and minute bar | The last trade minus prevDay.c | The session that just closed |
Until the 3:30 AM reset, the stocks snapshot still shows the previous trading day: day holds the session that closed the evening before and prevDay the session before that. min.av is the aggregate volume since the reset, so before the open it is the pre-market volume. A ticker that did not trade in the previous session can drop out of the full-market response at the reset and return when it next trades, so the response's count falls at 3:30 AM and rises through the morning.
How to get the pre-market change
- Before 9:30 AM Eastern, read todaysChange and todaysChangePerc from the stocks snapshot. They compare the latest trade with prevDay.c, the previous session's close, so before the open they are the pre-market change. A todaysChange of 0 with a lastTrade.t of 0 means the ticker has not traded since the 3:30 AM reset, not that its price is unchanged.
- After 9:30 AM, todaysChange keeps measuring from the previous close to the latest trade, so it no longer separates the pre-market move from the regular session. Read session.early_trading_change and session.early_trading_change_percent from /v3/snapshot instead.
curl -X GET "https://api.massive.com/v2/snapshot/locale/us/markets/stocks/tickers?apiKey=YOUR_API_KEY"
Response at 8:00 AM Eastern, with a real-time key whose plan includes trades and quotes, trimmed to NVDA:
{
"tickers": [
{
"ticker": "NVDA",
"todaysChangePerc": -0.8881230116648953,
"todaysChange": -2.009999999999991,
"day": { "o": 0, "h": 0, "l": 0, "c": 0, "v": 0, "vw": 0 },
"lastTrade": { "p": 224.31, "t": 1791892800013786084 },
"min": { "av": 1724539, "t": 1791892680000, "c": 224.48 },
"prevDay": { "c": 226.32 }
}
],
"status": "OK"
}
lastTrade.t is 8:00:00.014 AM Eastern on 13 October 2026, in nanoseconds, and min.t is the 7:58 AM minute, in milliseconds. todaysChange of -2.01 is the last trade, 224.31, minus the previous close of 226.32, and min.av shows aggregate volume of 1,724,539 since 4:00 AM, while every value in day is 0.
curl -X GET "https://api.massive.com/v3/snapshot?ticker.any_of=NVDA&apiKey=YOUR_API_KEY"
Response after the open, with the same key, trimmed:
{
"results": [
{
"market_status": "open",
"ticker": "NVDA",
"session": {
"change": -0.585,
"early_trading_change": -2.02,
"early_trading_change_percent": -0.893,
"open": 224.34,
"previous_close": 226.32,
"price": 225.735
}
}
],
"status": "OK"
}
early_trading_change of -2.02 is NVDA's last trade before 9:30 AM, 224.30, minus the previous close of 226.32, which is how the unified snapshot documentation defines it once early trading has ended. change of -0.585 is the latest price against the same close, the same measure as todaysChange.
Why this happens
The stocks snapshot's day bar is the regular session's daily bar. It starts with the ticker's first eligible regular-session trade, so its open is the regular-session open and its high and low come from regular-session trades. Pre-market trades still move lastTrade, lastQuote, min and the change fields, because those follow the latest trade and quote, and the shares traded before the open are counted in day.v once day starts.
If you see an error
"day": {"o": 0, "h": 0, "l": 0, "c": 0, "v": 0, "vw": 0} on every ticker between 3:30 and 9:30 AM Eastern means the regular session has not started, not that data is missing. Fix: read lastTrade, min and todaysChange until 9:30 AM.

