kalshi-api について
kalshi-apiは、Kalshiの取引APIを統合するためのガイドです。RESTまたはWebSocketで市場データを取得し、注文を管理する開発者向けに、RSA-PSS認証、YES/NO板の解釈、ドル文字列形式の注文スキーマなどを説明します。
主な機能
- 01RSA-PSSリクエスト署名の解説
- 02口座・注文・市場エンドポイントの網羅
- 03YES/NO買い板と価格換算の説明
- 04注文フィールドと形式の要件
- 05板情報の補助スクリプト
活用シーン
- 01Kalshi APIリクエストの認証実装
- 02市場データと過去のローソク足の取得
- 03注文の発注・変更・取消・一括処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill kalshi-apiインストール後、Claude Code で/kalshi-apiを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/auth-and-orders.mdendpoints-and-marketdata.mdwebsocket.mdscripts/kalshi_orderbook.py詳細
Kalshi API
CFTC 規制下の米国イベント取引所です。米ドル建てのバイナリー契約は、YES が勝てば 1.00 ドル、NO が勝てば 0.00 ドルで決済されます。REST と WebSocket に対応し、すべてのリクエストで RSA-PSS 認証を使用します。
契約の仕組みと決済ルールについては、kalshi-weather-markets と kalshi-crypto-index-markets のスキルを参照してください。戦略、ポジションサイズ、バックテストについては、prediction-market-strategy を参照してください。
コーディング前に必ず確認してください。 Kalshi API では、過去に後方互換性が破られています。ホストが変更され(旧
trading-api.kalshi.comは廃止)、注文スキーマも変更されました(整数のセント表記からドルの文字列表記へ)。リリース前に、必ずライブレスポンスに対して署名と注文本文をスモークテストしてください。正規の情報源:
- API リファレンス:https://docs.kalshi.com(旧ミラー:https://trading-api.readme.io)
- 公式 Python スターター:https://github.com/Kalshi/kalshi-starter-code-python
概要
- ベース URL:
https://api.elections.kalshi.com/trade-api/v2 - 認証: すべてのリクエストで RSA-PSS を使用します。公開エンドポイント(認証不要のエンドポイント)はありません。
- デモ環境との同等性なし: デモ環境(
demo-api.kalshi.co)の板はほぼ空です。読み取り専用の取得でも本番環境を使用してください。 - 契約: 1 契約あたり 0.01~0.99 ドル。YES が勝てば価格を支払い、NO が勝てば価格を失います。最大払い戻し額は 1.00 ドルです。
クイックスタート
1. 認証情報
KALSHI_KEY_ID=<your-key-uuid>
KALSHI_PRIVATE_KEY_PATH=~/.kalshi/private.pem
Kalshi ダッシュボードでキーを生成してください。シークレットは環境変数またはシークレットマネージャーに保存し、コードには絶対に記述しないでください。
2. インストール
pip install httpx cryptography
3. ホストと認証(多くの人が間違える部分)
実装で問題が起きるのは、ホストと署名形式です。よくある失敗は次の 3 つです。
- 旧
trading-api.kalshi.comホストを使う → 401 - 署名対象のパスにクエリ文字列を含める → 401
- 秒単位のタイムスタンプで署名する(ミリ秒ではない) → 401
import os, time, base64, httpx
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
BASE = "https://api.elections.kalshi.com/trade-api/v2"
KEY_ID = os.environ["KALSHI_KEY_ID"]
with open(os.environ["KALSHI_PRIVATE_KEY_PATH"], "rb") as f:
PRIV = serialization.load_pem_private_key(f.read(), password=None)
def _headers(method: str, path: str) -> dict:
"""path must include /trade-api/v2 prefix and exclude query string."""
ts = str(int(time.time() * 1000)) # milliseconds
msg = f"{ts}{method}{path}".encode()
sig = PRIV.sign(
msg,
padding.PSS(mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.DIGEST_LENGTH),
hashes.SHA256(),
)
return {
"KALSHI-ACCESS-KEY": KEY_ID,
"KALSHI-ACCESS-TIMESTAMP": ts,
"KALSHI-ACCESS-SIGNATURE": base64.b64encode(sig).decode(),
}
def get(path: str, params=None):
# Sign the path only — query goes into params, not the signature
r = httpx.get(BASE + path, params=params,
headers=_headers("GET", "/trade-api/v2" + path))
r.raise_for_status()
return r.json()
def post(path: str, body: dict):
r = httpx.post(BASE + path, json=body,
headers=_headers("POST", "/trade-api/v2" + path))
r.raise_for_status()
return r.json()
# Example: open markets in a series
markets = get("/markets", params={"series_ticker": "KXHIGHNY", "status": "open"})
署名仕様: RSA-PSS、SHA-256 を使用する MGF1、ソルト長 = PSS.DIGEST_LENGTH。署名対象の文字列:{timestamp_ms}{METHOD}{path}。path には /trade-api/v2 を含め、クエリ文字列は含めません。
ヘッダー:KALSHI-ACCESS-KEY(UUID)、KALSHI-ACCESS-TIMESTAMP(ミリ秒)、KALSHI-ACCESS-SIGNATURE(base64)。
4. ローソク足の履歴
# Returns OHLC for yes_bid / yes_ask + volume + open_interest
# Values are dollar strings: {"close": "0.42"}
candles = get(
f"/series/KXHIGHNY/markets/{ticker}/candlesticks",
params={"start_ts": start_epoch, "end_ts": end_epoch, "period_interval": 60},
)
period_interval の単位は分です。指定できる値は 1、60、1440 です。
YES/NO 注文板の規則
Kalshi では、yes と no はどちらも未約定の BID(買い注文)の段階別価格一覧です。別個の ASK(売り注文)板はありません。反対側の注文を約定させるには、反対側の買い注文を取ります。
no_ask = 1 − best_yes_bid # cost to buy NO right now (lift YES bids)
yes_ask = 1 − best_no_bid # cost to buy YES right now (lift NO bids)
P(YES) mid = (best_yes_bid + (1 − best_no_bid)) / 2
これを逆に理解すると、すべてのシグナルが気づかないうちに反転します。scripts/kalshi_orderbook.py のヘルパーを使用してください。
注文板のレスポンスは、API のティアに応じて 2 種類あります。使用前に正規化してください。
{"orderbook": {"yes": [[price, size], ...], "no": [[price, size], ...]}}
価格の値が > 1.0 の場合は整数のセント表記なので、100 で割ってください。
注文スキーマ
POST /trade-api/v2/portfolio/orders では、整数ではなく固定小数点のドル文字列を使用します。旧スキーマ(整数のセント表記、count、yes_price)を使うと、400 invalid_parameters が返されます。
{
"ticker": "KXHIGHNY-26JUN02-B75.5",
"action": "buy",
"side": "yes",
"count_fp": "1.00",
"yes_price_dollars": "0.01",
"client_order_id": "my-strategy-001",
"time_in_force": "good_till_canceled"
}
重要なフィールドのルール — 違反すると、それぞれ 400 が返されます。
| フィールド | ルール | よくある 400 の原因 |
|---|---|---|
count_fp | 固定小数点の文字列 "1.00" | 整数の count: 1 |
{side}_price_dollars | ドルの文字列 "0.01" | 整数のセント表記 yes_price: 1 |
time_in_force | 必須:good_till_canceled | immediate_or_cancel | fill_or_kill | 省略 |
client_order_id | [A-Za-z0-9-] のみ | 文字列に . または : が含まれている — ティッカーには . が含まれるため、ティッカーをそのままコピーしないでください |
type | 送信しないでください | "type": "limit" |
注文の全ライフサイクル(変更、数量の減少、キャンセル、一括処理)と strike_type に関する注意点については、references/auth-and-orders.md を参照してください。
エンドポイントの概要
| カテゴリ | エンドポイント | 備考 |
|---|---|---|
| 残高 | GET /portfolio/balance | — |
| ポジション | GET /portfolio/positions | — |
| 注文 | GET /portfolio/orders | ?status=resting|canceled|executed |
| 注文の発注 | POST /portfolio/orders | 上記のドル文字列スキーマ |
| キャンセル | DELETE /portfolio/orders/{id} | {"order": {...status: "canceled"}} を返します |
| 変更 | POST /portfolio/orders/{id}/amend | リクエスト本文で ticker が必須です |
| 減少 | POST /portfolio/orders/{id}/decrease | {"reduce_by_fp": "1.00"} |
| 一括 | POST /portfolio/orders/batched | {"orders": [...]} |
| 約定 | GET /portfolio/fills | ?limit=N |
| 決済 | GET /portfolio/settlements | ?limit=N |
| マーケット | GET /markets | ?series_ticker=&status=open&limit=500 |
| オーダーブック | GET /markets/{ticker}/orderbook | ?depth=N |
| ローソク足 | GET /series/{series}/markets/{ticker}/candlesticks | ?start_ts=&end_ts=&period_interval=60 |
| 取引 | GET /markets/trades | 直近の取引記録 |
エンドポイントの全仕様、マーケットのメタデータフィールド、レート制限については、references/endpoints-and-marketdata.md を参照してください。
WebSocket の検出パイプラインについては、references/websocket.md を参照してください。
ファイル
リファレンス
references/auth-and-orders.md— RSA-PSS の仕様、ドル文字列の注文スキーマ、time_in_force、client_order_idのサニタイズ、変更・減少・キャンセルのライフサイクル、strike_typeに関する注意点、手数料references/endpoints-and-marketdata.md— エンドポイントの全一覧、オーダーブックのバリエーション、マーケットのメタデータフィールド(result、open_time、close_time、series_ticker)、ローソク足、レート制限references/websocket.md— WS ホスト、検出パイプライン、チャネル、WS アップグレードへの署名
スクリプト
scripts/kalshi_orderbook.py— YES/NO のビッド段階ヘルパー(no_ask、yes_ask、p_yes_mid、overround、kalshi_fee)。標準ライブラリのみを使用し、キーは不要で、オフラインで実行できます。