mcpField
K
kalshi

kalshi

github.com/starchild-ai-agentその他2998 回インストール1 週間前に更新
リポジトリ

kalshi について

Kalshi API を使って予測市場を検索・取引するスキルです。市場の発見、価格や板情報の確認、ライブデータ、認証が必要な口座操作を扱います。

主な機能

  1. 01シリーズ、イベント、市場の検索
  2. 02板情報と取引履歴の取得
  3. 03ローソク足と予測履歴の取得
  4. 04認証付き注文と口座の管理
  5. 05取引所情報と試合ライブデータの取得

活用シーン

  1. 01スポーツシリーズ内の市場検索
  2. 02価格と板の厚さの確認
  3. 03市場注文の作成や変更
  4. 04市場の過去の動向の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/starchild-ai-agent/official-skills --skill kalshi

インストール後、Claude Code で/kalshiを入力して読み込まれたか確認します。

詳細

Kalshi API

CFTC 規制の最初の予測市場取引所で取引とクエリを実行できます。現実世界のイベントに対するバイナリの yes/no 契約が 1〜99 セントで価格設定されています。

ベース URL: https://external-api.kalshi.com/trade-api/v2 デモ URL: https://external-api.demo.kalshi.co/trade-api/v2

API キーは https://kalshi.com/account/api-keys で取得してください(Premier または Market Maker ティアが必要です)

主要な概念

階層: Series > Events > Markets
  • Series — 定期的なイベントテンプレート(例: 「Monthly Jobs Report」、「Weekly Jobless Claims」)
  • Events — シリーズ内の特定のインスタンス(例: 「May 2026 Jobs Report」)
  • Markets — イベント内の個々のバイナリ結果(例: 「Will jobs added be above 200k?」)
バイナリ契約の価格設定
  • 価格は セント(1〜99)で表され、暗示確率を表します
  • 65c の Yes 契約 = 市場は 65% の確率を示唆しています
  • 価格 X の Yes ビッドは (100 - X) の No アスクと等価です — オーダーブックには Yes ビッドと No ビッドのみが表示されます
  • 決済: Yes の場合は $1.00(100 セント)を支払い、No の場合は $0 を支払います
  • すべての金額(残高、価格、決済)はセント単位です
ティッカーの形式
  • Series: KXBTC、KXJOBLESS、KXINX
  • Event: KXBTC-25MAY30(シリーズ + 日付)
  • Market: KXBTC-25MAY30-T100000(イベント + しきい値/結果)

スポーツゲームのティッカー は異なるパターンに従います: {SERIES}-{YYMONDD}{TEAM1}{TEAM2}-{TEAM}

  • 例: KXNHLGAME-25MAY12EDMORL-EDM(NHL、2025 年 5 月 12 日、Edmonton 対 Orlando、Edmonton の勝利)
  • 各ゲームイベントには 2 つの相互排他的な YES 市場 があります — チームごとに 1 つずつ
重要: シリーズベースの市場ナビゲーション

スポーツ、選挙、その他のシリーズベースのカテゴリでは /markets?keyword= を使用しないでください。 これはマルチゲームのパーレイバンドルのみを表示し、実際のゲームレベルの市場は表示されません。「NHL」、「Fulham」、「Premier League」などを検索しても、ゼロまたは無関係な結果しか返されません。

常に Series → Events → Markets の順にナビゲートしてください。 ゲームレベルの市場はシリーズ/イベント階層の下に存在し、/events?series_ticker=KXXX を介してアクセスする必要があります。また、/markets/{ticker} はゲーム市場に対して 404 を返す場合があります — ビッド/アスク価格はイベントエンドポイントのレスポンス(with_nested_markets=true を指定した /events/{event_ticker})にのみ表示されます。

このパターンはスポーツだけでなく、すべてのシリーズベースのカテゴリ に適用されます:

  • スポーツゲーム — NHL、NBA、NFL、MLB、EPL など
  • 政治レース — 複数候補イベント内の個々の候補者市場
  • 企業固有の市場 — シリーズ内の決算、CEO 交代など
  • 定期的な経済データ — 雇用統計、失業保険申請件数、CPI など

