Get the regular weekly hours
GET/api/v2/markets/{market}/regular-hours
The regular hours for each weekday in force on a date, with the dates that schedule starts and ends. Holidays and irregular days are not applied
One request: one schedule. 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 |
dateoptional | query | Date the schedule is in force, YYYY-MM-DD. Defaults to today in the market's time zoneExample: 2026-11-27 |
Example
curl https://marketcalendars.com/api/v2/markets/hkex/regular-hours?date=2026-11-27 \
-H "Authorization: Bearer mc_live_..."const res = await fetch("https://marketcalendars.com/api/v2/markets/hkex/regular-hours?date=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/hkex/regular-hours?date=2026-11-27",
headers={"Authorization": f"Bearer {os.environ['MARKETCALENDARS_KEY']}"},
)
data = res.json()GET /api/v2/markets/hkex/regular-hours?date=2026-11-27200
{
"market": "hkex",
"timezone": "Asia/Hong_Kong",
"date": "2026-11-27",
"effectiveFrom": "2011-03-01",
"effectiveTo": null,
"days": [
{
"weekday": 1,
"name": "Monday",
"isTradingDay": true,
"phases": [
{
"type": "regular",
"start": "09:30",
"end": "12:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "break",
"start": "12:00",
"end": "13:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "regular",
"start": "13:00",
"end": "16:00",
"startDayOffset": 0,
"endDayOffset": 0
}
]
},
{
"weekday": 2,
"name": "Tuesday",
"isTradingDay": true,
"phases": [
{
"type": "regular",
"start": "09:30",
"end": "12:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "break",
"start": "12:00",
"end": "13:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "regular",
"start": "13:00",
"end": "16:00",
"startDayOffset": 0,
"endDayOffset": 0
}
]
},
{
"weekday": 3,
"name": "Wednesday",
"isTradingDay": true,
"phases": [
{
"type": "regular",
"start": "09:30",
"end": "12:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "break",
"start": "12:00",
"end": "13:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "regular",
"start": "13:00",
"end": "16:00",
"startDayOffset": 0,
"endDayOffset": 0
}
]
},
{
"weekday": 4,
"name": "Thursday",
"isTradingDay": true,
"phases": [
{
"type": "regular",
"start": "09:30",
"end": "12:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "break",
"start": "12:00",
"end": "13:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "regular",
"start": "13:00",
"end": "16:00",
"startDayOffset": 0,
"endDayOffset": 0
}
]
},
{
"weekday": 5,
"name": "Friday",
"isTradingDay": true,
"phases": [
{
"type": "regular",
"start": "09:30",
"end": "12:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "break",
"start": "12:00",
"end": "13:00",
"startDayOffset": 0,
"endDayOffset": 0
},
{
"type": "regular",
"start": "13:00",
"end": "16:00",
"startDayOffset": 0,
"endDayOffset": 0
}
]
},
{
"weekday": 6,
"name": "Saturday",
"isTradingDay": false,
"phases": []
},
{
"weekday": 7,
"name": "Sunday",
"isTradingDay": false,
"phases": []
}
]
}A live response from the API. Lists longer than seven items are cut to three here
Response fields
RegularHours object. Fields marked | null are always present and may be null
| Field | Type | Description |
|---|---|---|
| market | string | Market id |
| timezone | string | IANA time zone of the market |
| date | string (date) | Date the schedule is in force |
| effectiveFrom | string (date) | null | First date of this schedule. Null when it starts before our data |
| effectiveTo | string (date) | null | Last date of this schedule. Null when it runs past our data |
| days | object[] | Seven entries, Monday first |
| days[].weekday | integer | ISO weekday, 1 = Monday to 7 = Sunday |
| days[].name | string | Weekday name |
| days[].isTradingDay | boolean | Whether the weekday is a regular trading day |
| days[].phases | object[] | Regular phases in time order. Empty on non-trading weekdays |
| days[].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 |
| days[].phases[].start | string | Local wall-clock time, HH:MM |
| days[].phases[].end | string | Local wall-clock time, HH:MM |
| days[].phases[].startDayOffset | integer | Days from the trade date: -1 when the phase starts the evening before |
| days[].phases[].endDayOffset | integer | Days from the trade date to the end |
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