> From TickerLayer docs, Market Status: https://tickerlayer.com/docs/market-status#markets-holidays
> REST base URL https://api.tickerlayer.com, API key in the `x-api-key` header. WebSocket wss://stream.tickerlayer.com?apiKey=YOUR_API_KEY. Full API reference: https://tickerlayer.com/llms-full.txt

## Holiday calendar

**Endpoint:** `GET /markets/holidays`

Returns seeded holiday and early-close rows for a resolved regional calendar. Useful for UI hints and scheduling. Treat rows as **indicative**; schedules can change.

### Query parameters

| Parameter | Type | Description |
| --- | --- | --- |
| `market` | string | Optional if asset/symbol resolves a calendar (for example market=US). |
| `asset` | string | Optional. Used with symbol to resolve the regional calendar. |
| `symbol` | string | Optional. Used with asset to resolve the calendar. |
| `year` | integer | Optional. Defaults to the current UTC year. |
| `start` | string | Optional. yyyy-mm-dd inclusive lower bound within the year. |
| `end` | string | Optional. yyyy-mm-dd inclusive upper bound within the year. |

### Request

```bash
curl -sS "https://api.tickerlayer.com/markets/holidays?market=US&year=2026" \
  -H "x-api-key: YOUR_API_KEY"
```

```javascript
const params = new URLSearchParams({ market: "US", year: "2026" });
const res = await fetch(`https://api.tickerlayer.com/markets/holidays?${params}`, {
  headers: { "x-api-key": "YOUR_API_KEY" },
});
const data = await res.json();
```

```python
import requests

res = requests.get(
    "https://api.tickerlayer.com/markets/holidays",
    params={"market": "US", "year": "2026"},
    headers={"x-api-key": "YOUR_API_KEY"},
)
data = res.json()
```

### Response

```json
{
  "market": "US",
  "year": 2026,
  "timezone": "America/New_York",
  "holidays": [
    {
      "date": "2026-01-01",
      "name": "New Year's Day",
      "schedule": "closed",
      "is_open": false,
      "observed": true,
      "memo": null
    },
    {
      "date": "2026-11-27",
      "name": "Post-holiday early close",
      "schedule": "early_close",
      "is_open": true,
      "observed": true,
      "memo": "Early close"
    }
  ],
  "meta": {
    "calendar_version": "v1-static-2026-2027",
    "completeness": "full",
    "data_notice": "Holiday calendars are indicative and may change."
  }
}
```

### Notes

`schedule` is `closed` or `early_close`. `meta.completeness` is `full` or `partial` when a regional list is not fully seeded for the requested year. Live responses also include `meta.start` and `meta.end` range strings for the filtered holiday list. Rows on this route always carry `memo`, `null` when there is no note; the holiday object nested in a status response omits it instead, so read it defensively.