既知のスポーツシリーズティッカー:

スポーツシリーズティッカー例
NHLKXNHLGAMEKXNHLGAME-25MAY12EDMORL
NBAKXNBAGAMEKXNBAGAME-25MAY12BOSLAL
NFLKXNFLGAMEKXNFLGAME-25SEP07KCDET
MLBKXMLBGAMEKXMLBGAME-25MAY12NYYLAD
EPL (Premier League)KXEPLGAMEKXEPLGAME-25MAY12FULARS

スポーツの正しいワークフロー:

# 1. List open games for a sport
curl -s "https://external-api.kalshi.com/trade-api/v2/events?series_ticker=KXNHLGAME&status=open&with_nested_markets=true"

# 2. Get specific game with live bid/ask
curl -s "https://external-api.kalshi.com/trade-api/v2/events/KXNHLGAME-25MAY12EDMORL?with_nested_markets=true"

# WRONG — do not do this:
# curl -s "https://external-api.kalshi.com/trade-api/v2/markets?keyword=NHL"  ← returns parlays, not games

呼び出し方法

Kalshi は RSA キーペア署名認証を使用します。認証が必要なリクエストでは、3 つのヘッダーが必須です:

ヘッダー値
KALSHI-ACCESS-KEYAPI キー ID ($KALSHI_ACCESS_KEY)
KALSHI-ACCESS-SIGNATUREtimestamp + method + path の RSA-PSS 署名
KALSHI-ACCESS-TIMESTAMPUnix タイムスタンプ (ms)

公開 GET エンドポイント (markets、events、orderbooks) は、認証ヘッダーなしで呼び出せます。

# Public endpoint — no auth needed
curl -s "https://external-api.kalshi.com/trade-api/v2/markets?limit=10&status=open"

認証が必要なエンドポイントでは、RSA-PSS 署名を直接使用してください (kalshi_python SDK は使用しないでください — 動作しません):

import os, time, base64, requests
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend
from dotenv import load_dotenv
load_dotenv('/data/workspace/.env')

BASE_URL = "https://api.elections.kalshi.com"

def kalshi_headers(method: str, path: str) -> dict:
    import re
    raw = os.environ["KALSHI_PRIVATE_KEY"]
    # Decode literal escape sequences first (some input channels save '\n' as
    # two chars backslash+n instead of a real newline).
    raw = (raw.replace('\\r\\n', '\n').replace('\\n', '\n')
              .replace('\\r', '\n').replace('\\t', ' '))
    # Strip PEM markers if present, then strip ALL whitespace and rewrap.
    body = re.sub(r'-----BEGIN[^-]+-----', '', raw)
    body = re.sub(r'-----END[^-]+-----', '', body)
    body = re.sub(r'\s+', '', body)
    wrapped = '\n'.join(body[i:i+64] for i in range(0, len(body), 64))
    pem = f"-----BEGIN RSA PRIVATE KEY-----\n{wrapped}\n-----END RSA PRIVATE KEY-----\n"
    private_key = serialization.load_pem_private_key(pem.encode(), password=None, backend=default_backend())
    ts = str(int(time.time() * 1000))
    msg = (ts + method + path).encode()  # path must NOT include query string
    sig = private_key.sign(msg, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.DIGEST_LENGTH), hashes.SHA256())
    return {
        "KALSHI-ACCESS-KEY": os.environ["KALSHI_ACCESS_KEY"].strip(),
        "KALSHI-ACCESS-TIMESTAMP": ts,
        "KALSHI-ACCESS-SIGNATURE": base64.b64encode(sig).decode(),
        "Content-Type": "application/json"
    }

path = "/trade-api/v2/portfolio/balance"
resp = requests.get(BASE_URL + path, headers=kalshi_headers("GET", path))
print(resp.json())  # {"balance": 5000, ...} — balance is in cents

