kabuステーションAPI は、三菱UFJ eスマート証券(旧 auカブコム証券)の 取引ツール「kabuステーション」が提供する API だ。 板情報の取得だけでなく発注まで行える点が他と大きく違い、 自分の口座に対する自動売買を組める。

その代わり、他の Web API とは構成の前提がまるで違う。ここを理解しないまま 設計を始めると、作り終えてから置き場所が無いことに気づく。

🔴
接続先は localhost だけです。クラウドに置いて動かせません

公開されている API 定義に載っているサーバーは http://localhost:18080/kabusapi(本番用)と http://localhost:18081/kabusapi(検証用)の 2 つだけです。Windows で kabuステーションを起動しておくと、そのマシンの中に API サーバーが立つという構造で、外部のホストに向けて叩く形ではありません。VPS やサーバーレスに置いて 24 時間動かす構成にはそのままでは載らず、常時起動できる Windows 環境を自分で用意することになります。

使えるようになるまでに 2 つの関門がある

口座を開けば使えるわけではない。

  1. メンバーズサイトでの API 利用設定 — 設問への回答と利用規定への同意が要る
  2. kabuステーション側の「APIシステム設定」 — API を利用する設定を入れ、 パスワードとワンショット上限を決めてから再起動する
🟡
Professional か Premium プランでないと「利用不可」のままです

利用設定の申込が完了しても、プランの条件を満たしていなければ画面には「利用不可」と表示されます。口座を作って申し込めば使える、という前提で計画を立てると最初の段階で止まります。着手前に自分の口座がどのプランに該当するかを確認してください。

トークンは思っているより頻繁に失効する

/token で発行したトークンを X-API-KEY ヘッダーに載せて使う。 発行したトークンは有効な限り使い回せるが、無効になる条件が多い

  • kabuステーションを終了したとき
  • kabuステーションからログアウトしたとき
  • 別のトークンを新たに発行したとき

さらに、kabuステーションは早朝に強制的にログアウトされる。 つまり前日に取ったトークンは翌朝には使えなくなっている前提で組む必要がある。

🟡
トークンを設定ファイルに書いて固定しないでください

起動時に一度だけ取得して保持する作りにすると、翌朝から静かに動かなくなります。しかも失敗するのは発注のタイミングなので、気づくのが遅れます。認証エラーを受けたら取り直して 1 回だけ再試行する、という経路を最初から入れておくのが安全です。「別のトークンを発行すると前のものが無効になる」ため、同じ口座に対して複数のプロセスからトークンを取りに行く構成も避けてください。

銘柄は 50 までしか登録できない。しかも自動で埋まる

API 登録銘柄リストに載せられるのは、REST と PUSH を合わせて最大 50 銘柄だ。 PUSH 配信を受けるには銘柄を登録する必要があるので、 「全銘柄を監視して条件に合うものを探す」という使い方は成立しない。

そのうえで、見落としやすい挙動がある。

🔴
情報系のリクエストを投げると、その銘柄が自動で登録されます

銘柄情報を問い合わせただけで、その銘柄は API 登録銘柄リストに入ります。つまりスクリーニングのつもりで多数の銘柄を順に照会すると、意図せず 50 銘柄の枠を使い切ります。本当に監視したい銘柄が登録できなくなるので、照会と監視を同じロジックで回さず、不要になった銘柄は解除する処理を組み込んでください。全解除のエンドポイントも用意されています。

流量は秒間 10 件ほど

発注系・情報系・余力系とも、秒間 10 件ほどの制限が設けられている。 ローカルで動くぶん応答は速いが、速いからといって詰めて投げると弾かれる。 ループで銘柄を回すときは間隔を空ける前提で書く。

検証用のエンドポイントがある

本番用(18080)とは別に、検証用(18081)が用意されている。 発注ロジックを実口座に当てる前に流せる経路があるのは、 発注まで行う API としては重要な差になる。 まず検証用で注文の組み立てと応答の扱いを固め、 それから本番用のポートに向ける進め方を勧めたい。

相場情報の扱いは規約側を確認すること

自分の取引のために使うぶんには想定された使い方だが、 取得した相場情報を第三者に見せる・再配信する形を考えているなら、 API 開発者ポータルの利用規定とは別に、 kabuステーション本体の利用規定を確認する必要がある。 このページでは可否を断定していない。