浏览全部文档

基金 API 参考

ETF 和公募基金的价格、净值、历史和分配

概览

ETF 和公募基金的价格、历史价格、分配、简介与搜索。每个请求都需要 Bearer 密钥,REST 与 MCP 共用同一个额度余额。

ETF 的 id 就是它的标的 id,例如 ARCX:SPY。公募基金的 id 由 FUND、冒号和代码组成,例如 FUND:VFIAX。当单独的美国代码(如 SPY)只对应一个美国标的时,也可以直接使用。在基金路由上传入股票 id 会返回 404 not_found,在股票路由上传入基金 id 会通过 301 跳转到这里。

ETF 有价格。公募基金每天有一个净值(NAV),分别在 nav、previous_nav 和 date 中给出。价格响应带有 type 字段,说明你拿到的是哪一种。

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

每个账户可获得的内容

查看所有账户
ETF 最新价格在线
公募基金净值最新净值
日 K 线和历史分配完整历史数据
一分钟 K 线(仅 ETF)已包含
搜索与简介已包含

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

  • 公募基金净值是日终数值,从不延迟。一旦距今超过下一个工作日,即为过期。
  • 公募基金没有一分钟 K 线。请求会返回 400 invalid_interval。
  • 公募基金的日 K 线就是它的净值:开盘价、最高价、最低价和收盘价是同一个数,没有成交量。
  • 在数据源提供之前,分配记录中的 kind 会被省略。

端点

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

单只基金的概况

GET /v1/funds/{id}

基金的代码、名称、类型(etf 或 mutual_fund)、交易所(仅 ETF)、国家和币种,与我们的代码列表一致。所有账户均可使用。未知的字段会被省略。

MCP:工具 funds, action profile。

参数

参数位置必填类型含义
id路径参数是字符串基金 id。ETF 即其标的 id:交易所的四字母代码、冒号和代码(ARCX:SPY)。公募基金由 FUND、冒号和代码组成(FUND:VFIAX)。当单独的美国代码(如 SPY)只对应一个美国标的时,也可直接使用;响应中会返回规范 id。

响应字段

字段类型传入含义
id字符串总是规范基金 id。
symbol字符串总是基金的代码。
name字符串总是名称,与我们的代码列表一致。
type取值之一:etf、mutual_fund总是品种类型。
mic字符串可选交易所的四字母代码。公募基金省略(无交易所)。
country字符串可选基金所属国家,三个字母。
currency字符串总是价格的币种。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/funds/ARCX:SPY"
响应示例
{
  "id": "ARCX:SPY",
  "symbol": "SPY",
  "name": "SPDR S&P 500 ETF Trust",
  "type": "etf",
  "mic": "ARCX",
  "country": "USA",
  "currency": "USD"
}

单只基金的最新价格

GET /v1/funds/{id}/price

ETF 返回最新成交价,格式同股票价格并附加 type: etf;公募基金返回最新净值(type: mutual_fund:nav、previous_nav、change、change_percent 和净值对应的 date;为日终数值,从不延迟,超过下一个工作日则为 stale)。change_percent 以百分比表示。传入股票 id 会返回 404 not_found。

MCP:工具 funds, action price。

参数

参数位置必填类型含义
id路径参数是字符串基金 id。ETF 即其标的 id:交易所的四字母代码、冒号和代码(ARCX:SPY)。公募基金由 FUND、冒号和代码组成(FUND:VFIAX)。当单独的美国代码(如 SPY)只对应一个美国标的时,也可直接使用;响应中会返回规范 id。

响应字段

字段类型传入含义
id字符串总是规范的标的 id。
symbol字符串总是该交易所上的股票代码。
currency字符串总是所有价格字段的币种。便士会换算为英镑。
price字符串可选最新成交价,单位为 currency。
previous_close字符串可选上一交易日的收盘价。未知时省略。
change字符串可选price 减去 previous_close。previous_close 省略时它也省略。
change_percent字符串可选相对 previous_close 的涨跌幅,以百分比表示(1.5 表示 1.5%)。
volume字符串可选今日成交股数。未知时省略,延迟数据中一律省略。
market_session取值之一:pre、open、post、closed可选标的所在交易所在 timestamp 时的状态:pre、open、post 或 closed。只有美国交易所有 pre 和 post。
timestamp日期时间可选价格的有效时间(UTC,精确到整秒)。
stale布尔值总是交易所开盘期间价格超过 15 分钟未更新,或无法刷新时为 true。休市期间不会被视为过期。
delayed恒为 true可选不返回:所有账户的价格都是实时的。
type取值之一:etf、mutual_fund总是ETF 为 etf,公募基金为 mutual_fund。
nav字符串可选每份净值,币种为 currency。
previous_nav字符串可选前一日的净值。未知时省略。
date日期可选净值对应的日期(YYYY-MM-DD)。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/funds/ARCX:SPY/price"
响应示例
{
  "id": "ARCX:SPY",
  "symbol": "SPY",
  "currency": "USD",
  "price": "578.12",
  "previous_close": "576.40",
  "change": "1.72",
  "change_percent": "0.30",
  "volume": "61230500",
  "market_session": "open",
  "timestamp": "2026-10-26T15:42:00Z",
  "stale": false,
  "type": "etf"
}

