浏览全部文档

股票指数 API 参考

18 个指数的点位和历史

概览

18 个股票和波动率指数的点位及点位历史。每个请求都需要 Bearer 密钥,REST 和 MCP 共用同一余额。

id 是指数的标准代码,例如 SPX 表示 S&P 500,NDX 表示 Nasdaq-100,DJI 表示道琼斯工业平均指数。不区分大小写。列表路由返回每个 id 及其名称、地区和币种。

指数的日线历史数据到位后,价格会带有前收盘价、涨跌和涨跌百分比。

基础 URL: https://api.narwhalapi.com。 MCP 工具是 indices, with one action ,适用于下方每个路由。

每个账户可获得的内容

查看所有账户
最新点位在线
日线柱状数据完整历史数据
1 分钟 K 线最近 12 个月
指数列表已包含

查看 价格 了解每次调用的费用。请求按其所属 API 的价格计费,除非某个路由另有说明。

  • 历史从我们持有数据的时间开始。S&P 500 始于 2023 年 2 月。
  • 波动率指数(VIX、OVX、GVZ)不是货币金额,因此其响应不含币种。
  • market_session 按指数公布的交易时间取 open 或 closed。已休市的指数返回最后点位,不算过期。开市中的指数若点位超过 15 分钟未更新,则为过期。
  • 日 K 线对应一个交易日,在 00:00 UTC 出现。当天尚未完成的 K 线从不显示。
  • K 线不含成交量。一分钟 K 线保留 12 个月,一次请求最多覆盖 5 天。
  • 批量请求最多包含 50 个 id,每个返回点位的 id 计一次调用。未知 id 列在 errors 中,不计费。

端点

每个路由都是 GET 请求,并需要在以下请求头中携带你的密钥: Authorization: Bearer 标头。示例仅展示响应的结构,并非实时数据。

我们提供价格的指数

GET /v1/indices

列出我们提供价格的所有指数序列,按 id 排序,附带名称和单位。数据读自我们自己的列表,所有账户均可使用,计一次调用。

MCP:工具 indices, action list。

参数

此路由不接受参数。

响应字段

字段类型传入含义
indices对象数组总是我们提供价格的所有指数,按 id 排序。
indices[].id字符串总是指数代码,例如 SPX。
indices[].name字符串总是指数的名称。
indices[].region取值之一:us、uk、europe、global、asia总是成分股交易的地区。
indices[].currency字符串可选指数计价的币种。波动率指数省略此项,因为它不是货币金额。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/indices"
响应示例
{
  "indices": [
    {
      "id": "SPX",
      "name": "S&P 500",
      "region": "us",
      "currency": "USD"
    },
    {
      "id": "VIX",
      "name": "Cboe Volatility Index",
      "region": "us"
    }
  ]
}

单个指数序列的最新价格

GET /v1/indices/{id}/price

最新价格。market_session 按序列的交易时间取 open 或 closed;已休市的序列返回最后价格,只有开市中的序列在最近 15 分钟内没有价格时,stale 才为 true。previous_close 是前一交易日的收盘价,change_percent 以百分比表示。

MCP:工具 indices, action price。

参数

参数位置必填类型含义
id路径参数是字符串指数 id,例如 SPX、NDX 或 DJI。不区分大小写。

响应字段

字段类型传入含义
id字符串总是指数代码。
name字符串总是名称,与我们的代码列表一致。
currency字符串可选指数计价的币种。波动率指数省略此项,因为它不是货币金额。
price字符串总是指数的最新点位。
previous_close字符串可选前一交易日的收盘价。未知时省略。
change字符串可选price 减去 previous_close。
change_percent字符串可选涨跌百分比(1.5 表示 1.5%)。与 change 一同省略。
market_session取值之一:open、closed总是序列按公布的交易时间交易时为 open,否则为 closed。已休市的序列仍返回最后价格;处于交易时间内的假日显示为 open 并标记为 stale。
timestamp日期时间总是价格的有效时间(UTC,精确到整秒)。
stale布尔值总是序列处于开市状态且价格超过 15 分钟未更新或无法刷新时为 true。已休市的序列不算过期。
delayed恒为 true可选不返回:所有账户的价格都是实时的。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/indices/SPX/price"
响应示例
{
  "id": "SPX",
  "name": "S&P 500",
  "currency": "USD",
  "price": "7696.46",
  "previous_close": "7681.2",
  "change": "15.26",
  "change_percent": "0.2",
  "market_session": "open",
  "timestamp": "2026-10-29T18:38:00Z",
  "stale": false
}

最多 50 个指数序列的最新价格

GET /v1/indices/prices

返回所列每个 id 的最新价格。每个返回价格的 id 计一次调用,一次性扣费:如果你的余额不足以支付已解析的 id,整个请求会被拒绝并返回 402 insufficient_credits。未返回价格的 id 列在 errors 中(作为 id),不收费;如果没有任何 id 能解析,响应仍为 200,prices 为空。previous_close 是前一交易日的收盘价,change_percent 以百分比表示。

最多传入 50 个 id。批量请求一次性计费:如果余额不足以支付能解析出的 id,整个请求返回 402 insufficient_credits。

MCP:工具 indices, action prices。

参数

参数位置必填类型含义
ids查询参数是字符串以逗号分隔的 id,去重后最多 50 个。每个 id 的规则与单个价格路由相同。每个返回价格的 id 计一次调用。

响应字段