署名の注意点:

  • PKCS1v15 ではなく PSS — PKCS1v15 パディングは 401 を返します。SHA256 と共に PSS を使用する必要があります。
  • 署名前にクエリ文字列を除去する — 署名はベアパスのみ (例: /trade-api/v2/portfolio/balance) に対して計算され、/trade-api/v2/portfolio/balance?param=value に対しては計算されません。クエリ文字列を含めると 401 になります。
  • キー環境変数の形式 — KALSHI_PRIVATE_KEY は、生の base64 本文、実際の改行を含む完全な PEM、または改行が空白に潰された完全な PEM (Web フォーム経由で貼り付けた場合によくある) のいずれも受け付けます。ヘルパーはすべての形式を自動的に正規化します。最も堅牢な保存方法は、.env に \n エスケープを含む二重引用符付きの複数行 PEM として保存し、python-dotenv が実際の PEM 文字列に復元できるようにすることです。
API 仕様

完全な OpenAPI 仕様: https://docs.kalshi.com/openapi.yaml

インテントルーティング

ユーザーのインテントを適切なエンドポイントにマッピングします。すべてのパスはベース URL からの相対パスです。

イベント
メソッドエンドポイント主なパラメータ説明
GET/eventslimit (1-200)、cursor、status、series_ticker、with_nested_marketsイベントを一覧表示 (多変量を除く)
GET/events/{event_ticker}event_ticker、with_nested_markets特定のイベントを取得
GET/events/{event_ticker}/metadataevent_tickerイベントのメタデータのみ
GET/events/multivariatelimit、cursor、series_ticker、collection_ticker、with_nested_markets多変量 (コンボ) イベントを一覧表示
マーケット
メソッドエンドポイント主なパラメータ説明
GET/marketslimit、cursor、status、ticker、event_ticker、series_ticker、min_close_ts、max_close_tsマーケットを一覧表示/フィルタリング
GET/markets/{ticker}ticker特定のマーケットの詳細を取得
GET/markets/{ticker}/orderbookticker、depth現在のオーダーブック (yes 入札 + no 入札)
GET/markets/orderbookstickers (配列、最大 100)オーダーブックのバッチ取得
GET/markets/tradesticker、limit、cursor、min_ts、max_tsマーケット全体の取引
ローソク足
メソッドエンドポイント主なパラメータ説明
GET/series/{series_ticker}/markets/{ticker}/candlesticksseries_ticker、ticker、start_ts、end_ts、period_intervalマーケットレベルのローソク足
GET/series/{series_ticker}/events/{ticker}/candlesticksseries_ticker、ticker、start_ts、end_ts、period_interval集約されたイベントレベルのローソク足
GET/markets/candlesticksmarket_tickers、start_ts、end_ts、period_intervalローソク足のバッチ取得

period_interval の値: 1 (1 分)、60 (1 時間)、1440 (1 日)

