VPS Notes
セルフホスト

J-Quants API の使い方: 無料プランで取れる範囲と、全銘柄の株価を別ソースと突き合わせた結果

JPX 公式の株価 API「J-Quants API」を無料プランで試しました。登録から API キー、Python で全銘柄の日足を 1 回で取るまで。無料で取れる期間、1 分 5 回の上限を超えたときの挙動、手元の株価との全銘柄の突き合わせ、有料プランと TDnet アドオン (月 11,000 円) の判断まで。

j-quantspythonstockapixserver-vps

本記事にはプロモーション (アフィリエイト広告) が含まれます。

「J-Quants API は無料でどこまで使えるのか」「有料にする価値はあるのか」で調べている人向けに、先に結論を置きます。

J-Quants API は、JPX (日本取引所グループ) 公式の株価・財務データの API です。無料プランでも、日足、上場銘柄の一覧、決算の概要が取れます。ただし直近 12 週は取れません。 毎日の株価を取り込む用途なら、月 1,650 円の Light プランが要ります。

実際に無料プランで試して分かったことは 3 つです。

  1. 日付だけを指定すると、全銘柄の日足が 1 回で返る。4,449 銘柄、1.2MB、3.4 秒でした
  2. 値は、手元に別の方法で集めていた株価と全銘柄で一致した。3,716 銘柄の四本値と出来高に、1 件の違いもありませんでした
  3. 1 分 5 回の上限を超えると、しばらく戻らない。15 秒おきに取り直しても 1 分以上 429 のままで、戻ったのは約 2 分後でした

J-Quants API のプラン

公式サイト (2026-09-26 確認) のプランです。

プラン 月額 (税込) 取れる期間 1 分あたりの上限
Free 0 円 2 年分 (直近 12 週を除く) 5 回
Light 1,650 円 5 年分 60 回
Standard 3,300 円 10 年分 120 回
Premium 16,500 円 20 年分 500 回

プランが上がるほど、取れるデータの種類も増えます。無料で取れるのは、日足、決算の概要、PER などの指標です。Light で TOPIX と投資部門別、Standard で指数や信用取引の残高、Premium で財務諸表の詳細や配当が増えます。

有料プランには、追加のオプション (アドオン) もあります。分足、ティック、そして 適時開示 (TDnet) です。TDnet のアドオンは 2026 年 5 月 18 日に始まり、月 11,000 円 (税込) で、Light 以上の契約に追加する形です (JPX のお知らせ)。個人投資家向けで、法人や学術の用途には使えません。

この記事で使う環境

XServer VPS クラウド
毎日の株価の取り込みを 24 時間動かしておく場所として。4GB (4 コア) で月 2,480 円〜。
公式サイトを見る

1. 登録して、プランを申し込む

J-Quants のサイト でメールアドレスを登録し、ダッシュボードに入ります。

アカウントを作っただけでは、API は使えません。 ダッシュボードの上に「まずはプラン登録から。無料の Free プランもあります。」と出ています。

J-Quants のダッシュボード。上部に「まずはプラン登録から」と「プランを選ぶ」のボタン

「プランを選ぶ」から、Free の「無料で登録」を選びます。

プランの一覧。Free (0 円)、Light (1,650 円)、Standard (3,300 円)、Premium (16,500 円)

次の画面で名前と請求書の住所を入れ、「申し込む」を押します。無料プランでも、この入力は必要です。

2. API キーを発行する

ダッシュボードの「API Keys」で「API Key を発行」を押し、表示されたキーをコピーします。

API Key の画面。「API Key を発行」のボタン

キーはコードに書かず、環境変数で渡します。

export JQUANTS_API_KEY='<発行したキー>'

今の J-Quants API (v2) は、このキーを x-api-key ヘッダーに付けて呼びます。以前の版にあった「メールとパスワードでトークンを取る」手順は要りません。

3. 株価 (日足) を取る

まず curl で、トヨタ (銘柄コード 72030) の 2026-06-01 を取ります。

curl -s -G https://api.jquants.com/v2/equities/bars/daily \
  -H "x-api-key: $JQUANTS_API_KEY" \
  -d code=72030 -d date=20260601
{"data": [{"Date": "2026-06-01", "Code": "72030", "O": 3006.0, "H": 3009.0, "L": 2891.0, "C": 2905.5, "UL": "0", "LL": "0", "Vo": 37687200.0, "Va": 109849459050.0, "AdjFactor": 1.0, "AdjO": 3006.0, "AdjH": 3009.0, "AdjL": 2891.0, "AdjC": 2905.5, "AdjVo": 37687200.0, "MktCap": 45892336.0, "ExRT": null}]}

O H L C が始値・高値・安値・終値、Vo が出来高、Va が売買代金です。Adj の付いた列は、株式分割を反映した調整後の値です。MktCap (時価総額) も入っています。

銘柄コードは 5 桁です。 普段見る 4 桁の 7203 の後ろに 0 が付きます。4 桁で持っているデータと突き合わせるときは、末尾の 0 を外します。

日付だけを指定すると、全銘柄が返る

code を省いて date だけにすると、その日の全銘柄が 1 回で返ります。Python の標準ライブラリだけで書くとこうです。

import json
import os
import time
import urllib.error
import urllib.parse
import urllib.request

API = "https://api.jquants.com/v2"
KEY = os.environ["JQUANTS_API_KEY"]