字段类型传入含义
prices对象数组总是按 id 给出每个已解析 id 的价格。
prices[].id字符串总是指数代码。
prices[].name字符串总是名称,与我们的代码列表一致。
prices[].currency字符串可选指数计价的币种。波动率指数省略此项,因为它不是货币金额。
prices[].price字符串总是指数的最新点位。
prices[].previous_close字符串可选前一交易日的收盘价。未知时省略。
prices[].change字符串可选price 减去 previous_close。
prices[].change_percent字符串可选涨跌百分比(1.5 表示 1.5%)。与 change 一同省略。
prices[].market_session取值之一:open、closed总是序列按公布的交易时间交易时为 open,否则为 closed。已休市的序列仍返回最后价格;处于交易时间内的假日显示为 open 并标记为 stale。
prices[].timestamp日期时间总是价格的有效时间(UTC,精确到整秒)。
prices[].stale布尔值总是序列处于开市状态且价格超过 15 分钟未更新或无法刷新时为 true。已休市的序列不算过期。
prices[].delayed恒为 true可选不返回:所有账户的价格都是实时的。
errors对象数组总是未返回价格的 id。不计费。
errors[].id字符串总是请求时传入的原始 id。
errors[].code始终为 "not_found"总是not_found:没有这个序列。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/indices/prices?ids=SPX,NDX,DJI"
响应示例
{
  "prices": [
    {
      "id": "SPX",
      "name": "S&P 500",
      "currency": "USD",
      "price": "7696.46",
      "previous_close": "7681.2",
      "change": "15.26",
      "change_percent": "0.2",
      "market_session": "open",
      "timestamp": "2026-10-29T18:38:00Z",
      "stale": false
    },
    {
      "id": "NDX",
      "name": "Nasdaq-100",
      "currency": "USD",
      "price": "27310.5",
      "previous_close": "27264.9",
      "change": "45.6",
      "change_percent": "0.17",
      "market_session": "open",
      "timestamp": "2026-10-29T18:38:00Z",
      "stale": false
    }
  ],
  "errors": [
    {
      "id": "XX",
      "code": "not_found"
    }
  ]
}

单个指数序列的价格 K 线

GET /v1/indices/{id}/bars

日线(1d,每个交易日一根 K 线)或一分钟(1m)K 线,按时间从早到晚排列。某一天的 K 线在该日之后的 00:00 UTC 发布;当天尚未完成的 K 线从不显示。一分钟 K 线保留 12 个月。历史范围:全部,所有账户均可获取。每页最多 5,000 根 K 线,附带 next_cursor。每页计一次调用。

MCP:工具 indices, action bars。

参数

参数位置必填类型含义
id路径参数是字符串指数 id,例如 SPX、NDX 或 DJI。不区分大小写。
interval查询参数否取值之一:1d、1m1d(每个交易日一根 K 线,日期为其所属交易日)或 1m(一分钟 K 线;保留 12 个月)。其他值返回 400 invalid_interval。
start查询参数否字符串第一根 K线。1d:日期(YYYY-MM-DD),包含该日;省略表示取最早的一根。1m:UTC 时间(YYYY-MM-DDTHH:MM:SSZ,或表示 UTC 00:00 的日期),包含该时刻;省略表示 end 之前一天。
end查询参数否字符串最后一根 K 线。1d:日期,含当日;省略表示最近已完成的一天。1m:UTC 时间,不含该时刻;省略表示当前时间,或 start 之后五天。1m 的 start 与 end 之间最多 5 天(400 range_too_large)。
cursor查询参数否字符串上一页的 next_cursor,其余参数保持一致。

响应字段

字段类型传入含义
id字符串总是
currency字符串可选指数计价的币种。波动率指数省略此项,因为它不是货币金额。
start字符串可选不返回:start 不会被调整。
end字符串可选不返回:日 K线不会被截断。
bars对象数组总是每页最多 5,000 根 K线。
bars[].timestamp日期时间总是K 线周期的起点(UTC):日 K 线为交易日的 00:00,一分钟 K 线为该分钟。
bars[].open字符串总是周期的第一个价格。
bars[].high字符串总是周期内最高价。
bars[].low字符串总是周期内最低价。
bars[].close字符串总是周期的最后一个价格。
next_cursor字符串总是回传该值即可读取下一页。最后一页为 null。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/indices/SPX/bars?interval=1d&start=2026-10-01"
响应示例
{
  "id": "SPX",
  "currency": "USD",
  "bars": [
    {
      "timestamp": "2026-10-28T00:00:00Z",
      "open": "7655.1",
      "high": "7702.4",
      "low": "7640.8",
      "close": "7681.2"
    }
  ],
  "next_cursor": null
}

错误

错误使用通用的 problem 结构,并带有 request_id。查看 API 错误码与额度 了解该结构和额度相关的响应头。失败的请求不计费。

代码状态含义
invalid_query400参数缺失、未知、重复或超出范围。
invalid_id400id 或交易对的写法不符合此 API 的要求。
too_many_ids400批量请求包含的 id 超过 50 个。
invalid_interval400interval 不是 1d 或 1m,或该品种不支持。
range_too_large400时间窗口超过该路由允许的长度。
not_found404没有这个标的、基金或交易对。
invalid_cursor400该游标不是本请求返回的,或来自另一个请求。
insufficient_credits402您的额度余额低于该请求的费用。
area_unavailable503该区域目前无法响应。

此页面对你有帮助吗?