予測とライブデータ
メソッドエンドポイント主なパラメータ説明
GET/series/{series_ticker}/events/{ticker}/forecast_percentile_historypercentiles (0-10000)、start_ts、end_ts、period_interval過去の予測パーセンタイル
GET/live_data/milestone/{milestone_id}milestone_id、include_player_statsライブマイルストーンデータ
GET/live_data/batchmilestone_ids (配列、最大 100)、include_player_statsライブデータのバッチ取得
GET/live_data/game-stats/{milestone_id}milestone_idプレーバイプレイ統計 (フットボール、バスケットボール、サッカー、ホッケー、野球)
シリーズ
MethodEndpointPrimary ParamsDescription
GET/series/{series_ticker}series_ticker、include_volumeシリーズテンプレートを取得
GET/seriescategory、tags、include_volume、min_updated_tsすべてのシリーズを一覧表示
取引所情報
MethodEndpointPrimary ParamsDescription
GET/exchange/status—現在の取引所ステータス
GET/exchange/schedule—営業時間
GET/exchange/announcements—プラットフォームのお知らせ
GET/exchange/user_data_timestamp—データ同期タイムスタンプ
GET/series/fee_changesseries_ticker、show_historical手数料変更履歴
検索と発見
MethodEndpointPrimary ParamsDescription
GET/search/tags_by_categories—シリーズカテゴリ別に整理されたタグ
GET/search/filters_by_sport—スポーツ別に整理されたフィルター
注文(認証済み)
MethodEndpointPrimary ParamsDescription
GET/portfolio/ordersticker、event_ticker、status、limit、cursor、subaccountユーザーの注文を一覧表示
GET/portfolio/orders/{order_id}order_id特定の注文を取得
POST/portfolio/ordersBody: ticker、action、side、type、count、yes_price/no_price注文を作成
DELETE/portfolio/orders/{order_id}order_id、subaccount注文をキャンセル
POST/portfolio/orders/{order_id}/amendorder_id、Body: 新しい count/price注文を修正
POST/portfolio/orders/{order_id}/decreaseorder_id、Body: 削減量注文数を削減
POST/portfolio/orders/batchedBody: 注文の配列一括作成(最大サイズはティアに応じて変化)
DELETE/portfolio/orders/batchedBody: 注文 ID の配列一括キャンセル
GET/portfolio/orders/queue_positionsmarket_tickers、event_ticker、subaccountすべての未約定注文のキューポジション
GET/portfolio/orders/{order_id}/queue_positionorder_id特定の注文のキューポジション
注文 V2 — イベント・マーケット注文(認証済み、固定小数点)
MethodEndpointPrimary ParamsDescription
POST/portfolio/events/ordersBody: イベントティッカー、マーケットサイド、価格(固定小数点)、数量V2 注文を作成
POST/portfolio/events/orders/batchedBody: V2 注文の配列V2 を一括作成
DELETE/portfolio/events/orders/{order_id}order_id、subaccountV2 注文をキャンセル
DELETE/portfolio/events/orders/batchedBody: 注文 ID の配列V2 を一括キャンセル
POST/portfolio/events/orders/{order_id}/amendorder_id、Body: 新しい数量/価格V2 注文を修正
POST/portfolio/events/orders/{order_id}/decreaseorder_id、Body: 新しい残数量V2 注文を削減
注文グループ(認証済み)
MethodEndpointPrimary ParamsDescription
GET/portfolio/order_groupssubaccountすべての注文グループを一覧表示
POST/portfolio/order_groups/createBody: 契約数上限注文グループを作成
GET/portfolio/order_groups/{id}id、subaccount特定のグループを取得
DELETE/portfolio/order_groups/{id}id、subaccountグループを削除してすべての注文をキャンセル
PUT/portfolio/order_groups/{id}/limitid、Body: 新しい上限契約数上限を更新
PUT/portfolio/order_groups/{id}/triggerid、subaccountグループをトリガー(すべての注文をキャンセル)
PUT/portfolio/order_groups/{id}/resetid、subaccount約定済み契約数のカウンターをリセット
ポートフォリオ (認証済み)
メソッドエンドポイント主なパラメータ説明
GET/portfolio/balancesubaccount残高とポートフォリオ価値 (セント単位)
GET/portfolio/positionscursor、limit、count_filter、ticker、event_ticker、subaccountユーザーのポジション
GET/portfolio/fillsticker、order_id、min_ts、max_ts、limit、cursor、subaccountすべての取引約定
GET/portfolio/settlementslimit、cursor、ticker、event_ticker、min_ts、max_ts、subaccount決済履歴
GET/portfolio/depositslimit、cursor入金履歴
GET/portfolio/withdrawalslimit、cursor出金履歴
GET/portfolio/summary/total_resting_order_value—未約定注文の合計価値 (FCM 限定)
サブアカウント (認証済み — 機関投資家/マーケットメーカー)
メソッドエンドポイント主なパラメータ説明
POST/portfolio/subaccounts—サブアカウントを作成 (最大 32)
POST/portfolio/subaccounts/transferBody: from、to、amountサブアカウント間の振替
GET/portfolio/subaccounts/balances—すべてのサブアカウントの残高
GET/portfolio/subaccounts/transferslimit、cursor振替履歴
GET/portfolio/subaccounts/netting—ネッティング設定
PUT/portfolio/subaccounts/nettingBody: subaccount、enabledネッティングを更新
RFQ — 見積依頼 (認証済み)
メソッドエンドポイント主なパラメータ説明
GET/communications/rfqscursor、limit (1-100)、event_ticker、market_ticker、status、user_filterRFQ の一覧
POST/communications/rfqsBody: market ticker、side、countRFQ を作成 (最大 100 件のオープン)
GET/communications/rfqs/{rfq_id}rfq_id特定の RFQ を取得
DELETE/communications/rfqs/{rfq_id}rfq_idRFQ を削除
GET/communications/quotescursor、limit (1-500)、event_ticker、market_ticker、status、rfq_id見積の一覧
POST/communications/quotesBody: RFQ ID、side、price、count見積回答を作成
GET/communications/quotes/{quote_id}quote_id特定の見積を取得
DELETE/communications/quotes/{quote_id}quote_id見積を削除
PUT/communications/quotes/{quote_id}/acceptquote_id見積を承諾
PUT/communications/quotes/{quote_id}/confirmquote_id見積を確認 (執行タイマーを開始)
GET/communications/id—ユーザーの communications ID を取得
API キー (認証済み)
メソッドエンドポイント主なパラメータ説明
GET/api_keys—すべての API キーの一覧
POST/api_keysBody: public key、nameユーザーの RSA 公開キーでキーを作成
POST/api_keys/generateBody: nameキーペアを自動生成
DELETE/api_keys/{api_key}api_keyAPI キーを削除
アカウント (認証済み)
メソッドエンドポイント主なパラメータ説明
GET/account/limits—API ティアのレート制限
GET/account/endpoint_costs—デフォルト以外のエンドポイントのトークンコスト
履歴データ
メソッドエンドポイント主なパラメータ説明
GET/historical/cutoff-timestamps—ライブデータと履歴データの境界
GET/historical/markets/{ticker}ticker特定の履歴マーケット
GET/historical/markets相互排他的なフィルター履歴マーケット
GET/historical/markets/{ticker}/candlesticksticker、start_ts、end_ts、period_intervalアーカイブされたローソク足
GET/historical/ordersフィルターアーカイブされた注文
GET/historical/fillsフィルターすべての履歴約定
GET/historical/tradesフィルターすべての履歴取引
マイルストーンとストラクチャードターゲット
メソッドエンドポイント主なパラメータ説明
GET/milestones/{id}id特定のマイルストーン
GET/milestonesRFC3339 開始日フィルターマイルストーン一覧
GET/structured-targets/{id}id特定のストラクチャードターゲット
GET/structured-targetsページネーション(最大 2000)ターゲット一覧
多変量コレクション
メソッドエンドポイント主なパラメータ説明
GET/multivariate/collections—多変量イベントコレクション一覧
GET/multivariate/collections/{ticker}ticker特定のコレクション
POST/multivariate/collections/{ticker}/marketsticker、Body: マーケットパラメータコレクション内にマーケットを作成(週 5000 件の上限)
インセンティブ
メソッドエンドポイント主なパラメータ説明
GET/incentives任意のフィルターインセンティブプログラム一覧

