API · Dokumentacja

CLOB (Central Limit Order Book) pod adresem clob.polymarket.com to miejsce, gdzie zlecenia spoczywają i się dopasowują. Odczytujesz księgę, ceny i wielkość ticka bez uwierzytelniania, a handlujesz (składasz / anulujesz zlecenia, odczytujesz saldo) z poświadczeniami API i podpisywaniem. To dokumentacja CLOB V2 - zabezpieczeniem jest pUSD, opłaty są on-chain, a makerzy płacą zero.

Odczytaj arkusz zleceń (bez uwierzytelniania)

from py_clob_client_v2 import ClobClient   # pip install py-clob-client-v2
client = ClobClient(host="https://clob.polymarket.com", chain_id=137)   # read-only: no key
book = client.get_order_book(token_id)
mid  = client.get_midpoint(token_id)
print(book.bids[0].price, book.asks[0].price, mid)
// polymarket_client_sdk_v2 (official, repo rs-clob-client-v2)
use polymarket_client_sdk_v2::clob::{Client, Config};
use polymarket_client_sdk_v2::clob::types::request::OrderBookSummaryRequest;
let client = Client::new("https://clob.polymarket.com", Config::default())?;
let book = client.order_book(&OrderBookSummaryRequest::builder().token_id(token_id).build()).await?;
curl -s "https://clob.polymarket.com/book?token_id=$TOKEN_ID"

Przykładowa odpowiedź

{
  "market": "0x...",
  "bids": [ { "price": "0.62", "size": "1400" }, { "price": "0.61", "size": "900" } ],
  "asks": [ { "price": "0.64", "size": "1100" }, { "price": "0.65", "size": "2000" } ]
}

Endpointy odczytu

EndpointZwraca
GET /book?token_id=Pełny arkusz zleceń (bids / asks).
GET /price?token_id=&side=Najlepszy bid lub ask.
GET /midpoint?token_id=Cena środkowa = (najlepszy bid + najlepszy ask) / 2.
GET /spread?token_id=Najlepszy ask − najlepszy bid.
GET /tick-size?token_id=Minimalny krok ceny (zaokrąglij do niego cenę).

Limity są wysokie: CLOB ~9000 żądań / 10 s, /book i /price 1500 / 10 s, a żądania ponad limit są dławione, nie odrzucane. Więcej o 429.

Złóż i anuluj zlecenie (uwierzytelnione)

Jedno wywołanie buduje, podpisuje (strukturę zlecenia V2) i wysyła twoje zlecenie. Wybierasz typ zlecenia:

TypZachowanie
GTCGood-Till-Cancelled - spoczywa w księdze do realizacji lub anulowania.
GTDGood-Till-Date - spoczywa do znacznika czasu wygaśnięcia.
FOKFill-Or-Kill - zrealizuj całe zlecenie natychmiast albo je anuluj.
FAKFill-And-Kill - zrealizuj natychmiast, ile się da, resztę anuluj.
from py_clob_client_v2 import (ClobClient, OrderArgs, OrderType,
                               PartialCreateOrderOptions, Side, OrderPayload)

# authenticated client (creds from create_or_derive_api_key - see Authentication)
client = ClobClient(host="https://clob.polymarket.com", chain_id=137, key=PK, creds=creds)

resp = client.create_and_post_order(
    order_args=OrderArgs(token_id=token_id, price=0.62, side=Side.BUY, size=10),
    options=PartialCreateOrderOptions(tick_size="0.01", neg_risk=False),  # read both off the market
    order_type=OrderType.GTC,            # GTC, GTD, FOK or FAK
)
# resp -> {"success": true, "orderID": "0x...", "status": "live"}
client.cancel_order(OrderPayload(orderID=resp["orderID"]))   # cancel
Dwa ustawienia per rynek. Przekaż prawdziwą tick_size rynku ("0.01" lub "0.001") i ustaw neg_risk=True dla wielowynikowych rynków „negative risk" - odczytaj oba z Gamma (orderPriceMinTickSize, negRisk) przed podpisaniem. Poza tym: minimalna wielkość zlecenia to 5 udziałów, a twoja cena musi być już zaokrąglona do ticka, inaczej zlecenie zostanie odrzucone.
Fakty o zleceniu V2. Z podpisywanej struktury usunięto nonce, feeRateBps, taker i expiration, a dodano timestamp, metadata i builder; wersja domeny EIP-712 Exchange to "2". Opłaty pobierane są on-chain przy dopasowaniu - makerzy płacą 0, płacą tylko takerzy. Przed handlem musisz zatwierdzić pUSD + tokeny warunkowe dla trzech kontraktów V2 (zobacz poprawkę allowance).

Opłaty: płacą tylko takerzy, a stawka jest krzywoliniowa

Makerzy nigdy nie są obciążani. Takerzy płacą opłatę, która nie jest stała - skaluje się z niepewnością rynku i różni się w zależności od kategorii. Wzór:

fee = shares × feeRate × p × (1 - p)      # p = share price, 0..1

Czynnik p·(1-p) oznacza, że opłata osiąga szczyt przy 50/50 i maleje ku skrajnościom 1¢ i 99¢ - więc niemal pewny wynik jest tani w objęciu, a rzut monetą drogi. Stawka takera feeRate per kategoria:

