Tony Wang8 分で読めますPolymarketをスクレイピングする方法(2026年版 API・Python)
PolymarketはGamma・CLOB・Data APIで公開読み取りをキー不要で提供。直接呼び出す場合と、構造化APIが楽になる場合を解説。
Polymarketはすでにマーケットデータをオープンでキー不要のJSONとして公開している — ただし3つの異なるidスキームを持つ3つの別サービスに分かれている。イベントとマーケットを発見するGamma、ライブの板情報と価格のCLOB、口座と取引アクティビティのData APIだ。したがって2026年の「Polymarketをスクレイピングする方法」への正直な答えは、ほとんどの読み取り用途ではPolymarket自身のAPIを直接呼び出すこと、となる。面倒なのは、Gamma・CLOB・Dataをまとめる単一クライアントが存在しないことと、Gammaの生のレスポンス形状に(文字列化されたJSONフィールドなど)回避が必要な粗い部分があることだ。このガイドではPolymarket自身のAPI、それに対するDIYのPythonでの取得、そして構造化APIを追加する価値がある場面を扱う。
なぜPolymarketのデータをスクレイピングするのか?
- 市場が織り込む確率の追跡 — Polymarketは取引高で見て最大の予測市場であり、その「Yes」価格は選挙・FRBの決定・スポーツ・ポップカルチャーのイベントについて、トレーダーがどれだけ起こりうると考えているかを示す、流動性の高い実マネーの指標だ。
- 裁定取引とプラットフォーム横断シグナル — PolymarketのオッズをKalshi、世論調査、専門家の予測と比較し、異なる市場や群衆がどこで意見を異にしているかを見る。
- 板情報と流動性のリサーチ — Polymarketは各アウトカムを独自のCLOBトークンとして価格付けするため、深さ・スプレッド・気配値がコントラクトごとに取得でき、クオンツやマーケットマイクロストラクチャーのリサーチに使える。
- センチメントと予測データセット — ライブのイベント確率をリサーチエージェント、ニュースウィジェット、不確実な結果について数値的な指標を必要とするダッシュボードに供給する。
- 群衆予測に関する学術研究 — Polymarketの規模(数千のアクティブなマーケット、大きなものでは深い板情報)は、予測市場が実世界の出来事をどれだけうまく予測するかを研究する際によく使われるデータセットになっている。
Polymarketをスクレイピングするのは合法か?
選択肢1: Polymarket自身の公式API(とその限界)
Polymarketに関しては、まず頼るべきは自身のAPIだ — 公開されていて、文書化されており、スクレイピングで得られるのと同じデータを返す。
curl "https://gamma-api.polymarket.com/markets?limit=5&order=volume24hr&ascending=false"
x-api-key も OAuth もアカウントも読み取りには不要。カバーする範囲と、まだ摩擦が残る部分は以下の通り。
- 3つのサービスすべてで読み取りがオープン。 Gamma(イベント/マーケットの発見)、CLOB(価格・板情報・取引履歴)、Data(口座/アクティビティ)はいずれもAPIキーなしで公開データを提供する — 注文の発行や管理のみ、Polymarketの公式TypeScriptまたはPython SDK経由のPolygonウォレット由来の署名が必要になる。
- レート制限はCloudflareのIPベースで、エンドポイントごとに異なる。 公式のレート制限ページによると、Gammaの
/marketsは300リクエスト/10秒、/eventsは500リクエスト/10秒を許容し、CLOBの/bookと/priceはそれぞれ1,500リクエスト/10秒を許容する。制限はスライディングウィンドウで拒否ではなくスロットル(遅延)されるが、多数のトークンに対する重いポーリングはそれでもキューが詰まりうる。 - 3つのサービス、3つのidスキーム、共有クライアントなし。 イベントには
slugがある。マーケットにはid、独自のslug、オンチェーンのconditionIdがある。そのマーケット内の各アウトカムには、価格・板情報・気配値・スプレッドの呼び出しに使う別のCLOBtoken_idがある。このチェーンをたどるのは自分の役目だ — idにはGamma、ライブの数値にはCLOB。 - Gammaの生のフィールドがすべてそのまま使えるわけではない。 Marketsエンドポイントのスキーマは
outcomesとoutcomePricesを配列ではなく単なる文字列として型定義している — これらはJSONエンコードされたテキスト(例:'["Yes","No"]')として返ってくるので、実際のリストにする前に自分でjson.loads()する必要がある。
選択肢2: GammaとCLOBに対するPythonでのDIY
最小限のDIYの取得は次のようになる — マーケットを発見する呼び出し1回と、そのアウトカムの1つを価格付けする呼び出し1回だ。
import json
import requests
GAMMA = "https://gamma-api.polymarket.com"
CLOB = "https://clob.polymarket.com"
markets = requests.get(f"{GAMMA}/markets", params={
"limit": 5, "order": "volume24hr", "ascending": False, "closed": "false",
}).json() # 生の配列 — エンベロープなし
top = markets[0]
outcomes = json.loads(top["outcomes"]) # '["Yes","No"]' -> ["Yes", "No"]
token_ids = json.loads(top["clobTokenIds"]) # トークンidリストも同じ手順
price = requests.get(f"{CLOB}/price", params={"token_id": token_ids[0], "side": "buy"}).json()
book = requests.get(f"{CLOB}/book", params={"token_id": token_ids[0]}).json()
これは単発のスクリプトなら問題なく動く。複数のマーケットやプラットフォームを取得するようになると、トレードオフが見えてくる。
- JSON文字列のパースは自分の仕事になる。
outcomes、outcomePrices、clobTokenIdsはいずれも生のGammaレスポンスではエンコードされた文字列として届く — 小さいが、どの実装でも書き直すことになる定型的なグルーコードだ。 - ソースをまたいだ統一認証や正規化はない。 Kalshi、Metaculus、あるいは従来型のマーケットデータも取得しているなら、それぞれ独自のベースURL・idスキーム・レート制限の挙動をすり合わせる必要がある。
- ポーリングとストレージは依然として自分の責任。 GammaもCLOBも、あなたの取得をリトライ・重複排除・タイムスタンプ付与してはくれない — どちらにせよそれはコード側の仕事だ。
選択肢3: 構造化されたPolymarket API
Polymarketスクレイピング APIの価値は、Polymarketが隠しているデータを開放することではない — 価値は、Gamma・CLOB・Data、そしてカタログ内の他のあらゆるプラットフォームにまたがる、1つの正規化されたスネークケースのスキーマと1つの x-api-key を提供すること、そして outcomes やトークンidがすでに実際の配列としてパースされていることにある。24時間出来高順でアクティブなマーケットを一覧表示する。
curl "https://api.crawlora.net/api/v1/polymarket/markets?limit=5&order=volume24hr" \
-H "x-api-key: $CRAWLORA_API_KEY"
マーケット一覧、slugによる特定マーケット、イベントをPythonで取得する。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/polymarket"
markets = requests.get(f"{base}/markets", headers=h,
params={"limit": 5, "order": "volume24hr"}).json()["data"]["markets"]
market = requests.get(f"{base}/market/slug/will-the-fed-increase-interest-rates-by-25-bps-after-the-september-2026-meeting-649",
headers=h).json()["data"]
events = requests.get(f"{base}/events", headers=h,
params={"limit": 5, "order": "volume24hr"}).json()["data"]["events"]
マーケット詳細レスポンスは、そのまま保存できる正規化されたJSONだ(実際のフィールド、ライブで取得したもの)。
{
"code": 200,
"msg": "OK",
"data": {
"id": "2252245",
"slug": "will-the-fed-increase-interest-rates-by-25-bps-after-the-september-2026-meeting-649",
"condition_id": "0x876506d8b2bd7a0d3fa4fe18c024eee6e1dd81ee24c26795dadd6cfe4a7b5d0d",
"market": {
"question": "Will the Fed increase interest rates by 25 bps after the September 2026 meeting?",
"active": true,
"closed": false,
"best_bid": 0.41,
"best_ask": 0.42,
"last_trade_price": 0.41,
"liquidity": 669602.9468,
"volume": 5588803.527363,
"volume_24h": 1116366.822159,
"end_date": "2026-09-16T00:00:00Z",
"token_ids": [
"63842529068710005716169325380315470359047749786610778647370693404952498013178",
"2881957189963819690709899387312951271986076905757701114514025622922000576600"
],
"outcomes": [
{ "outcome": "Yes", "price": 0.415, "volume": 5588803.527363 },
{ "outcome": "No", "price": 0.585, "volume": 5588803.527363 }
]
},
"source_url": "https://gamma-api.polymarket.com/markets/2252245",
"fetched_at": "2026-08-11T07:26:38Z"
}
}
特定のアウトカムトークンについて、同じキーの背後でライブ価格・板情報・価格履歴を取得する。
token_id = market["market"]["token_ids"][0] # "Yes" アウトカム
price = requests.get(f"{base}/token/{token_id}/price", headers=h,
params={"side": "buy"}).json()["data"]
book = requests.get(f"{base}/token/{token_id}/orderbook", headers=h).json()["data"]
history = requests.get(f"{base}/token/{token_id}/price-history", headers=h,
params={"interval": "1d"}).json()["data"]
search = requests.get(f"{base}/search", headers=h,
params={"q": "bitcoin", "sort": "volume24hr"}).json()["data"]
マーケットは id・slug・オンチェーンの condition_id のいずれかで、イベントは slug または id で指定する。そして個々のアウトカム(各Yes/Noコントラクト)にはそれぞれ独自の token_id があり、price・orderbook・midpoint・spread・price-history の呼び出しに使う — このidの追加レイヤーこそが、Polymarketの粒度の細かさと複雑さの両方の源になっている。すべてのレスポンスには source_url と fetched_at が含まれているので、各行にタイムスタンプを保存し、スケジュールに沿って再取得すること。
取得できるデータ
- マーケット — id、slug、condition_id、question、active/closedステータス、best bid/ask、last trade price、liquidity、volume。一覧表示でも個別取得でも取得可能。
- イベント — マーケットの上位にあるグルーピング層: title、description、tags、マーケット数、合計のliquidity/volume、あるトピックの開始/終了日(例: 1つの「Bitcoin above ___」イベントの下にある全ストライク価格マーケット)。
- トークンレベルの価格情報 — buy/sell側ごとのライブ価格、気配値、スプレッド、そして単一アウトカムの完全な板情報(サイズ付きのbidとask)。複数トークンを1回の呼び出しで価格付けするバッチ版もある。
- 価格履歴 —
1mからmaxまで選択可能な間隔での、トークンの価格ポイントの時系列。 - タグ — マーケットとイベントの分類、およびトピック別に閲覧するための関連タグ検索。
- リーダーボードとアクティビティ — トレーダーのリーダーボード順位と、サイズでフィルタ可能な最近の取引アクティビティのフィード。
- 検索 — イベント全体を対象としたフリーテキスト検索。relevance、volume、liquidityでソート可能。
制限事項
- 公開マーケットデータであり、投資助言ではない。 「Yes」価格は市場が織り込む確率であって、結果の保証ではない — シグナルとして扱い、予測として扱わないこと。商用利用の前にPolymarket自身の利用規約を確認すること。
- 取引接続ではない。 これらの読み取りは注文の発行や管理を行わない — それにはPolymarket自身のウォレットベースのCLOBクライアントと、資金を入れて接続したアカウントが必要で、まったく別の実装になる。
- 読み取りであってもIPベースでレート制限される。 Cloudflareが GammaとCLOBに対してエンドポイントごとのスライディングウィンドウ制限を課している(選択肢1を参照) — 重いポーリングを行う場合は、無制限のスループットを前提にせず、バックオフすべきだ。
- マーケットは決着してクローズする。
closed: trueのマーケットの価格は決着時点で固定される — 決着済み/アーカイブされたマーケットはライブフィードではなくアーカイブデータとして扱うこと。 - リアルタイム保証はない。 各取得に
fetched_atを保存し、値をリサーチ用の入力として扱うこと。実際に取引している場合はPolymarket自身のライブ板情報の代わりにはならない。
どこで使われているか
- 予測・確率ダッシュボード — 複数ストライクのイベント内のすべてのアウトカムについて、Polymarketが織り込む確率が時間とともにどう動くかを追跡する。
- プラットフォーム横断のセンチメント比較 — Polymarketの価格を、同じイベントについてのKalshi、世論調査、報道の隣に並べる。
- クオンツとマーケットマイクロストラクチャーのリサーチ — トークンごとの板情報と価格履歴を、スプレッドと流動性のリサーチに使う。
- AIエージェントとリサーチツール — 下流の推論のための、実世界の出来事に対する数値的な確率の読み取り。
出典
データ収集を始める
まずは無料で試す: 任意の公開URLを無料ウェブスクレイパーにかけるか、アンチボットチェッカーでサイトがボットをブロックしているか確認できる — サインアップ不要。
Playgroundでmarketsエンドポイントを試し、APIドキュメントでスキーマを確認し、料金を確認しよう。もう一つの主要な規制対象イベント取引所については、Kalshiをスクレイピングする方法がPolymarketのトークン単位の板情報の深さとは対照的に、CFTC規制の枠組みを持つ単一チケットのマーケットを扱っている。実マネーの掛け金がない予測ソースとしては、Metaculusをスクレイピングする方法が同種のイベントについてコミュニティの予測者の確率を追跡しており、CoinGeckoをスクレイピングする方法は多くのPolymarketマーケットで決済ソースとして登場する暗号資産価格をカバーしている。これらのソースがどう組み合わさるかについては、より広い予測市場データのユースケースを参照。この分野の法的な基礎については、ウェブスクレイピングは合法かを参照。
これはスクレイピング方法ガイドシリーズの一部 — 私たちがカバーするすべてのプラットフォームを1つの索引にまとめている。
よくある質問
Polymarketに公式APIはありますか?
はい。Polymarketは公開APIをいくつかのサービスに分けて提供しています — イベントとマーケットを発見するGamma API(gamma-api.polymarket.com)、ライブ価格・板情報・取引を扱うCLOB API(clob.polymarket.com)、口座と取引アクティビティ用の別のData APIです。GammaとCLOBからマーケットデータを読み取るのにアカウントやAPIキーは不要です。
マーケットデータを読み取るのにPolymarketのAPIキーは必要ですか?
いいえ。Polymarket自身のGammaとCLOBの読み取りエンドポイントはキー不要・認証不要で、誰でも直接呼び出せます。ウォレット由来のAPIキーは、Polymarketの公式TypeScriptまたはPython SDKを通じて注文を発行・管理する場合にのみ必要です。Crawlora APIキーはさらに別物で、本ガイドで説明する構造化APIを使ってGamma・CLOBや他のプラットフォームにまたがる1つのスキーマを得たい場合にのみ必要になります。
PythonでPolymarketのAPIを使うにはどうすればいいですか?
手早く取得するなら、requests.get("https://gamma-api.polymarket.com/markets", params={"limit": 10, "order": "volume24hr"}) が認証ヘッダー不要でマーケットのプレーンなJSON配列を返します。ライブ価格と板情報は別のベースURL、https://clob.polymarket.com から取得し、マーケットのレスポンスから得られるアウトカムごとのtoken_idをキーにします。
PolymarketのGamma APIとCLOB APIの違いは何ですか?
Gammaは発見・カタログ層です — イベント、マーケット、タグ、メタデータを扱います。CLOBはライブの板情報と取引の層です — 特定のアウトカムトークンのベストbid/ask、気配値、スプレッド、フルの深さに加え、認証済みの発注も扱います。読み取り専用のほとんどのプロジェクトは両方が必要です: マーケットのtoken_idを見つけるのにGamma、それを価格付けするのにCLOB。
Polymarket と Kalshi の API、読み取りとしてより開かれているのはどちらですか?
どちらもキー不要の公開読み取りAPIを提供しているため、マーケットデータの取得にサインアップは不要です。異なるのは形状です: Kalshiはすべてを1つのティッカーで指定しますが、Polymarketはidを階層化しています — イベントのslug、マーケットのid/slug/condition_id、そしてアウトカムごとの別のCLOB token_idです。これは各Yes/Noコントラクトを独自の板情報とともに独立して価格付けしているためです。KalshiはCFTC規制下の単一の取引所であり、Polymarketはグローバルに運営されていて、米国向けアクセスは別のPolymarket US製品に分けられています。
Polymarketのマーケットデータは公開されていますか?
はい。イベント一覧、マーケット詳細、価格、板情報、取引アクティビティはすべてPolymarket自身のGamma・CLOB・Data APIを通じた公開読み取りで、データとの間にログイン壁はありません。発注だけが、資金を入れて接続したウォレットを必要とする部分です。
Polymarketのヒストリカルな価格データを取得できますか?
はい。CLOBのprice-historyエンドポイントは、選択した間隔(1分から「max」まで)でtoken_idの時系列を返します。またPolymarketのData APIは別途、マーケットがどう動いたかをリサーチするためのウォレットまたはマーケットごとの取引・アクティビティ履歴を追跡しています。