すべてのドキュメントを閲覧

ETF・投資信託APIリファレンス

ETF と投資信託の価格、NAV、履歴、分配

概要

ETF と投資信託の価格、価格履歴、分配金、プロファイル、検索。すべてのリクエストに Bearer キーが必要で、REST と MCP は同じクレジット残高から差し引かれます。

ETF の ID は銘柄 ID で、たとえば ARCX:SPY です。投資信託の ID は FUND、コロン、ティッカーの順で、たとえば FUND:VFIAX です。SPY のような米国ティッカーだけでも、米国の銘柄が1つに決まる場合は使えます。ファンド用ルートに株式の ID を送ると 404 not_found を返します。株式用ルートにファンドの ID を送ると、301 でこちらに移動します。

ETF には価格があります。投資信託には1日1回の基準価額(NAV)があり、nav、previous_nav、date で返します。価格のレスポンスには、どちらを受け取ったかを示す type フィールドがあります。

ベースURL: https://api.narwhalapi.com。 MCP ツールは次のとおりです: funds, with one action 以下の各ルートに対応します。

すべてのアカウントで利用できるもの

課金額すべてのアカウント
ETF の最新価格ライブ
投資信託の NAV最新の NAV
日次バーと過去の分配全期間の履歴
1分バー(ETF のみ)含まれる
検索とプロファイル含まれる

参照: 料金表 で、呼び出し1回の料金を確認できます。ルートに別の記載がない限り、リクエストはそのAPIの料金で課金されます。

  • 投資信託の NAV は終値ベースの日次の値で、遅延することはありません。翌営業日より古くなると古い値(stale)になります。
  • 投資信託には1分バーがありません。要求すると 400 invalid_interval を返します。
  • 投資信託の日次バーは NAV です。始値、高値、安値、終値は同じ値で、出来高はありません。
  • 分配の kind は、情報源が値を提供するまで省略されます。

エンドポイント

すべてのルートは GET で、キーを次のヘッダーで渡す必要があります: Authorization: Bearer ヘッダー。例はレスポンスの形を示すもので、ライブデータではありません。

ファンド1件のプロフィール

GET /v1/funds/{id}

自社のシンボル一覧にあるとおりの、ファンドのシンボル、名称、種別(etf または mutual_fund)、取引所(ETF のみ)、国、通貨を返します。すべてのアカウントで利用できます。不明な項目は省略されます。

MCP: ツール funds, action profile。

パラメータ

パラメータ場所必須種別意味
idパスはい文字列ファンド ID。ETF は銘柄 ID で、取引所の4文字コード、コロン、ティッカーの順です(ARCX:SPY)。投資信託は FUND、コロン、ティッカーの順です(FUND:VFIAX)。SPY のような米国ティッカーだけでも、米国の銘柄が1つに決まる場合は使えます。レスポンスには正規の ID が入ります。

レスポンスフィールド

フィールド種別送信意味
id文字列常に正規のファンド ID。
symbol文字列常にファンドのティッカー。
name文字列常に自社のシンボル一覧にあるとおりの名称。
typeetf、mutual_fund のいずれか常に銘柄の種類。
mic文字列任意取引所の4文字コード。投資信託には取引所がないため省略されます。
country文字列任意ファンドの国。3文字。
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"
}

ファンド1件の最新価格

GET /v1/funds/{id}/price

ETF の直近価格を、株価と同じ形式に type: etf を加えて返します。投資信託の場合は最新の NAV を返します(type: mutual_fund、nav、previous_nav、change、change_percent、NAV の date。終値ベースの日次の値で遅延せず、翌営業日より古くなると stale になります)。change_percent はパーセント単位です。株式の ID は 404 not_found です。

MCP: ツール funds, action price。

パラメータ

パラメータ場所必須種別意味
idパスはい文字列ファンド ID。ETF は銘柄 ID で、取引所の4文字コード、コロン、ティッカーの順です(ARCX:SPY)。投資信託は FUND、コロン、ティッカーの順です(FUND:VFIAX)。SPY のような米国ティッカーだけでも、米国の銘柄が1つに決まる場合は使えます。レスポンスには正規の 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任意送信されません。価格はすべてのアカウントでリアルタイムです。
typeetf、mutual_fund のいずれか常にETF は etf、投資信託は mutual_fund。
nav文字列任意1口あたりの純資産価値。単位は currency。
previous_nav文字列任意前日の NAV。不明な場合は省略されます。
date日付任意NAV の対象日(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 は直近価格、投資信託は最新の NAV です。価格を返した ID ごとに1回の呼び出しとして数え、一括で課金します。解決できた ID の分を残高で支払えない場合、リクエスト全体が 402 insufficient_credits で拒否されます。価格を返さなかった ID は errors に並び、課金されません。change_percent はパーセント単位です。

ETF と投資信託を合わせて最大50件の ID を送れます。バッチは一括で課金されます。解決できた ID の分を残高で支払えない場合、リクエスト全体が 402 insufficient_credits を返します。

MCP: ツール funds, action prices。

パラメータ

パラメータ場所必須種別意味
idsクエリはい文字列カンマ区切りのファンド ID。重複を除いて最大50件です。各 ID は単一価格ルートと同じ規則に従います。価格を返した ID ごとに1回の呼び出しとして数えます。

レスポンスフィールド

フィールド種別送信意味
pricesオブジェクトの配列常に解決できた ID ごとに1つの価格を、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[].typeetf、mutual_fund のいずれか常にETF は etf、投資信託は mutual_fund。
prices[].nav文字列任意1口あたりの純資産価値。単位は currency。
prices[].previous_nav文字列任意前日の NAV。不明な場合は省略されます。
prices[].date日付任意NAV の対象日(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"
    }
  ]
}

