A gap in a minute series is information, not a defect: it means no eligible trade happened in that window, and there is no tick data for it either because there were no ticks. Massive does not emit a placeholder bar, because what a quiet minute should mean is a decision only your calculation can make. Filling it is a choice, and it should be your choice.
Applies to
- Plans: every plan.
- Endpoints: /v2/aggs/ticker/..., /v3/trades/{ticker} and the aggregate WebSocket channels, which also send nothing for an empty window.
- Asset classes: all. It is most visible on thinly traded stocks and options.
How common it is
Common enough to design for, and it varies session to session. Ask for one day of minute bars and compare the count with the 960 minutes in an extended session:
curl -X GET "https://api.massive.com/v2/aggs/ticker/AAPL/range/1/minute/2026-09-04/2026-09-04?limit=5000&apiKey=YOUR_API_KEY"
Response
{ "ticker": "AAPL", "queryCount": 885, "resultsCount": 885, "status": "OK" }
AAPL is one of the most heavily traded stocks in the market, and on that session 885 of its 960 minutes produced a bar. The two sessions before it gave 845 and 792. So the gap is not a fixed proportion you can assume: a thin ticker or a far out-of-the-money option contract may have a bar for only a handful of minutes in the whole day.
How to handle a continuous series
- Index your series on the timestamp, not on position. Assuming bar n + 1 is one minute after bar n will drift the moment a quiet minute appears.
- Fill forward on your side if you need an unbroken series, carrying the previous close as open, high, low and close, with volume zero.
- Keep filled points labeled. A filled bar is your inference and should not be reported as market data.
- Do not treat a gap as an error to retry. Requesting it again returns the same nothing.
Why not send an empty bar
An empty bar would need prices, and there are none: no trade happened, so there is no open, high, low or close that anybody transacted at. Carrying the previous close forward would publish a price as fact when it is an assumption, and zeroes would poison any average or return calculated over the series. Omitting the window keeps the data honest and leaves the choice where it belongs.
If you see an error
A gap on a busy ticker in the middle of the session is worth a second look: check /v3/trades for that minute. Trades with no bar means the trades were not eligible to update one, which is a different answer from a quiet market.
Gaps at the end of a long range are the limit, which counts minutes scanned rather than bars returned.
A whole missing day is a holiday or an early close rather than a gap.