レート制限

API ティア(Standard、Premier、Market Maker)に応じてスケールするトークンベースのシステムです。

エンドポイント種別デフォルトコスト
ほとんどのエンドポイント10 トークン
GetOrder2 トークン
CancelOrder2 トークン
CreateQuote / DeleteQuote2 トークン
バッチ操作N × 項目ごとのコスト

GET /account/limits で制限を確認できます。バッチ操作の最大サイズは、お使いのティアの書き込みバジェットに応じてスケールします。

ページネーション

すべての一覧エンドポイントはカーソルベースのページネーションを使用します。レスポンスには cursor フィールドが含まれます。次のページを取得するには、それをクエリパラメータとして渡し直してください。

パラメータ説明
limit1 ページあたりの最大結果数(エンドポイントにより異なり、通常 1~200)
cursor次のページを取得するための、前回のレスポンスからの不透明なカーソル

WebSocket チャンネル

WebSocket 接続は wss://external-api.kalshi.com/trade-api/ws/v2 です(ハンドシェイク時に認証が必要)。

パブリックチャンネル:

  • Market Ticker — 価格、出来高、建玉の更新
  • Public Trades — 取引通知
  • Market & Event Lifecycle — 状態変化、新しいマーケット/イベント
  • Multivariate Market & Event Lifecycle — MVE の状態変化

