Get the session for a trade date
GET/api/v2/markets/{market}/sessions/{date}
The phases of one trade date with start and end times, whether the day is regular or irregular and why, and whether it is a settlement day. For markets that open the evening before (CME Globex), the regular phase starts on the previous calendar date and still carries this trade date
One request: one day. 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 |
daterequired | path | Trade date, YYYY-MM-DDExample: 2026-11-27 |
Example
curl https://marketcalendars.com/api/v2/markets/nyse/sessions/2026-11-27 \
-H "Authorization: Bearer mc_live_..."const res = await fetch("https://marketcalendars.com/api/v2/markets/nyse/sessions/2026-11-27", {
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/sessions/2026-11-27",
headers={"Authorization": f"Bearer {os.environ['MARKETCALENDARS_KEY']}"},
)
data = res.json(){
"market": "nyse",
"tradeDate": "2026-11-27",
"timezone": "America/New_York",
"isTradingDay": true,
"schedule": "irregular",
"reasons": [
{
"type": "early_close",
"name": "Day after Thanksgiving"
}
],
"isSettlementDay": true,
"nonSettlementReason": null,
"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"
}
],
"dataSource": "pandas_market_calendars 5.5.0"
}A live response from the API. Lists longer than seven items are cut to three here
Response fields
Session object. Fields marked | null are always present and may be null
| Field | Type | Description |
|---|---|---|
| market | string | Market id |
| tradeDate | string (date) | The trade date asked for |
| timezone | string | IANA time zone of the market |
| isTradingDay | boolean | Whether the market trades on this trade date |
| schedule | string | irregular when the day departs from the regular weekly hoursregularirregular |
| reasons | object[] | Why the day is irregular. Empty on regular days and weekends |
| reasons[].type | string | Why the day departs from the regular weekly scheduleholidayearly_closelate_openlate_closeextra_sessionbreak_changemodified_hoursinterruption |
| reasons[].name | string | null | Holiday or event name from the source |
| isSettlementDay | boolean | null | Whether trades settle on this day. Null where we have no settlement calendar |
| nonSettlementReason | string | null | Why a trading day is not a settlement day |
| disputed | string | null | Set when the holidays package disagrees with the source library about this date |
| phases | object[] | Phases in time order. Empty when the market does not trade |
| 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 |
| phases[].start | string (date-time) | Start, ISO 8601 with the market's UTC offset |
| phases[].end | string (date-time) | End, ISO 8601 with the market's UTC offset |
| phases[].tradeDate | string (date) | Trade date the phase belongs to. Differs from the calendar date for sessions that open the evening before |
| dataSource | string | Source library and version |
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