API · Справочник

CLOB (центральный лимитный стакан заявок) на clob.polymarket.com — это место, где ордера стоят и совпадают. Вы читаете стакан, цены и tick size без аутентификации, а торгуете (ставите / отменяете ордера, читаете свой баланс) с учётными данными API и подписью. Это справочник CLOB V2 — обеспечение — это pUSD, комиссии on-chain, а мейкеры платят ноль.

Читаем стакан заявок (без аутентификации)

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"

Пример ответа

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

Эндпоинты чтения

ЭндпоинтВозвращает
GET /book?token_id=Полный стакан заявок (биды / аски).
GET /price?token_id=&side=Лучший бид или аск.
GET /midpoint?token_id=Средняя цена = (лучший бид + лучший аск) / 2.
GET /spread?token_id=Лучший аск − лучший бид.
GET /tick-size?token_id=Минимальный шаг цены (округляйте до него свою цену).

Лимиты высокие: CLOB ~9 000 запросов / 10 с, /book и /price 1 500 / 10 с, а превышающие лимит запросы притормаживаются, а не отклоняются. Подробнее о 429.

Ставим и отменяем ордер (с аутентификацией)

Один вызов собирает, подписывает (структуру ордера V2) и отправляет ваш ордер. Вы выбираете тип ордера:

ТипПоведение
GTCGood-Till-Cancelled — стоит в стакане, пока не исполнится или не будет отменён.
GTDGood-Till-Date — стоит до отметки времени истечения.
FOKFill-Or-Kill — исполнить весь ордер сразу или отменить его.
FAKFill-And-Kill — исполнить, что можно, сразу, остальное отменить.
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
Две настройки на рынок. Передавайте реальный tick_size рынка ("0.01" или "0.001") и ставьте neg_risk=True для многоисходных рынков «отрицательного риска» — оба значения читайте из Gamma (orderPriceMinTickSize, negRisk) перед подписью. Кроме того: минимальный размер ордера — 5 акций, а ваша цена уже должна быть округлена до тика, иначе ордер отклоняется.
Факты об ордере V2. Подписываемая структура отказалась от nonce, feeRateBps, taker и expiration и добавила timestamp, metadata и builder; версия домена EIP-712 у Exchange — "2". Комиссии собираются on-chain при совпадении — мейкеры платят 0, платят только тейкеры. Перед торговлей вы должны одобрить pUSD + условные токены на трёх контрактах V2 (см. исправление allowance).

Комиссии: платят только тейкеры, и ставка изгибается

С мейкеров никогда не берут комиссию. Тейкеры платят комиссию, которая не плоская — она масштабируется с неопределённостью рынка и различается по категориям. Формула:

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

Член p·(1-p) означает, что комиссия достигает пика при 50/50 и уменьшается к краям 1¢ и 99¢ - поэтому почти определённый исход дёшево забрать, а «орёл или решка» дорог. Тейкерская feeRate по категориям:

КатегорияТейкерская feeRate
Крипто0.07 (7 bps) — самая высокая
Экономика / Культура / Погода0.05
Финансы / Политика / Технологии / Упоминания0.04
Спорт0.03
Геополитика и мировые события0 - без комиссии

Читайте актуальную ставку по токену через GET /fee-rate-bps?token_id=, а не хардкодьте её; комиссии округляются до 5 знаков (мин. 0.00001 pUSD). Именно потому, что мейкеры платят ноль, большинство ботов без преимущества котируют, а не забирают.

Рынки отрицательного риска (многоисходные)

События с несколькими кандидатами («кто выиграет выборы?») — это neg-risk рынки: их исходы связаны, поэтому акция «Нет» в одном исходе конвертируется в акцию «Да» в каждом другом через Neg Risk Adapter — капиталоэффективно, но механически иначе. Они работают на других контрактах, чем бинарные рынки, поэтому вы обязаны передавать neg_risk=True в опциях ордера (читайте флаг negRisk рынка из Gamma). Пропустите его — и ордер подписывается против неверной биржи и отклоняется.

Условные токены: split, merge, redeem (за пределами стакана)

Под каждым рынком лежит Conditional Token Framework (CTF). Токены исходов — это ERC-1155 токены, и каждая пара Да/Нет обеспечена ровно $1.00 pUSD, заблокированными в контракте CTF. Это даёт вам три примитива, которых один стакан не даёт:

ОперацияЧто делаетЗачем боту
SplitЗаблокировать $1 pUSD → выпустить 1 Да + 1 НетСоздать инвентарь, не пересекая спред; котировать обе стороны.
MergeСжечь 1 Да + 1 Нет → вернуть $1 pUSDМгновенно выйти из хеджированной пары — без ожидания расчёта, без тейкерской комиссии.
RedeemПосле расчёта выигравший токен → $1.00 pUSDОбналичить рассчитанную позицию (redeemPositions).

Split и merge — основа CTF-арбитража: если Да + Нет торгуются ниже $1.00 в стакане, купите оба и merge обратно в $1.00; если они торгуются выше $1.00, split $1 в свежую пару и продайте оба. Погашение проводится через контракт ConditionalTokens, как только оракул публикует исход on-chain — позиция показывает redeemable: true в Data API, когда её можно забрать. ID позиций выводятся через getConditionId → getCollectionId → getPositionId.

Продвинутое: RFQ и комбо-рынки (для серьёзных мейкеров)

Помимо стакана заявок, Полимаркет держит систему Request-for-Quote (RFQ), используемую особенно для комбо-рынков — существующих рынков, собранных в многоногие составные позиции. Процесс имеет три фазы: тейкер запрашивает котировку, мейкеры конкурируют котировками, а выбранный мейкер получает last look, чтобы подтвердить или отклонить перед исполнением.

  • Найти комбо: GET /v1/rfq/combo-markets (публичный; limit 1-100, cursor, exclude). Каждое комбо раскрывает два ID позиций (Да = индекс 0, Нет = индекс 1).
  • Котировать как мейкер: POST combos-rfq-api.polymarket.com/v1/maker/quotes (L2 auth). Вы сами генерируете quote_id и отправляете rfq_id, maker_address, signature_type, подписанный ордер Exchange и price_e6 / size_e6 как строки с фиксированной точкой на шесть знаков (соглашение *_e6 избегает потери точности float).
  • Last look: пока RFQ находится в AWAITING_MAKER_CONFIRMATION, ответьте CONFIRM, DECLINE или дайте ему стать TIMED_OUT.

Конечный автомат RFQ: CREATED → COLLECTING_QUOTES → AWAITING_REQUESTER_ACCEPTANCE → AWAITING_MAKER_CONFIRMATION → EXECUTING → FILLED (иначе FAILED / EXPIRED / CANCELED / REJECTED). Подпишитесь на шлюз WebSocket RFQ для актуального состояния. Это нишевое — большинству ботов нужен только стакан CLOB выше — но именно так оценивается ликвидность многоногих и комбо-позиций.

Проверяем balance и allowance

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

Если здесь показан нулевой allowance, одобрите pUSD/CTF контрактам биржи V2 перед постановкой ордеров.

ID токенов Да / Нет. У каждого бинарного рынка два ID токенов. Не хардкодьте, какой из них Да — читайте разобранный массив outcomes (Gamma возвращает его, а также clobTokenIds, как JSON-строки, которые нужно декодировать) и сопоставляйте по имени.

Далее: Аутентификация и кошельки · WebSocket: стриминг стакана · Исправить ошибку CLOB.