def get(path, **params):
    """J-Quants API を呼ぶ。429 (上限超え) なら 60 秒待って取り直す"""
    url = f"{API}{path}?{urllib.parse.urlencode(params)}"
    req = urllib.request.Request(url, headers={"x-api-key": KEY})
    for _ in range(5):
        try:
            with urllib.request.urlopen(req, timeout=30) as r:
                return json.load(r)
        except urllib.error.HTTPError as e:
            if e.code != 429:
                raise RuntimeError(json.load(e).get("message")) from e
            time.sleep(60)
    raise RuntimeError("429 が続いた")


# 日付だけを指定すると、全銘柄の日足が 1 回で返る
bars = get("/equities/bars/daily", date="20260602")["data"]
traded = [b for b in bars if b["C"] is not None]
print(f"{len(bars)} 銘柄 (売買あり {len(traded)})")
print(traded[0])
4449 銘柄 (売買あり 4217)
{'Date': '2026-06-02', 'Code': '13010', 'O': 4280.0, 'H': 4280.0, 'L': 4205.0, 'C': 4225.0, ...}

2026-06-01 を curl で取ったときは、4,449 銘柄で 1.2MB、3.4 秒でした。売買がなかった銘柄は、値が null で入っています (6/1 は 218 銘柄)。

1 日 1 回で全銘柄が取れるので、毎日の取り込みなら、呼び出しは 1 日 1 回で済みます。銘柄ごとに取る方式なら、3,700 銘柄で 3,700 回です。過去 2 年分をまとめて取るときも、営業日の数 (約 490 回) で済みます。

4. 無料プランで取れる期間

直近の 2026-09-25 を頼むと、エラーの文面で範囲を教えてくれます。

{"message": "Your subscription covers the following dates: 2024-07-04 ~ 2026-07-04. If you want more data, please check other plans:https://jpx-jquants.com/#dataset"}

試した 2026-09-26 の時点で、取れるのは 2024-07-04 から 2026-07-04 まで でした。直近の約 12 週が抜けています。使い方を確かめる、過去を分析する、という用途なら無料で足ります。毎日の株価を取り込むなら、Light 以上が要ります。

5. 手元の株価と、全銘柄で突き合わせる

J-Quants の値を信じてよいかを確かめるため、手元の PostgreSQL にある同じ日の日足 (別の方法で集めていたもの) と、全銘柄を突き合わせました。

銘柄数
J-Quants (2026-06-01) 4,449
手元の DB (2026-06-01) 3,716
両方にある 3,716
そのうち四本値と出来高が一致 3,716 (不一致 0)
J-Quants にだけある 733

手元にある銘柄は、すべて一致しました。 J-Quants にだけある 733 銘柄は、先頭が 13050 (TOPIX 連動の ETF) のような、ETF や REIT などです。手元の DB には、この 733 銘柄が 1 つも入っていませんでした。

どれが ETF かは、上場銘柄の一覧 (/equities/master) で見分けられます。市場区分の MktNm が「その他」になっているのが、ETF などです。

curl -s -G https://api.jquants.com/v2/equities/master \
  -H "x-api-key: $JQUANTS_API_KEY" -d date=20260601

2026-06-01 の一覧は 4,449 件で、市場区分の内訳はこうでした。

MktNm 件数
スタンダード 1,580
プライム 1,564
グロース 595
その他 (ETF など) 529
TOKYO PRO MARKET 181

一覧には、業種 (17 業種と 33 業種)、規模の区分、信用取引の区分も入っています。

6. 決算の概要も無料で取れる

決算の概要 (/fins/summary) も、無料プランで取れました。

curl -s -G https://api.jquants.com/v2/fins/summary \
  -H "x-api-key: $JQUANTS_API_KEY" -d code=72030

トヨタで 8 回分の決算短信が返り、1 回分は 111 列ありました。最新は 2026-05-08 に出た 2026 年 3 月期の本決算 (IFRS、連結) です。

7. 1 分 5 回の上限を超えると

無料プランの上限は 1 分に 5 回です。続けて 7 回呼ぶと、こうなりました。

1 17:21:18 HTTP 200
2 17:21:18 HTTP 200
3 17:21:19 HTTP 200
4 17:21:19 HTTP 200
5 17:21:19 HTTP 429
6 17:21:20 HTTP 429
7 17:21:20 HTTP 429
{"message": "Rate limit exceeded. Please try again later."}

5 回目で 429 が返りました。 待つ秒数を知らせるヘッダー (Retry-After) はありません。

さらに、超えた後が長く続きました。15 秒おきに 5 回取り直しても、すべて 429 のままでした。戻ったのは、超えてから約 2 分後です。そこで上のコードは、429 なら 60 秒待つようにしています。続けて何日分も取るときは、呼ぶ間を 13 秒ほどあけて、そもそも上限を超えないようにするのが確実です。

有料プランと TDnet アドオンをどう考えるか

無料プランで確かめられるのは、使い方と値の正しさまでです。株価の取り込みを J-Quants に移すなら、まず Light で足りるかを確かめるのが順当です。

つまずいた点

登録から API キーの発行までが 30 分ほど、そこから API を叩いて全銘柄を突き合わせるまでが 30 分ほどでした。

次にやること

まとめ

XServer VPS クラウド
株価や開示の取り込みバッチを、毎日決まった時刻に動かしておく場所として。
公式サイトを見る