mcpField
P
polymarket-api

polymarket-api

github.com/agentmc15その他26967 回インストール7 週間前に更新
リポジトリ

polymarket-api について

Polymarket API とスマートコントラクトの連携方法を案内するスキルです。市場データや取引の連携を実装する開発者向けに、REST、WebSocket、認証レベル、注文タイプ、手数料、エラー処理を説明します。

主な機能

  1. 01CLOB と Gamma のエンドポイントを解説
  2. 02認証レベルを説明
  3. 03WebSocket サブスクリプションに対応
  4. 04注文タイプと手数料を解説
  5. 05エラー処理のパターンを提示

活用シーン

  1. 01市場データと注文板を取得
  2. 02リアルタイムの市場更新を購読
  3. 03認証付き注文フローを実装

インストール

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

$npx skills add https://github.com/agentmc15/polymarket-trader --skill polymarket-api

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

詳細

Polymarket API 統合スキル

概要

このスキルは、Polymarket の API とスマートコントラクトとの統合に関する包括的なガイダンスを提供します。

API エンドポイント

CLOB API (Central Limit Order Book)

ベース URL: https://clob.polymarket.com

認証レベル
  • レベル 0 (パブリック): マーケットデータ、オーダーブック、価格
  • レベル 1 (署名者): API キーの作成/導出
  • レベル 2 (認証済み): 取引、注文、ポジション
主要エンドポイント
GET  /markets              # List all markets
GET  /markets/{condition_id}  # Get specific market (condition_id is the
                               # MARKET key; token_id is the per-outcome
                               # BOOK key used by /price, /midpoint, /book
                               # below — the two are not interchangeable)
GET  /price?token_id=X     # Get current price
GET  /midpoint?token_id=X  # Get midpoint price
GET  /book?token_id=X      # Get orderbook
GET  /trades               # Get user trades
POST /order                # Place order
DELETE /order/{id}         # Cancel order
GET  /positions            # Get positions
Gamma API (マーケットメタデータ)

ベース URL: https://gamma-api.polymarket.com

GET /events              # List events
GET /events/{slug}       # Get event details
GET /markets             # List markets
GET /markets/{id}        # Get market details

Python 実装パターン

クライアントの初期化
from py_clob_client.client import ClobClient
from py_clob_client.clob_types import OrderArgs, OrderType
import os

class PolymarketService:
    def __init__(self):
        self.client = ClobClient(
            host="https://clob.polymarket.com",
            key=os.getenv("POLYMARKET_PRIVATE_KEY"),
            chain_id=137,
            signature_type=1,
            funder=os.getenv("POLYMARKET_FUNDER_ADDRESS")
        )
        self.client.set_api_creds(
            self.client.create_or_derive_api_creds()
        )
    
    async def get_market_data(self, token_id: str) -> dict:
        """Fetch comprehensive market data."""
        return {
            "price": self.client.get_price(token_id, "BUY"),
            "midpoint": self.client.get_midpoint(token_id),
            "book": self.client.get_order_book(token_id),
            "spread": self.client.get_spread(token_id),
        }
    
    async def place_order(
        self,
        token_id: str,
        side: str,
        price: float,
        size: float,
        order_type: str = "GTC"
    ) -> dict:
        """Place a limit order."""
        order = self.client.create_order(
            OrderArgs(
                token_id=token_id,
                price=price,
                size=size,
                side=side,
            )
        )
        return self.client.post_order(order, order_type)
WebSocket 購読
import asyncio
import websockets
import json

async def subscribe_market_updates(token_ids: list[str]):
    """Subscribe to real-time market updates."""
    uri = "wss://ws-subscriptions-clob.polymarket.com/ws/market"
    
    async with websockets.connect(uri) as ws:
        await ws.send(json.dumps({
            "type": "subscribe",
            "markets": token_ids
        }))
        
        async for message in ws:
            data = json.loads(message)
            yield data
Gamma API クライアント
import httpx