認証済みチャンネル:

  • User Orders — 注文の作成/更新通知
  • User Fills — 約定通知
  • Market Positions — リアルタイムのポジション更新
  • Order Group Updates — ライフサイクルと制限の通知
  • Communications — RFQ とクォートの通知
  • Orderbook Updates — 価格レベルの増分変化

注文フィールドリファレンス

フィールド値説明
actionbuy、sell契約を買うか売るか
sideyes、noどちらの結果側か
typelimit、market注文タイプ
count整数契約数
yes_price1~99(セント)yes 側の価格
no_price1~99(セント)no 側の価格
expiration_tsunix タイムスタンプ任意の注文有効期限
sell_position_floor整数売却時に保持する最小ポジション
buy_max_cost整数(セント)成行買いの最大合計コスト

安全上の注意

  • すべての価格はセント単位です(1〜99)。価格が 65 の場合、1 契約あたり $0.65 を意味し、$65 ではありません。
  • 残高はセント単位です。 10000 = $100.00。
  • POST /portfolio/orders は本番環境で実際の注文を送信します。発注前に必ずティッカー、売買方向、価格を確認してください。
  • バッチ操作はアトミックに実行されます — すべて成功するか、すべて失敗するかのいずれかです。
  • デモ環境が https://external-api.demo.kalshi.co/trade-api/v2 で利用可能です。リスクなしでテストできます。
  • 注文を出す前に、必ず市場のティッカー、現在価格、ポジションサイズをユーザーに確認してください。
  • ユーザーあたりの未約定注文は最大 200,000 件です。

既知の制限事項

  • /markets?keyword= はシリーズベースの市場を検出できません — スポーツの試合、政治レース、その他のシリーズベースのカテゴリはキーワード検索では表示されません。常に /events?series_ticker= 経由で移動してください。上記の「重要: シリーズベースの市場ナビゲーション」を参照してください。
  • /markets/{ticker} はゲーム市場に対して 404 を返します — スポーツや類似の市場の売買気配値は、イベントエンドポイントのレスポンスにのみ表示されます。代わりに /events/{event_ticker}?with_nested_markets=true を使用してください。
  • 認証済みエンドポイントには RSA 署名が必要です — ほとんどの REST API のように単純な API キーヘッダーは使用できません。署名には公式の Python/TypeScript SDK を使用してください。
  • バイナリ市場のみ — 多結果契約はありません(多変量イベントによる場合を除く)
  • 米国規制 — 取引は適格な米国居住者のみが利用できます
  • 市場の営業時間 — 市場には定められたクローズ時刻があります。取引前に close_ts を確認してください
  • 履歴データの分割 — 古いデータには /historical/* エンドポイントが必要です。境界については /historical/cutoff-timestamps を確認してください
  • V1 と V2 の注文エンドポイント — V2 は固定小数点形式、V1 はセント単位を使用します。どちらも動作しますが、新しい統合には V2 を推奨します。
  • サブアカウント — 機関投資家およびマーケットメーカーのみ利用可能です(ユーザーあたり最大 32 件)
  • RFQ 制限 — 同時に開ける RFQ は最大 100 件です
  • 多変量市場の作成 — コレクションあたり週最大 5000 件です

コメント