KategoriafeeRate takera
Krypto0,07 (7 bps) - najwyższa
Ekonomia / Kultura / Pogoda0,05
Finanse / Polityka / Tech / Wzmianki0,04
Sport0,03
Geopolityka i wydarzenia światowe0 - bez opłat

Odczytuj stawkę na żywo per token przez GET /fee-rate-bps?token_id=, zamiast zapisywać ją na sztywno; opłaty zaokrąglają się do 5 miejsc (min 0,00001 pUSD). To, że makerzy płacą zero, jest powodem, dla którego większość botów bez przewagi kwotuje, zamiast obejmować.

Rynki negative-risk (wielowynikowe)

Wydarzenia wielokandydatowe („kto wygra wybory?") to rynki neg-risk: ich wyniki są powiązane, więc udział Nie w jednym wyniku konwertuje się na udział Tak w każdym innym przez Neg Risk Adapter - kapitałooszczędnie, ale mechanicznie inaczej. Działają na innych kontraktach niż rynki binarne, więc musisz przekazać neg_risk=True w opcjach zlecenia (odczytaj flagę negRisk rynku z Gamma). Pomiń to, a zlecenie zostanie podpisane wobec niewłaściwej giełdy i odrzucone.

Tokeny warunkowe: split, merge, redeem (poza księgą)

Pod każdym rynkiem leży Conditional Token Framework (CTF). Tokeny wyników to tokeny ERC-1155, a każda para Tak/Nie jest zabezpieczona dokładnie 1,00 USD pUSD zablokowanym w kontrakcie CTF. Daje ci to trzy prymitywy, których sam arkusz zleceń nie ma:

OperacjaCo robiPo co bot jej używa
SplitZablokuj 1 USD pUSD → wybij 1 Tak + 1 NieUtwórz zapas bez przekraczania spreadu; kwotuj obie strony.
MergeSpal 1 Tak + 1 Nie → odzyskaj 1 USD pUSDWyjdź z zabezpieczonej pary natychmiast - bez czekania na rozstrzygnięcie, bez opłaty takera.
RedeemPo rozstrzygnięciu zwycięski token → 1,00 USD pUSDSpienięż rozstrzygniętą pozycję (redeemPositions).

Split i merge to podstawa arbitrażu CTF: jeśli Tak + Nie handlują się poniżej 1,00 USD w księdze, kup oba i merge z powrotem do 1,00 USD; jeśli handlują się powyżej 1,00 USD, zrób split 1 USD w świeżą parę i sprzedaj oba. Wykup rozlicza się przez kontrakt ConditionalTokens, gdy wyrocznia opublikuje wynik on-chain - pozycja pokazuje redeemable: true w Data API, gdy da się ją odebrać. Identyfikatory pozycji wyprowadza się przez getConditionId → getCollectionId → getPositionId.

Zaawansowane: RFQ i rynki combo (dla poważnych makerów)

Poza arkuszem zleceń Polymarket prowadzi system Request-for-Quote (RFQ), używany zwłaszcza dla rynków combo - istniejących rynków połączonych w wielonożne pozycje złożone. Przepływ ma trzy fazy: taker prosi o kwotę, makerzy konkurują kwotami, a wybrany maker dostaje ostatnie spojrzenie, by potwierdzić lub odmówić przed wykonaniem.

  • Odkrywanie combo: GET /v1/rfq/combo-markets (publiczne; limit 1-100, cursor, exclude). Każde combo udostępnia dwa identyfikatory pozycji (Tak = indeks 0, Nie = indeks 1).
  • Kwotowanie jako maker: POST combos-rfq-api.polymarket.com/v1/maker/quotes (uwierzytelnianie L2). Sam generujesz quote_id i wysyłasz rfq_id, maker_address, signature_type, podpisane zlecenie Exchange oraz price_e6 / size_e6 jako łańcuchy stałoprzecinkowe o sześciu miejscach (konwencja *_e6 unika utraty precyzji float).
  • Ostatnie spojrzenie: gdy RFQ jest w stanie AWAITING_MAKER_CONFIRMATION, odpowiedz CONFIRM, DECLINE lub pozwól mu przejść w TIMED_OUT.

Maszyna stanów RFQ: CREATED → COLLECTING_QUOTES → AWAITING_REQUESTER_ACCEPTANCE → AWAITING_MAKER_CONFIRMATION → EXECUTING → FILLED (inaczej FAILED / EXPIRED / CANCELED / REJECTED). Zasubskrybuj bramkę WebSocket RFQ dla stanu na żywo. To nisza - większość botów potrzebuje tylko powyższej księgi CLOB - ale tak właśnie wycenia się płynność wielonożną i combo.

Sprawdź saldo i allowance

client.get_balance_allowance(...)   # collateral (pUSD) and conditional-token allowances

Jeśli pokaże zerowe allowance, zatwierdź pUSD/CTF dla kontraktów giełdy V2 przed składaniem zleceń.

Identyfikatory tokenów Tak / Nie. Każdy rynek binarny ma dwa identyfikatory tokenów. Nie zapisuj na sztywno, który to Tak - odczytaj sparsowaną tablicę outcomes (Gamma zwraca ją oraz clobTokenIds jako łańcuchy zakodowane w JSON, które musisz zdekodować) i mapuj po nazwie.

Dalej: Uwierzytelnianie i portfele · WebSocket: strumień księgi · Napraw błąd CLOB.