There is no holiday page to bookmark, which is deliberate: a schedule you have to read is a schedule your code cannot act on. Massive publishes both the live state and the calendar as JSON from /v1/marketstatus/, covering the US equities exchanges, OTC, forex, crypto and the index groups in one response. Both are reference data, so they are available broadly rather than gated behind a real-time tier.
Applies to
- Plans: all plans, including the free Basic tier, for the market status endpoints. The data endpoints in the weekend and holiday table follow your plan for each asset class.
- Endpoints: /v1/marketstatus/now and /v1/marketstatus/upcoming; for weekend and holiday behavior, the aggregates, grouped daily, daily open-close, trades, quotes, reference tickers and futures schedules endpoints.
- Asset classes: US equities exchanges, OTC, currencies and the index groups for market status; stocks, options, indices, forex, crypto and futures for weekend and holiday behavior.
How to check whether the market is open now
curl -X GET "https://api.massive.com/v1/marketstatus/now?apiKey=YOUR_API_KEY"
Response
{
"afterHours": true,
"earlyHours": false,
"exchanges": { "nasdaq": "extended-hours", "nyse": "extended-hours", "otc": "closed" },
"currencies": { "crypto": "open", "fx": "open" },
"indicesGroups": { "s_and_p": "open", "msci": "open", "ftse_russell": "open" }
}
Read the per-exchange field rather than the top-level flags. afterHours describes the session; exchanges.nyse tells you the state of the venue you are actually querying, and OTC keeps different hours from NYSE and Nasdaq.
How to check the coming holidays
curl -X GET "https://api.massive.com/v1/marketstatus/upcoming?apiKey=YOUR_API_KEY"
Response
[
{ "date": "2026-11-26", "exchange": "NASDAQ", "name": "Thanksgiving", "status": "closed" },
{ "date": "2026-11-27", "exchange": "NYSE", "name": "Thanksgiving", "status": "early-close",
"open": "2026-11-27T14:30:00.000Z", "close": "2026-11-27T18:00:00.000Z" }
]
There is one record per exchange per holiday, so a single holiday appears several times. The early-close records carry open and close in UTC, which is what you need to avoid treating a short session as missing data.
What the API returns on a weekend or market holiday
What the Massive API returns for a Saturday, a Sunday or a US market holiday depends on the endpoint and the asset class. For US stocks, options and indices an empty answer on those dates is expected and is not an outage, but the shape of the empty answer differs by endpoint:
| Endpoint | Saturday or Sunday | US market holiday |
|---|---|---|
| Stock and option aggregates, /v2/aggs/ticker/{ticker}/range/... | HTTP 200, "status": "OK", resultsCount 0; a range across a weekend skips it | The same: no day bar and no minute bars for the holiday |
| Index aggregates, such as I:SPX | HTTP 200, "status": "OK", queryCount 0, and no resultsCount field | The same; the holiday is skipped |
| Grouped daily, /v2/aggs/grouped/locale/us/market/stocks/{date} | HTTP 200, resultsCount 0 | HTTP 200, resultsCount 0 |
| Daily open-close, /v1/open-close/{ticker}/{date} for a stock, option or index | HTTP 404, "status": "NOT_FOUND", "message": "Data not found." | The same 404 |
| Trades and quotes, /v3/trades and /v3/quotes with timestamp={date} | HTTP 200, "results": [] | HTTP 200, "results": [] |
| Reference tickers, /v3/reference/tickers?date={date} | The previous trading day's ticker list | The previous trading day's ticker list |
| Crypto, such as X:BTCUSD | Bars on Saturday and Sunday; daily bars are UTC days starting at 00:00 UTC | Bars as on any other day |
| Forex, such as C:EURUSD | No Saturday bar; a Sunday daily bar holding only the trading after the Sunday evening reopen | Usually bars as on any other weekday. A few holidays have no forex data, such as Good Friday, 18 April 2025; see How far back does Massive's forex and gold history go, and are there gaps? |
| Futures, such as ES | No session ends on a Saturday or Sunday; the session that opens Sunday evening is dated Monday | No session dated Labor Day; that day's trading belongs to the session ending the next day |
The two shapes of "no session" for US stocks look like this. Daily open-close answers 404 for Saturday 3 October 2026:
curl -X GET "https://api.massive.com/v1/open-close/AAPL/2026-10-03?apiKey=YOUR_API_KEY"
Response
{
"status": "NOT_FOUND",
"message": "Data not found."
}
Grouped daily answers HTTP 200 with no rows for the same Saturday:
curl -X GET "https://api.massive.com/v2/aggs/grouped/locale/us/market/stocks/2026-10-03?apiKey=YOUR_API_KEY"
Response
{
"queryCount": 0,
"resultsCount": 0,
"adjusted": true,
"status": "OK"
}
The same grouped daily call for Friday 2 October 2026 returns 12,601 rows, and for Labor Day, Monday 7 September 2026, it returns resultsCount 0.
The forex Sunday bar is a UTC-day bar. On Sunday 4 October 2026 the first C:EURUSD minute bar started at 21:00 UTC, so that day's bar carries t 1791072000000 (00:00 UTC on 4 October 2026) and 5,445 transactions, against about 210,000 on the weekdays either side.
Futures sessions are dated by session_end_date. The ES session ending Monday 5 October 2026 opened on Sunday 4 October at 22:00 UTC, and the session ending Tuesday 8 September 2026 opened on Sunday 6 September at 22:00 UTC, so Labor Day's trading is in the session dated 8 September. /futures/v1/schedules returns each product's sessions, including holiday adjustments.
How to handle weekends and holidays in code
Handle a non-trading date on the Massive data endpoints in three steps:
- Treat HTTP 200 with no results from aggregates (resultsCount 0, or no resultsCount field for an index), and HTTP 404 NOT_FOUND from daily open-close, as "no data on that date", not as an error. For US stocks, options and indices it may mean no session, but an option contract that did not trade on a trading day returns the same shapes, so confirm with step 2 or 3.
- For a future date, check /v1/marketstatus/upcoming.
- For a past weekday, call grouped daily for the date. resultsCount 0 marks a day with no session.
This is not the service status page
Two different questions share the word status:
| The question | Where to look |
|---|---|
| Are the exchanges open? | /v1/marketstatus/now |
| Is Massive's service healthy? | massive.com/system |
If a request returns no data, check the market status first. A closed market is a far more common cause of an empty result than an outage is.
If you see an error
An HTTP 200 with no rows for US stocks, options or indices usually means the range held no session: a weekend or a market holiday. Aggregates and grouped daily leave out the results key entirely, with queryCount 0, while trades and quotes return "results": []. /v1/marketstatus/upcoming lists future holidays only, so check a past date with grouped daily, as above.
A 404 with "status": "NOT_FOUND" and "message": "Data not found." from /v1/open-close/{ticker}/{date} on a weekend or holiday is the same thing in that endpoint's shape. Crypto's daily open-close, /v1/open-close/crypto/BTC/USD/{date}, answers HTTP 200 on a Saturday, because crypto trades over the weekend.
A US stock or ETF bar dated on a Saturday or Sunday Eastern time is not expected, and neither is a reference tickers date that returns no tickers while the days around it return a full list. Report either with the steps in How should I go about reporting a possible Massive data discrepancy?. Check the time zone first: crypto daily bars are UTC days, and a forex bar dated Sunday is expected.
A day that looks truncated is often an early close rather than a gap. The early-close record gives the real closing time.
There is no historical holiday endpoint today, so a backfill has to derive past holidays from the days with no trading data.
Related
- Does Massive have a system status page?
- Does Massive have market data outside of normal trading hours?
- How does Massive treat hourly bars when querying regular trading hours?
- What is Massive's reference data?
- Why are there missing aggregates in Massive's data?
- What are the forex market hours?
- How should I go about reporting a possible Massive data discrepancy?

