J-Quants API の認証は、発行された API キーを x-api-key ヘッダに乗せる だけです。本記事では、キーの安全な扱い方と、リクエストをまとめる最小クライアントの実装パターンを整理します。

目次

  1. 認証の仕組み
  2. 最小のリクエスト
  3. 最小クライアント
  4. ページネーション
  5. エラーハンドリング

認証の仕組み

V2 では、すべての API リクエストのヘッダに API キーを付けます。

項目内容
ベース URLhttps://api.jquants.com/v2
認証ヘッダx-api-key: <API キー>
キーの発行J-Quants のダッシュボードで発行・再発行(#6-2「アカウント登録からプラン選択まで」)

API キーは失効しないため、トークンのように使用直前に取り直す必要はありません。その代わり、キーが漏れると第三者に使われる ため、環境変数や安全なストレージで管理します。

最新の仕様は 公式ドキュメント を参照してください。

最小のリクエスト

API キーを環境変数から読み、x-api-key ヘッダに乗せて銘柄一覧を取得します。

import os
import requests
BASE_URL = "https://api.jquants.com/v2"
# API キーは環境変数経由で受け取る(コードにハードコードしない)
api_key = os.environ["JQUANTS_API_KEY"]
headers = {"x-api-key": api_key}
# 動作確認: 上場銘柄一覧を取得
response = requests.get(f"{BASE_URL}/equities/master", headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
print(f"取得件数: {len(data.get('data', []))}")

レスポンスは、エンドポイントによらず data キーに配列が入ります。

401 Unauthorized が返るときは、API キーの誤り・未設定か、ヘッダ名 x-api-key のスペルミスを最初に疑います。

最小クライアント

毎回ヘッダとベース URL を書くのは冗長なので、薄いクライアントにまとめます。

import os
import requests
class JQuantsClient:
"""API キーを x-api-key ヘッダに付けて GET するだけの最小クライアント。"""
BASE_URL = "https://api.jquants.com/v2"
def __init__(self, api_key: str):
self._headers = {"x-api-key": api_key}
def get(self, path: str, **params) -> dict:
response = requests.get(
f"{self.BASE_URL}{path}",
headers=self._headers,
params=params or None,
timeout=30,
)
response.raise_for_status()
return response.json()
# 環境変数から API キーを読む(値はハードコードしない)
client = JQuantsClient(api_key=os.environ["JQUANTS_API_KEY"])
# 上場銘柄一覧の取得例
listed = client.get("/equities/master")
print(f"取得件数: {len(listed.get('data', []))}")

ページネーション

データ量が多いエンドポイントでは、レスポンスに pagination_key が含まれることがあります。次のキーを渡して続きを取得します。

def get_all(client: JQuantsClient, path: str, **params) -> list[dict]:
"""pagination_key をたどって全件取得する。"""
rows: list[dict] = []
key = None
while True:
page = client.get(path, **params, **({"pagination_key": key} if key else {}))
rows.extend(page.get("data", []))
key = page.get("pagination_key")
if not key:
break
return rows

エラーハンドリング

認証まわりで出やすいエラーと、対処の方向性を整理します。

ステータス意味対処
400 Bad Requestリクエスト形式不正エンドポイント、パラメータを確認
401 UnauthorizedAPI キーが無効・未設定x-api-key の値とヘッダ名を確認、必要ならキー再発行
403 Forbiddenプラン外 / 権限不足プランや対象データの権限を確認
429 Too Many Requestsレート制限バックオフを入れて再試行(#6-8「レート制限・エラー時のリトライ設計」)
5xxサーバ側の障害数秒〜数十秒待って再試行

response.raise_for_status() を入れておくと、これらが例外として上がります。try / except で捕まえて、ステータスごとに分岐するのがおすすめです。

注意点

  • API キーを コードにハードコードしない(必ず環境変数や安全なストレージから読む)
  • .env を git 管理対象に含めない(.gitignore で除外)
  • ログに API キーの値そのものを書かない(マスクするか、長さだけ記録する)
  • キーが万一漏れた場合は、ダッシュボードから 再発行 して差し替える

生成AI へのプロンプト例

API キー認証つきクライアントを生成する例です。

J-Quants API V2 のクライアントクラス JQuantsClient を Python で書いてください。
要件:
- API キーは環境変数 JQUANTS_API_KEY から読む(ハードコードしない)
- 認証は x-api-key ヘッダに API キーを乗せる(トークン交換は不要)
- ベース URL は https://api.jquants.com/v2
- get(path, **params) メソッドを持つ
- pagination_key があれば自動でたどって全件返すヘルパも用意
- HTTP エラーは raise_for_status() で例外化
- Python 3.11 以上、requests ライブラリ前提
- docstring を日本語で書く

まとめ

  • V2 の認証は API キーを x-api-key ヘッダに乗せるだけ(トークン交換は不要)
  • レスポンスは共通して data キーに配列が入る
  • API キーは必ず環境変数経由、ハードコード禁止。漏れたら再発行
  • 大量データは pagination_key をたどって全件取得する