Get a year of holidays
GET/api/v2/markets/{market}/holidays/{year}
Full-day market holidays (recurring or one-off) and irregular days such as early closes and late opens, for one year
One request: one year. A successful response counts as one request
Parameters
| Name | In | Description |
|---|---|---|
marketrequired | path | Market id, as listed by GET /markets (for example nyse, lse, cme-equity-futures)Example: nyse |
yearrequired | path | Calendar year, YYYYExample: 2026 |
Example
curl https://marketcalendars.com/api/v2/markets/nyse/holidays/2026 \
-H "Authorization: Bearer mc_live_..."const res = await fetch("https://marketcalendars.com/api/v2/markets/nyse/holidays/2026", {
headers: { Authorization: `Bearer ${process.env.MARKETCALENDARS_KEY}` },
});
const data = await res.json();import os, requests
res = requests.get(
"https://marketcalendars.com/api/v2/markets/nyse/holidays/2026",
headers={"Authorization": f"Bearer {os.environ['MARKETCALENDARS_KEY']}"},
)
data = res.json()GET /api/v2/markets/nyse/holidays/2026200
{
"market": "nyse",
"year": 2026,
"timezone": "America/New_York",
"coverage": {
"from": "1995-01-01",
"to": "2051-12-31"
},
"possiblyIncomplete": false,
"holidays": [
{
"date": "2026-01-01",
"name": "New Year's Day",
"type": "recurring",
"disputed": null
},
{
"date": "2026-01-19",
"name": "Martin Luther King Jr. Day",
"type": "recurring",
"disputed": null
},
{
"date": "2026-02-16",
"name": "Presidents' Day",
"type": "recurring",
"disputed": null
}
],
"specialSessions": [
{
"date": "2026-11-27",
"name": "Day after Thanksgiving",
"kind": "early_close",
"disputed": null,
"phases": [
{
"type": "pre_market",
"start": "2026-11-27T04:00:00-05:00",
"end": "2026-11-27T09:30:00-05:00",
"tradeDate": "2026-11-27"
},
{
"type": "regular",
"start": "2026-11-27T09:30:00-05:00",
"end": "2026-11-27T13:00:00-05:00",
"tradeDate": "2026-11-27"
},
{
"type": "after_hours",
"start": "2026-11-27T13:00:00-05:00",
"end": "2026-11-27T17:00:00-05:00",
"tradeDate": "2026-11-27"
}
]
},
{
"date": "2026-12-24",
"name": "Christmas Eve",
"kind": "early_close",
"disputed": null,
"phases": [
{
"type": "pre_market",
"start": "2026-12-24T04:00:00-05:00",
"end": "2026-12-24T09:30:00-05:00",
"tradeDate": "2026-12-24"
},
{
"type": "regular",
"start": "2026-12-24T09:30:00-05:00",
"end": "2026-12-24T13:00:00-05:00",
"tradeDate": "2026-12-24"
},
{
"type": "after_hours",
"start": "2026-12-24T13:00:00-05:00",
"end": "2026-12-24T17:00:00-05:00",
"tradeDate": "2026-12-24"
}
]
}
]
}A live response from the API. Lists longer than seven items are cut to three here
Response fields
Holidays object. Fields marked | null are always present and may be null
| Field | Type | Description |
|---|---|---|
| market | string | Market id |
| year | integer | Calendar year |
| timezone | string | IANA time zone of the market |
| coverage | object | Dates we have data for |
| coverage.from | string (date) | First date with data |
| coverage.to | string (date) | Last date with data |
| possiblyIncomplete | boolean | True when the year has far fewer holidays than other years, which usually means the source has not published them yet |
| holidays | object[] | Full-day closures in date order |
| holidays[].date | string (date) | Date the market is closed |
| holidays[].name | string | Holiday name |
| holidays[].type | string | Recurring every year, or a one-off closurerecurringone_off |
| holidays[].disputed | string | null | Set when the holidays package disagrees with the source library about this date |
| specialSessions | object[] | Days the market trades irregular hours: early closes, late opens and other irregular days |
| specialSessions[].date | string (date) | Trade date of the session |
| specialSessions[].name | string | Session or event name |
| specialSessions[].kind | string | Kind of irregular dayearly_closelate_openearly_close_late_openlate_closeextra_sessionbreak_changemodified |
| specialSessions[].disputed | string | null | Set when the holidays package disagrees with the source library about this date |
| specialSessions[].phases | object[] | Phases of the irregular day |
| specialSessions[].phases[].type | string | regular is core trading; break is a lunch break; pre_market and after_hours are extended hours where the source has thempre_marketregularbreakafter_hours |
| specialSessions[].phases[].start | string (date-time) | Start, ISO 8601 with the market's UTC offset |
| specialSessions[].phases[].end | string (date-time) | End, ISO 8601 with the market's UTC offset |
| specialSessions[].phases[].tradeDate | string (date) | Trade date the phase belongs to. Differs from the calendar date for sessions that open the evening before |
Errors
- 400invalid-parameterA path or query parameter is malformed, such as a date that is not YYYY-MM-DD
- 401unauthorizedThe Authorization header is missing, malformed, or names a revoked key
- 404unknown-marketNo market has that id. GET /markets lists every id
- 404out-of-rangeThe date or year is outside the market's coverage
- 429rate-limitedThe key sent more requests in a minute than its plan's burst limit
- 429quota-exceededThe plan's requests for this period are used up