ファンド1件の価格バー

GET /v1/funds/{id}/bars

日次(1d)または1分(1m)のバーを、株式のバーと同じ形式で古い順に返します。投資信託の日次バーは日次の NAV です(始値、高値、安値、終値は NAV で、出来高はありません)。1分バーはありません(400 invalid_interval)。1分バーは ETF のみです。履歴はすべてのアカウントで全期間を取得できます。1ページ最大5,000バーで、next_cursor を返します。価格と一致しなくなったカーソルは 409 cursor_expired です。1ページにつき1回の呼び出しです。

2ページの間に株式分割や分配で履歴が変わると、カーソルは使えなくなり、409 cursor_expired を返します。

MCP: ツール funds, action bars。

パラメータ

パラメータ場所必須種別意味
idパスはい文字列ファンド ID。ETF は銘柄 ID で、取引所の4文字コード、コロン、ティッカーの順です(ARCX:SPY)。投資信託は FUND、コロン、ティッカーの順です(FUND:VFIAX)。SPY のような米国ティッカーだけでも、米国の銘柄が1つに決まる場合は使えます。レスポンスには正規の ID が入ります。
intervalクエリいいえ次のいずれか: 1d, 1m1d(1セッションにつき1バー。投資信託のバーは日次の NAV)または 1m(1分バー。ETF のみ)。それ以外は 400 invalid_interval です。
startクエリいいえ文字列最初のバー。1d では日付(YYYY-MM-DD)で、その日を含みます。省略すると存在する最古のバーになります。1m では UTC の時刻(YYYY-MM-DDTHH:MM:SSZ、または日付のみで UTC 00:00)で、その時刻を含みます。省略すると end の1日前になります。
endクエリいいえ文字列最後のバー。1d では日付で、その日を含みます。省略するとバーが出ている最新の取引日になります。1m では UTC の時刻で、その時刻を含みません。省略すると現在、または start の5日後になります。1m では start と end の間は最大5日です(400 range_too_large)。
cursorクエリいいえ文字列前のページの next_cursor。ほかのパラメータは同じ値にします。カーソルは、元になる価格が変わる(分割や配当)と使えなくなり、409 cursor_expired を返します。

レスポンスフィールド

フィールド種別送信意味
id文字列常に正規の銘柄 ID。
currency文字列常にすべての価格の通貨。ペンスはポンドになります。
adjustedブール値常に常に true です。価格は株式分割と配当で調整されます。あるページと次のページは必ず整合します。2つのページの間に分割や配当で履歴が変わった場合は、両者を混ぜずにカーソルが使えなくなります(409 cursor_expired)。
start文字列任意送信されません。start は動かされません。
end文字列任意送信されません。日足は切り詰められません。
barsオブジェクトの配列常に1ページ最大5,000本。
bars[].date文字列任意取引日(YYYY-MM-DD)。日足のみで、1分足では省略されます。
bars[].timestamp日時常にバーの期間の開始時刻(UTC)。日足では取引所の始値の時刻、1分足ではその分です。
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
}

ファンド1件の分配

GET /v1/funds/{id}/distributions

ファンド1件の分配を、権利落ち日の新しい順にページ分割して返します。すべてのアカウントで全履歴を取得できます。リクエストごとに1回の呼び出しとして数えます。不明な ID は 404 not_found です。

MCP: ツール funds, action distributions。

パラメータ

パラメータ場所必須種別意味
idパスはい文字列ファンド ID。ETF は銘柄 ID で、取引所の4文字コード、コロン、ティッカーの順です(ARCX:SPY)。投資信託は FUND、コロン、ティッカーの順です(FUND:VFIAX)。SPY のような米国ティッカーだけでも、米国の銘柄が1つに決まる場合は使えます。レスポンスには正規の ID が入ります。
cursorクエリいいえ文字列前のページの next_cursor。ほかのパラメータは同じ値にします。

レスポンスフィールド

フィールド種別送信意味
id文字列常に正規のファンド ID。
start日付任意送信されません。すべてのアカウントで全履歴を利用できます。
distributionsオブジェクトの配列常に権利落ち日の新しい順。
distributions[].ex_date日付常にファンドが分配なしで取引される最初の日。
distributions[].amount文字列常に1口あたりの分配額。単位は currency。
distributions[].currency文字列常にamount の通貨。
distributions[].pay_date日付任意支払日。不明な場合は省略されます。
distributions[].record_date日付任意株主として名簿に載っている必要がある基準日。不明な場合は省略されます。
distributions[].kindincome、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バッチに50件を超える ID が含まれています。
invalid_interval400インターバルが 1d でも 1m でもないか、この銘柄では使えません。
range_too_large400期間がルートの許容範囲を超えています。
not_found404そのような銘柄、ファンド、ペアはありません。
invalid_cursor400このカーソルは、このリクエストが返したものではないか、別のリクエストのものです。
cursor_expired409カーソルの元になっている価格が変わりました。カーソルなしでやり直してください。
insufficient_credits402クレジット残高が、リクエストの費用に足りません。
upstream_busy503現在、価格を取得できませんでした。バッチでは errors に並びます。しばらくしてからもう一度お試しください。
area_unavailable503この領域は現在応答できません。

このページは役に立ちましたか?