J-Quants API の認証は、発行された API キーを x-api-key ヘッダに乗せる だけです。本記事では、キーの安全な扱い方と、リクエストをまとめる最小クライアントの実装パターンを整理します。
目次
- 認証の仕組み
- 最小のリクエスト
- 最小クライアント
- ページネーション
- エラーハンドリング
認証の仕組み
V2 では、すべての API リクエストのヘッダに API キーを付けます。
| 項目 | 内容 |
|---|---|
| ベース URL | https://api.jquants.com/v2 |
| 認証ヘッダ | x-api-key: <API キー> |
| キーの発行 | J-Quants のダッシュボードで発行・再発行(#6-2「アカウント登録からプラン選択まで」) |
API キーは失効しないため、トークンのように使用直前に取り直す必要はありません。その代わり、キーが漏れると第三者に使われる ため、環境変数や安全なストレージで管理します。
最新の仕様は 公式ドキュメント を参照してください。
最小のリクエスト
API キーを環境変数から読み、x-api-key ヘッダに乗せて銘柄一覧を取得します。
import osimport 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 osimport 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 Unauthorized | API キーが無効・未設定 | 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をたどって全件取得する