> Source: https://ashareapi.com/docs/endpoints/trade-calendar/  ·  Markdown version for LLMs / AI agents

免费端点 · 免费

# 交易日历（开市/休市 · 年末最后交易日） API
 A 股交易日历：逐个日期给出是否开市，以及该日是不是本周/本月/本季/本年的最后一个交易日（做结算日、到期日、调仓日的时候要用）。

和 /v1/calendar 的区别：那个是个股事件日历（分红/解禁/财报披露…），这个只讲市场开不开市。两个都要的话各调一次。

三种查询方式（三选一）：
- 不传参数 → 当月整月
- date=2026-10-16 → 单日
- start+end → 任意区间；或 year=2026 → 整年

trading_only=true：只返回开市日（整年约 242 行，比 365 行更好用）。

⚠️ limit 默认已按查询范围自动补足（年/区间默认给满一年 400 行上限），不会截断；要翻页用 offset。

data 是排版好的表格；程序化读取用 structured（单表，[{列: 值}]）。列为：日期 / 是否交易日 / 本周最后交易日 / 本季最后交易日 / 本年最后交易日 / 本月最后交易日。

⚠️ 本端点免费（不需要 API Key）。
 免费 `GET /v1/trade-calendar`
 接口签名
```
GET /v1/trade-calendar?date=2026-09-16
```
 一行可跑

```
curl "https://api.ashareapi.com/v1/trade-calendar?date=2026-09-16"
```
 参数：`date · start · end · year · trading_only · limit · offset` 带 * 为必填

## 快速开始
 把下面的代码里的 Key 换成你的（免费端点无需 Key，直接调）：
 curl

```
# 免费端点：无需 API Key（匿名即可调用）
curl "https://api.ashareapi.com/v1/trade-calendar?date=2026-09-16"
```
 Python

```
import requests

r = requests.get(
 "https://api.ashareapi.com/v1/trade-calendar",
 params={},
 timeout=30,
)
print(r.json())
```
 JavaScript

```
const r = await fetch("https://api.ashareapi.com/v1/trade-calendar?date=2026-09-16");
console.log(await r.json());
```

## 参数
 |
| | 参数 | 类型 | 必填 | 说明

| | date | string | 否 | 单日 YYYY-MM-DD；留空则看 year/start+end，都空=当月

| | start | string | 否 | 区间起始日 YYYY-MM-DD（与 end 配对）

| | end | string | 否 | 区间结束日 YYYY-MM-DD（与 start 配对）

| | year | string | 否 | 整年，如 2026（与 date/start+end 三选一）

| | trading_only | boolean | 否 | true=只返回开市日

| | limit | integer | 否 | 返回行数上限（0=按范围自动：单日/当月不补，年/区间补满 400）

| | offset | integer | 否 | 跳过前 N 行（翻页用）

 `date` string
 单日 YYYY-MM-DD；留空则看 year/start+end，都空=当月

 `start` string
 区间起始日 YYYY-MM-DD（与 end 配对）

 `end` string
 区间结束日 YYYY-MM-DD（与 start 配对）

 `year` string
 整年，如 2026（与 date/start+end 三选一）

 `trading_only` boolean
 true=只返回开市日

 `limit` integer
 返回行数上限（0=按范围自动：单日/当月不补，年/区间补满 400）

 `offset` integer
 跳过前 N 行（翻页用）

 返回
 统一返回信封： `{ ok, endpoint, tier, elapsed_ms, source, data }`
 数据在 `data` 字段；上游为空时 `ok:false` 且**不扣次数**。

 限流与额度
 免费端点无需 Key（匿名 5 次/分，解一次 PoW 可到 15 次/分；每次最多 250 根 K 线、每天最多 10 万条）。付费端点按档位限流：体验 30 · 标准 120 · 专业 300 · 不限量 600 次/分；买断档按总量计（不用完不过期）。
[看错误码对照表 →](/docs/errors)

## 常见问题

### 通用问题（所有端点通用）
 这些端点需要 API Key 吗？
 **免费端点不需要**：health、challenge、quote、kline、hot、market-overview、changedist 匿名即可调用。**付费端点需要**：在请求头带 `Authorization: Bearer `。⚠️ 匿名额度**按调用者类型分级**：浏览器（真人）**5 次/分**；脚本 / SDK / AI Agent（curl、requests、axios、openai 等 UA）**2 次/分** —— 自动化流量更易被滥用。解一次 PoW 挑战（`GET /v1/challenge`，再带 `X-PoW` 头）可提到 **15 次/分**，与类型无关。⚠️ 另外，匿名调用**单次最多取 250 根 K 线、每天最多 10 万条** —— 要一次拿满 1212 根或不限日量，请用 API Key。

 返回为空或上游报错时，会扣我的调用次数吗？
 **不会**。上游失败或空结果时返回 `ok:false`，并**自动退回**本次计费（total_calls / usage_log / ep_log 三处同时回滚）。只有真正取到数据的请求才计入用量。

 数据多久更新一次？
 行情类（quote / kline / orderbook / changedist）为**实时或当日**；财务、股东、分红、事件等为**上游披露后 T+1 内**。响应里的 `source` 字段标明本次实际命中的数据通道。

 一次请求能批量拿多只股票吗？
 **不能**。`code` 是单值参数，一次一只；批量请并发调用（注意各自档位的每分钟限流）。

 怎么在 Claude / Cursor / ChatGPT 里直接调用？
 配一次 MCP 即可，之后直接问 AI「查一下……」它会自己调。MCP 暴露 60 个工具，覆盖行情 / 财务 / 选股 / 板块 / 宏观。

## 相关端点
 [服务健康检查](/docs/endpoints/health)[获取 PoW 挑战（匿名提额用）](/docs/endpoints/challenge)[实时行情快照](/docs/endpoints/quote)[K线（分钟/日/周/月/季/年）](/docs/endpoints/kline)[文档检索（字段 / 口径 / 常见误用）](/docs/endpoints/wiki)[热度榜（5 类，字段各不相同）](/docs/endpoints/hot)[市场总览（大盘画像）](/docs/endpoints/market-overview)[涨跌分布（市场广度）](/docs/endpoints/changedist)

 要把它接进 AI Agent？
 配一次 MCP，之后问 AI「查一下……」它自己调。

 [MCP 接入说明](/mcp)[查看定价](/pricing)

 [← 返回完整端点清单](/endpoints)
