Exchange closures API reference
The days an exchange is closed, closes early or opens late, and its normal trading sessions, in the exchange's own time.
Request
GET / returns the days one exchange does not trade a full normal day, and the trading windows of a normal day. Use your Narwhal bearer key. Times are local exchange time, not UTC.
curl --request GET \
--url "https://api.narwhalapi.com/v1/calendars/exchanges/XNYS/closures?year=2026" \
--header "Authorization: Bearer $NARWHAL_API_KEY"Parameters
| Name | Type | Rule |
|---|---|---|
mic | string | Required path value. The exchange's Market Identifier Code: four uppercase letters or digits, such as XNYS. A lowercase or longer code returns 400. |
year | integer | Optional query value, 2000 to 2100. Returns that calendar year only. Left out, the answer holds every closure from 1 January of the current year on, however far ahead the calendar goes. |
There is no pagination, and no other query parameter. An unknown query parameter is ignored.
Response
A 200 answer holds the exchange, its closures in date order and its sessions. This answer is trimmed to three of the twelve closures of 2026. Thanksgiving Day is a full closure and the day after is an early close.
{
"mic": "XNYS",
"name": "New York Stock Exchange",
"timezone": "America/New_York",
"closures": [
{
"date": "2026-11-26",
"name": "Thanksgiving Day",
"holiday_key": "thanksgiving_day",
"type": "exchange",
"mic": "XNYS",
"day_type": "full",
"status": "confirmed"
},
{
"date": "2026-11-27",
"name": "Day after Thanksgiving",
"holiday_key": "day_after_thanksgiving",
"type": "exchange",
"mic": "XNYS",
"day_type": "early_close",
"closes_at": "13:00",
"status": "confirmed"
},
{
"date": "2026-12-25",
"name": "Christmas Day",
"holiday_key": "christmas_day",
"type": "exchange",
"mic": "XNYS",
"day_type": "full",
"status": "confirmed"
}
],
"sessions": [
{
"name": "Pre-market",
"opens_at": "04:00",
"closes_at": "09:30",
"valid_from": "2026-01-01"
},
{
"name": "Regular",
"opens_at": "09:30",
"closes_at": "16:00",
"valid_from": "2026-01-01"
},
{
"name": "After-hours",
"opens_at": "16:00",
"closes_at": "20:00",
"valid_from": "2026-01-01"
}
]
}B3 opens late on Ash Wednesday and gives the local name of each day. This answer shows two of the fifteen closures of 2026.
curl --request GET \
--url "https://api.narwhalapi.com/v1/calendars/exchanges/BVMF/closures?year=2026" \
--header "Authorization: Bearer $NARWHAL_API_KEY"{
"mic": "BVMF",
"name": "B3",
"timezone": "America/Sao_Paulo",
"closures": [
{
"date": "2026-02-17",
"name": "Carnival",
"holiday_key": "carnival",
"local_name": "Carnaval",
"type": "exchange",
"mic": "BVMF",
"day_type": "full",
"status": "confirmed"
},
{
"date": "2026-02-18",
"name": "Ash Wednesday",
"holiday_key": "ash_wednesday",
"local_name": "Quarta-feira de Cinzas",
"type": "exchange",
"mic": "BVMF",
"day_type": "late_open",
"opens_at": "13:00",
"status": "confirmed"
}
],
"sessions": [
{
"name": "Regular",
"opens_at": "10:00",
"closes_at": "17:55",
"valid_from": "2026-01-01"
}
]
}A provisional day comes from a government list or a moon-dependent date and can still move. This answer shows the first of the Xetra closures of 2028.
curl --request GET \
--url "https://api.narwhalapi.com/v1/calendars/exchanges/XETR/closures?year=2028" \
--header "Authorization: Bearer $NARWHAL_API_KEY"{
"mic": "XETR",
"name": "Xetra",
"timezone": "Europe/Berlin",
"closures": [
{
"date": "2028-04-14",
"name": "Good Friday",
"holiday_key": "good_friday",
"type": "exchange",
"mic": "XETR",
"day_type": "full",
"status": "provisional"
}
],
"sessions": [
{
"name": "Regular",
"opens_at": "09:00",
"closes_at": "17:30",
"valid_from": "2026-01-01"
}
]
}Fields
| Field | Type | Meaning |
|---|---|---|
mic | string | The code you asked for, on the answer and on every closure. |
name | string | The exchange's English name on the answer. On a closure it is the English name of the day. |
timezone | string | IANA time zone of the exchange, such as America/New_York. Every time in the answer is in this zone. |
closures | array | One entry for each day, or each segment of a day, that is not a full normal day. Never empty on a 200 answer. |
date | date string | Local date of the closure, YYYY-MM-DD. |
holiday_ | string | A stable key for the kind of day, such as christmas_day. |
local_ | string | Name in the local language. Left out when not available. |
type | string | Always exchange. |
segment | string | The part of the exchange the day affects, when it is not the whole exchange. Left out when the whole exchange is affected. |
day_ | string | full: the exchange is closed all day. early_close: it closes at closes_at. late_open: it opens at opens_at. |
opens_ | string | Local time as HH:MM. opens_at is set on a late_open day and closes_at on an early_close day. Both are left out on a full day. |
status | string | confirmed: the exchange's own notice or a published rule. provisional: from a government list or a moon-dependent date. A provisional day can still move. |
sessions | array | The trading windows of a normal day. Each has a name, opens_at and closes_at in local time, and valid_from, the date the window starts to apply. A lunch break shows as two windows. Not limited by year. Can be empty. |
Public holidays do not prove that an exchange is closed. Use this route for the days an exchange itself does not trade a full day. Public holidays reference
Exchanges
These 19 exchanges have a published calendar. Any other code returns 404. Years are the years that hold closures. An exchange marked with another code uses that exchange's list, so the closures match.
| MIC | Exchange | Years | Uses the list of |
|---|---|---|---|
ARCX | NYSE Arca | 2026, 2027 | XNYS |
BATS | Cboe BZX | 2026, 2027 | XNYS |
BVMF | B3 | 2026 | |
OTCM | OTC Markets | 2026, 2027 | XNYS |
XASE | NYSE American | 2026, 2027 | XNYS |
XASX | ASX | 2026, 2027 | |
XETR | Xetra | 2026 to 2032 | |
XHKG | Hong Kong Exchanges and Clearing | 2025, 2026, 2027 | |
XKAR | Pakistan Stock Exchange | 2026 | |
XKOS | KOSDAQ | 2026, 2027 | XKRX |
XKRX | Korea Exchange | 2026, 2027 | |
XLON | London | 2026, 2027 | |
XNAS | Nasdaq | 2026, 2027 | XNYS |
XNYS | New York Stock Exchange | 2026, 2027 | |
XSHG | Shanghai Stock Exchange | 2026 | |
XTAI | Taiwan Stock Exchange | 2026, 2027 | |
XTKS | Tokyo Stock Exchange | 2026, 2027 | |
XTSE | Toronto Stock Exchange | 2026, 2027 | |
XTSX | TSXV, Toronto | 2026, 2027 |
Matching MCP call
Send an authenticated POST / with Accept: application/. The tool is calendars_.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "calendars_get_exchange_closures",
"arguments": {
"mic": "BVMF",
"year": 2026
}
}
}Successful results have isError: false, the same response in structuredContent, and serialized JSON in content[0].text. Domain errors have isError: true.
Errors and credits
| Status | Code | When |
|---|---|---|
| 400 | invalid_ | The MIC is not four uppercase letters or digits, or year is not an integer from 2000 to 2100. |
| 401 | invalid_ | The key is missing or invalid. |
| 402 | insufficient_ | The balance cannot pay for the call. The answer carries top_up_url. |
| 404 | not_found | No calendar is published for the MIC, or the exchange holds no closure for the year you asked for. The detail text reads the same in both cases. |
| 429 | rate_ | The per-minute limit is reached. |
| 503 | database_ | The data store is temporarily unavailable. Retry shortly. |
A successful request costs one call on the Calendars API code, $2 per 1,000 calls, however many closures it returns. Errors cost nothing. Shared error details
Was this page helpful?