Polymarket vs Kalshi API:開発者向け横並びガイド(認証、CLOB、WebSocket、ヒストリカルデータ)

Polymarket と Kalshi は同じプリミティブ — CLOB 上の yes/no 契約 — を、まったく異なる API で動かす。一方は EIP-712 署名と Polygon ウォレットを要求し、もう一方はオプションの FIX を備えた REST エンドポイントだ。予測エージェント、アービトラージボット、スマートマネー監視を作るなら、本来とっくにあるべき横並びガイドがこれだ。
要点
- •Polymarket は Polygon 上の CLOB に提出する EIP-712 署名注文を使う — ウォレットのオンボーディングとガス代がかかる。
- •Kalshi は標準的な REST + WebSocket 認証(email/password → トークン)に加え、機関ユーザー向けにオプションの FIX ゲートウェイを使う。
- •両者ともオーダーブック・約定・ヒストリカルデータを公開するが、スキーマと決済セマンティクスの違いが大きく、「統合」ライブラリはこの crypto/quant ツール界隈で最も要望される HN Show HN のトピックになっている。
- •同等契約間のクロス会場アービトラージが最も一般的なビルドパターン(GitHub にオープンソースボットが 10 以上)。
- •API Pick Prediction Markets Search は両会場を 1 本の POST エンドポイントに束ね、自然言語での契約発見を可能にする — 1 回 50 credits、ランク付きセマンティック結果。
なぜこの記事が存在するか
予測市場の上に何かを作った経験があれば、定番のリクエストを知っているはずだ:「同じ Python スクリプトから Polymarket と Kalshi を問い合わせて、マッチする契約のクリーンなリストを返してほしい。」 あらゆる予測市場系の Show HN の HN コメントスレッドは、必ずこれに収束する — 「CCXT for prediction markets」型の投稿が繰り返し現れるのは、需要が存在し、既存の解決策がもう一歩届いていないことを示している。
この難しさは本物だ。2 つの会場は同じプリミティブ — セントラルリミットオーダーブック上のバイナリ「yes/no」契約 — を解くが、それを劇的に異なる API で公開する。両者の動く開発者ビューを、横並びで、実際に必要なコードとともに示す。
2 つの会場、2 つのアーキテクチャ
Polymarket
- チェーン:Polygon(USDC.e 決済)
- 認証:ウォレット秘密鍵による EIP-712 型付きデータ署名。従来型のベアラートークンはなし
- 注文発注:CLOB API に提出する署名済み注文。ガスはメタトランザクション経由で Polymarket が負担
- 市場発見:アクティブ市場の閲覧には Gamma API(REST + JSON)、ライブオーダーブックには別の CLOB API
- リアルタイムデータ:オーダーブック更新と約定の WebSocket ストリーム
- ヒストリカルデータ:約定の REST エンドポイント。日次スナップショットは別途ダウンロード可
Kalshi
- 決済:ACH と電信送金による USD(米国の銀行が必要)
- 認証:email + password → ベアラートークン、または API キー(機関向け)
- 注文発注:
/portfolio/ordersへの標準的な認証付き REST POST - 市場発見:イベント・市場・シリーズの REST エンドポイント。クリーンなスキーマ
- リアルタイムデータ:約定・オーダーブック・ティッカー用の WebSocket と FIX(機関向け)
- ヒストリカルデータ:約定の REST エンドポイント。市場の決済・清算データは素直
横並び比較
| Polymarket | Kalshi | API Pick | |
|---|---|---|---|
| 認証 | EIP-712 署名注文 + Polygon ウォレット | Email/password → ベアラー、または API キー | x-api-key ヘッダー(読み取り専用の発見) |
| 決済 | Polygon 上の USDC | USD 銀行送金(米国のみ) | 該当なし(検索のみ) |
| 米国での合法性 | ジオフェンス(米国不可) | CFTC 規制下 | 該当なし |
| リアルタイム | WebSocket | WebSocket + FIX | 該当なし |
| ヒストリカル | REST 約定 + スナップショット | REST 約定 + 決済 | 検索がソースへのリンクを返す |
| 最適用途 | crypto ネイティブ、グローバル市場、スマートマネー追跡 | 米国規制下、選挙 & 経済 | クロス会場の契約発見 |
動くコード:各社の hello-world
Polymarket:アクティブ市場を一覧する
import requests
# Gamma API — no auth required for browsing
r = requests.get(
"https://gamma-api.polymarket.com/markets",
params={"active": "true", "limit": 25, "order": "volume"},
)
markets = r.json()
for m in markets[:5]:
print(m["question"], "→", m["outcomePrices"])Polymarket:署名済み注文を発注する(スケッチ)
# Full order placement requires py-order-utils + a Polygon wallet
# This is the structural sketch — not runnable without wallet setup
from py_order_utils.builders import OrderBuilder
from py_order_utils.signer import Signer
signer = Signer(private_key="0xYOUR_PRIVATE_KEY")
builder = OrderBuilder(
exchange_address="0x...",
chain_id=137,
signer=signer,
)
order = builder.build_signed_order({
"maker": signer.address(),
"tokenId": "...", # the yes/no token ID for the market
"makerAmount": "1000000", # USDC.e in atomic units
"takerAmount": "1500000",
"side": "BUY",
"feeRateBps": 0,
"nonce": 0,
"expiration": 0, # 0 = no expiry
})
requests.post(
"https://clob.polymarket.com/order",
json={"order": order, "owner": signer.address(), "orderType": "GTC"},
)Kalshi:ログインして指値注文を出す
import requests
# Step 1 — login
r = requests.post(
"https://api.elections.kalshi.com/trade-api/v2/login",
json={"email": "you@example.com", "password": "..."},
).json()
token = r["token"]
headers = {"Authorization": f"Bearer {token}"}
# Step 2 — list markets in an event
r = requests.get(
"https://api.elections.kalshi.com/trade-api/v2/markets",
params={"event_ticker": "POTUS-2028", "limit": 25},
headers=headers,
).json()
print(r["markets"][:5])
# Step 3 — place a limit buy on the "Yes" side at 60 cents
r = requests.post(
"https://api.elections.kalshi.com/trade-api/v2/portfolio/orders",
headers=headers,
json={
"ticker": "POTUS-2028-DEM",
"type": "limit",
"action": "buy",
"side": "yes",
"count": 100, # 100 contracts
"yes_price": 60, # 60 cents
"client_order_id": "abc123",
},
)
print(r.json())API Pick:両会場にまたがる自然言語の発見
import requests
r = requests.post(
"https://www.apipick.com/api/search/prediction-markets",
headers={"x-api-key": "pk_yourkey"},
json={"query": "Federal Reserve rate cuts before end of 2026"},
)
for hit in r.json()["results"][:5]:
print(hit["title"], "@", hit["venue"], "→", hit["url"])
# Returns ranked matches across Polymarket + Kalshi.
# 50 credits per call (~$0.05), only on HTTP 200.実際に機能する 3 つの本番パターン
1. クロス会場アービトラージボット
GitHub で最も一般的なパターン:「この Polymarket 契約はこの Kalshi 契約と同じ結果で決済される」というキュレート済みホワイトリスト。ボットは両方のブックを監視し、含意確率を計算し、スプレッドがしきい値を越えたらポジションを取る。例:ImMike/polymarket-arbitrage と realfishsam/prediction-market-arbitrage-bot。
難しいのはホワイトリストだ。「Will the Fed cut by 25 bps at the December meeting」 は人間には同じに見えるが、決済ソースと厳密な文言が異なる。自動マッチャーは十分な頻度で間違えるので、実際のボットは人間がキュレートしたマッピングを使う。
2. スマートマネー監視
Polymarket のクジラはオンチェーンで見える。監視ツールは特定市場の大口オーダーフローを Polygon 上で見張り、大きなポジションを浮かび上がらせ、ニュース API にヘッドラインが届く前に急激な価格変動にフラグを立てる。News Search と組み合わせて、見かけ上の変動がニュース駆動か純粋な思惑かを確認する。
3. LLM エージェント向けの予測フィード
現在の Polymarket / Kalshi 価格を LLM エージェントのコンテキストに取り込むと、モデルは確率に根拠づけられた回答を返せる:「現在のベッティング市場は X の確率を約 65% と含意している」。これが API Pick がカバーする発見ユースケースだ — エージェントからの自然言語の問いを与えると、ランク付き契約を返し、エージェントが回答の中で価格を引用できるようにする。
よくある落とし穴(HN コメントから編集)
- Polymarket の EIP-712 署名 — 注文署名は決定論的だが、ツーリングのエラーはよくある。自前で実装するより
py-order-utilsを使うこと。初期のボットの損失のほとんどは、API が黙って弾く署名の不一致から来る。 - Kalshi のレート制限 — 文書上は 100 req/sec だが、繁忙なイベント日(選挙の夜、FOMC)には一部エンドポイントで低くなる。クライアントにリトライ + バックオフを組み込むこと。
- Polymarket のガス急騰 — Polygon のガスは大出来高の日に跳ね上がることがある。Polymarket はメタトランザクション経由で注文発注の大半を補助するが、決済と出金はユーザー負担。これを P&L 計算に織り込むこと。
- 決済の不一致 — 見かけ上の同等物が異なる決済になることがある。ペアトレードの前に必ず両契約の決済ソース条項を読むこと。
- WebSocket の切断 — 両会場とも日常的に WebSocket がふらつく。シーケンス番号のリプレイを伴う再接続ロジックは、本番ボットには必須だ。
素早く選ぶ
これがどこへ向かうか
予測市場は今、異例なほど主流の注目を集めている:米国選挙・FOMC イベント・スポーツ・AI テイクオフ系の問いをめぐる出来高の増大、含意確率を表示するニュースサイトとのより広い統合、そして同じテーマに収束する開発者ツーリングの波(Show HN、GitHub リポジトリ)— 「誰かが予測市場版の CCXT を書くべきだ。」
当社は、CCXT 型の統合執行ライブラリが正しい形だとは考えていない。認証・決済・規制レジームの違いは深すぎて、ユーザーに嘘をつかずにきれいに抽象化することはできない。だが 発見 の問題 — 自然言語の問いを与えて、すでに存在する契約を見つける — はセマンティック検索で解ける。それがまさに API Pick Prediction Markets Search のやることだ。契約を見つけ、注文は会場で出す。
よくある質問
契約数が多いのはどちらの会場?
執筆時点で、両者ともアクティブな市場を数万件リストしている。Polymarket は crypto ネイティブかつグローバル寄り(政治、スポーツ、crypto、時事)、Kalshi は CFTC 規制下で米国中心(選挙、経済、天気、スポーツ)。出来高の分布はカテゴリーで異なる — 米国選挙では通常 Kalshi のほうが厚く、グローバル政治や crypto ネイティブな問いでは Polymarket のほうが厚い。
なぜオープンソースの「統合」ライブラリが Show HN に出続けるのか?
需要があるのに、誰もうまく解けていないから。「Open-source library to unify Polymarket and Kalshi APIs」や「dr-manhattan — CCXT for Prediction Markets」のような Show HN 投稿は繰り返し現れるパターンだ。課題は同等契約(同じ結果、異なる文言)をマッチングし、決済セマンティクスを調整すること。ライブラリは通常、認証ラッパーは決めるが、契約マッチングの手前で止まる。
基本的なクロス会場アービトラージはどうやるのか?
概念的には:異なる会場で同じ結果に決済される 2 つの契約を見つけ、含意確率を確認し、高値の「No」側と安値の「Yes」側を取り、決済まで保有する。実際には摩擦は執行にある:Polymarket のガス代、Kalshi の USD 資金繰り、部分約定、そして上述のマッチング問題。GitHub のライブアービトラージボットのほとんどは、契約ペアのマッピングを自動発見するのではなく、キュレートされたホワイトリストで動かす。
Polymarket は米国で合法か?
Polymarket は現在、米国ユーザー向けには認可されておらず、アクセスはジオフェンスされている。Kalshi は CFTC 規制下で米国合法。米国ユーザー向けのプロダクトを作るなら Kalshi が唯一の選択肢。グローバルに作るなら、Polymarket のほうが広い市場カバレッジを持つ。
このスタックで API Pick はどこに収まるのか?
API Pick Prediction Markets Search は「発見」の問題を解く:自然言語の問い(例:「Fed cuts rates by year-end」)を与えると、1 回の POST 呼び出しで Polymarket と Kalshi の契約にわたるランク付きセマンティックマッチを返す。当社は注文執行 API を置き換えない — 注文の発注には依然として各会場に直接行く。当社は適切な市場を見つけるのを簡単にする。
この記事で使われている API
API Pick の CEO。AI エージェントと LLM ワークフロー向けの本番運用可能な API について執筆。