最多 50 只基金的最新价格

GET /v1/funds/prices

返回所列每只基金的最新价格:ETF 的最新成交价或公募基金的最新净值。每个返回价格的 id 计一次调用,一次性扣费:如果你的余额不足以支付已解析的 id,整个请求会被拒绝并返回 402 insufficient_credits。未返回价格的 id 列在 errors 中,不收费。change_percent 以百分比表示。

最多发送 50 个 id,ETF 和公募基金可以混合。批量请求一次性扣费:如果你的余额不足以支付能解析的 id,整个请求返回 402 insufficient_credits。

MCP:工具 funds, action prices。

参数

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

响应字段

字段类型传入含义
prices对象数组总是按 id 给出每个已解析 id 的价格。
prices[].id字符串总是规范的标的 id。
prices[].symbol字符串总是该交易所上的股票代码。
prices[].currency字符串总是所有价格字段的币种。便士会换算为英镑。
prices[].price字符串可选最新成交价,单位为 currency。
prices[].previous_close字符串可选上一交易日的收盘价。未知时省略。
prices[].change字符串可选price 减去 previous_close。previous_close 省略时它也省略。
prices[].change_percent字符串可选相对 previous_close 的涨跌幅,以百分比表示(1.5 表示 1.5%)。
prices[].volume字符串可选今日成交股数。未知时省略,延迟数据中一律省略。
prices[].market_session取值之一:pre、open、post、closed可选标的所在交易所在 timestamp 时的状态:pre、open、post 或 closed。只有美国交易所有 pre 和 post。
prices[].timestamp日期时间可选价格的有效时间(UTC,精确到整秒)。
prices[].stale布尔值总是交易所开盘期间价格超过 15 分钟未更新,或无法刷新时为 true。休市期间不会被视为过期。
prices[].delayed恒为 true可选不返回:所有账户的价格都是实时的。
prices[].type取值之一:etf、mutual_fund总是ETF 为 etf,公募基金为 mutual_fund。
prices[].nav字符串可选每份净值,币种为 currency。
prices[].previous_nav字符串可选前一日的净值。未知时省略。
prices[].date日期可选净值对应的日期(YYYY-MM-DD)。
errors对象数组总是未返回价格的 id。不计费。
errors[].id字符串总是请求时传入的原始 id。
errors[].code取值之一:not_found、not_covered、upstream_busy总是not_found:没有这个标的。not_covered:该交易所暂无价格数据。upstream_busy:当前无法获取价格,请稍后重试。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/funds/prices?ids=ARCX:SPY,FUND:VFIAX"
响应示例
{
  "prices": [
    {
      "id": "ARCX:SPY",
      "symbol": "SPY",
      "currency": "USD",
      "price": "578.12",
      "previous_close": "576.40",
      "change": "1.72",
      "change_percent": "0.30",
      "volume": "61230500",
      "market_session": "open",
      "timestamp": "2026-10-26T15:42:00Z",
      "stale": false,
      "type": "etf"
    },
    {
      "id": "FUND:VFIAX",
      "symbol": "VFIAX",
      "currency": "USD",
      "type": "mutual_fund",
      "nav": "551.07",
      "previous_nav": "549.80",
      "change": "1.27",
      "change_percent": "0.23",
      "date": "2026-10-23",
      "stale": false
    }
  ],
  "errors": [
    {
      "id": "FUND:NOPE",
      "code": "not_found"
    }
  ]
}

单只基金的价格 K 线

GET /v1/funds/{id}/bars

日线(1d)或一分钟(1m)K 线,按时间从早到晚排列,格式同股票 K 线。公募基金的日 K 线就是其每日净值(开盘价、最高价、最低价和收盘价均为净值,无成交量);它没有一分钟 K 线(400 invalid_interval)。一分钟 K 线仅限 ETF。历史范围:全部,所有账户均可获取。每页最多 5,000 根 K 线,附带 next_cursor;游标与价格不再匹配时返回 409 cursor_expired。每页计一次调用。

如果拆股或分配改变了两页之间的历史数据,游标将失效并返回 409 cursor_expired。

MCP:工具 funds, action bars。

参数