class GammaClient:
    BASE_URL = "https://gamma-api.polymarket.com"
    
    def __init__(self):
        self.client = httpx.AsyncClient(base_url=self.BASE_URL)
    
    async def get_active_markets(self) -> list[dict]:
        """Fetch all active markets."""
        response = await self.client.get("/markets", params={"active": True})
        return response.json()
    
    async def get_event(self, slug: str) -> dict:
        """Fetch event with all markets."""
        response = await self.client.get(f"/events/{slug}")
        return response.json()

注文タイプ

  • GTC (Good Till Cancelled): 約定またはキャンセルされるまで有効
  • GTD (Good Till Date): 指定された時刻に失効
  • FOK (Fill or Kill): 全量約定しなければキャンセル
  • IOC (Immediate or Cancel): 約定可能な分を約定し、残りはキャンセル

手数料モデル

Polymarket のテイカーのみの計算式 (docs.polymarket.com/trading/fees、2026-09-04 取得):

fee = C × rate × p × (1 − p)

ここで:

  • C = コントラクト数 (解決時に 1 コントラクトあたり $1)
  • rate = テイカー手数料率 (カテゴリ依存、メイカーは支払い不要)
  • p = 約定価格、[0, 1] の範囲の確率
  • (1 − p) = 手数料項。p=0.5 (コイントス) で最大となり、裾 (p→0 または p→1) では消滅します

カテゴリ別テイカー手数料率 (USDC で請求):

カテゴリ手数料率
Crypto0.07
Sports / Economics / Culture / Weather / Other0.05
Finance / Politics / Mentions / Tech0.04
Geopolitics0.00

マーケットごとのオーバーライド: CLOB のマーケットペイロードには maker_base_fee/taker_base_fee (歴史的なフィールド名) が含まれる場合があり、存在する場合はカテゴリテーブルよりも優先されます。これらのフィールドは無次元の手数料率ではなくベーシスポイントです — taker_base_fee=700 は 700 ではなく 0.07 を意味します。FeeSchedule が期待する手数料率を得るには 10_000 で割ってください (app/venues/polymarket/adapter.py はこれらのフィールドを読み取る 2 か所でこれを行っています)。そのうえで、category_rate() からではなくペイロードから (source="clob_market" として) FeeSchedule を構築してください。この除算を省略すると、手数料が 10,000 倍の誤りになります。

メイカー手数料: Polymarket CLOB では常に 0。テイカーのみの取引所です。

価格計算

def calculate_implied_probability(price: float) -> float:
    """Convert price to implied probability."""
    return price  # Prices ARE probabilities (0-1)

def calculate_cost(price: float, shares: float) -> float:
    """Calculate cost to buy shares."""
    return price * shares

def calculate_pnl(
    entry_price: float,
    current_price: float,
    shares: float,
    side: str
) -> float:
    """Calculate unrealized P&L."""
    if side == "BUY":
        return (current_price - entry_price) * shares
    return (entry_price - current_price) * shares

エラー処理

from py_clob_client.exceptions import PolymarketException

try:
    result = client.post_order(order)
except PolymarketException as e:
    if "INSUFFICIENT_BALANCE" in str(e):
        # Handle insufficient funds
        pass
    elif "INVALID_PRICE" in str(e):
        # Handle price out of range
        pass
    raise

レート制限

  • パブリックエンドポイント: 約 100 リクエスト/分
  • 認証済みエンドポイント: 約 1000 リクエスト/分
  • WebSocket: 購読タイプによって異なります

常に指数バックオフとリクエストのキューイングを実装してください。

主要コントラクトアドレス (Polygon)

CONTRACTS = {
    "CTF_EXCHANGE": "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E",
    "NEG_RISK_CTF_EXCHANGE": "0xC5d563A36AE78145C45a50134d48A1215220f80a",
    "CONDITIONAL_TOKENS": "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045",
    "USDC": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
}

コメント