参数位置必填类型含义
id路径参数是字符串基金 id。ETF 即其标的 id:交易所的四字母代码、冒号和代码(ARCX:SPY)。公募基金由 FUND、冒号和代码组成(FUND:VFIAX)。当单独的美国代码(如 SPY)只对应一个美国标的时,也可直接使用;响应中会返回规范 id。
interval查询参数否取值之一:1d、1m1d(每个交易日一根 K 线;公募基金的 K 线是其每日净值)或 1m(一分钟 K 线:仅限 ETF)。其他值返回 400 invalid_interval。
start查询参数否字符串第一根 K线。1d:日期(YYYY-MM-DD),包含该日;省略表示取最早的一根。1m:UTC 时间(YYYY-MM-DDTHH:MM:SSZ,或表示 UTC 00:00 的日期),包含该时刻;省略表示 end 之前一天。
end查询参数否字符串最后一根 K线。1d:日期,包含该日;省略表示已出 K线的最近一个交易日。1m:UTC 时间,不包含该时刻;省略表示当前时间,或 start 之后五天。1m 的 start 与 end 之间最多相隔 5 天(400 range_too_large)。
cursor查询参数否字符串上一页返回的 next_cursor,其他参数保持不变。游标背后的价格发生变化(拆股或分红)时会失效:409 cursor_expired。

响应字段

字段类型传入含义
id字符串总是规范的标的 id。
currency字符串总是所有价格的币种。便士会换算为英镑。
adjusted布尔值总是恒为 true:价格已按拆股和分红调整。相邻两页始终一致;如果两页之间发生拆股或分红导致历史数据变化,游标会失效(409 cursor_expired),而不会把两种数据混在一起。
start字符串可选不返回:start 不会被调整。
end字符串可选不返回:日 K线不会被截断。
bars对象数组总是每页最多 5,000 根 K线。
bars[].date字符串可选交易日日期(YYYY-MM-DD)。仅日 K线有此字段,1 分钟 K线省略。
bars[].timestamp日期时间总是K线所在时段的起点(UTC):日 K线为交易所开盘时刻,1 分钟 K线为该分钟。
bars[].open字符串总是周期的第一个价格。
bars[].high字符串总是周期内最高价。
bars[].low字符串总是周期内最低价。
bars[].close字符串总是周期的最后一个价格。
bars[].volume字符串可选该时段内的成交股数。未知时省略。
next_cursor字符串总是回传该值即可读取下一页。最后一页为 null。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/funds/ARCX:SPY/bars?interval=1d&start=2026-10-01"
响应示例
{
  "id": "ARCX:SPY",
  "currency": "USD",
  "adjusted": true,
  "bars": [
    {
      "date": "2026-10-23",
      "timestamp": "2026-10-23T13:30:00Z",
      "open": "575.10",
      "high": "577.60",
      "low": "573.90",
      "close": "576.40",
      "volume": "48210300"
    }
  ],
  "next_cursor": null
}

单只基金的分配记录

GET /v1/funds/{id}/distributions

单只基金的分配记录,按除息日从新到旧排列,分页返回。所有账户均可获取完整历史。每次请求计一次调用。未知 id 返回 404 not_found。

MCP:工具 funds, action distributions。

参数

参数位置必填类型含义
id路径参数是字符串基金 id。ETF 即其标的 id:交易所的四字母代码、冒号和代码(ARCX:SPY)。公募基金由 FUND、冒号和代码组成(FUND:VFIAX)。当单独的美国代码(如 SPY)只对应一个美国标的时,也可直接使用;响应中会返回规范 id。
cursor查询参数否字符串上一页返回的 next_cursor,其他参数保持不变。

响应字段

字段类型传入含义
id字符串总是规范基金 id。
start日期可选不返回:所有账户都能获取完整历史。
distributions对象数组总是按除息日从新到旧排列。
distributions[].ex_date日期总是基金开始不含该分配交易的第一天。
distributions[].amount字符串总是每份分配金额,币种为 currency。
distributions[].currency字符串总是amount 的币种。
distributions[].pay_date日期可选发放日。未知时省略。
distributions[].record_date日期可选持有人须登记在册的日期(股权登记日)。未知时省略。
distributions[].kind取值之一:income、capital_gain可选分配的类型。数据源未说明时省略。
next_cursor字符串总是作为 cursor 传入即可读取下一页;最后一页为 null。
请求
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/funds/ARCX:SPY/distributions"
响应示例
{
  "id": "ARCX:SPY",
  "distributions": [
    {
      "ex_date": "2026-09-18",
      "amount": "1.78",
      "currency": "USD",
      "pay_date": "2026-10-30",
      "record_date": "2026-09-18"
    }
  ],
  "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该游标不是本请求返回的,或来自另一个请求。
cursor_expired409游标对应的价格已变化。请不带游标重新开始。
insufficient_credits402您的额度余额低于该请求的费用。
upstream_busy503目前无法获取价格。在批量请求中会列在 errors 中。请稍后重试。
area_unavailable503该区域目前无法响应。

此页面对你有帮助吗?