Polymarket vs Kalshi API: руководство разработчика бок о бок (Auth, CLOB, WebSocket, исторические данные)

Polymarket и Kalshi реализуют один и тот же примитив — yes/no контракты на CLOB — через совершенно разные API. Один требует EIP-712-подписей и кошелька Polygon; другой — это REST-эндпоинт с опциональным FIX. Если вы строите forecasting-агента, арбитражного бота или монитор smart-money, вот руководство бок о бок, которое уже должно было существовать.
Кратко
- •Polymarket использует EIP-712-подписанные ордера, отправляемые в свой CLOB на Polygon — нужны онбординг кошелька и плата за газ.
- •Kalshi использует стандартную REST + WebSocket-авторизацию (email/пароль → токен), плюс опциональный FIX-шлюз для институциональных пользователей.
- •Обе отдают стакан, сделки и исторические данные, но схема и семантика разрешения различаются достаточно, чтобы 'унифицированные' библиотеки были самой запрашиваемой темой HN Show HN в этом уголке crypto/quant-инструментария.
- •Кросс-площадочный арбитраж между эквивалентными контрактами — самый частый паттерн сборки (10+ open-source ботов на GitHub).
- •API Pick Prediction Markets Search оборачивает обе площадки в один POST-эндпоинт для discovery контрактов на естественном языке — 50 кредитов за вызов, ранжированные семантические результаты.
Почему существует эта статья
Если вы хоть сколько-то строили на prediction-markets, вы знаете каноническую просьбу: 'Хочу запрашивать Polymarket и Kalshi из одного Python-скрипта и получать обратно чистый список совпадающих контрактов.' Тред комментариев HN на каждом prediction-market Show HN неизбежно сходится на этом — есть повторяющийся паттерн постов "CCXT for prediction markets", указывающий, что спрос существует, а существующие решения не вполне попадают в цель.
Сложность реальна. Две площадки решают один примитив — бинарные "yes/no" контракты на central limit order book — но отдают их через драматически разные API. Вот рабочий взгляд разработчика на обе, бок о бок, с кодом, который вам реально нужен.
Две площадки, две архитектуры
Polymarket
- Сеть: Polygon (расчёты в USDC.e)
- Авторизация: подпись типизированных данных EIP-712 приватным ключом кошелька; никакого традиционного bearer-токена
- Выставление ордеров: подписанный ордер отправляется в CLOB API; газ оплачивает Polymarket через мета-транзакции
- Discovery рынков: Gamma API (REST + JSON) для просмотра активных рынков, плюс отдельный CLOB API для живого стакана
- Данные в реальном времени: WebSocket-стрим для обновлений стакана и сделок
- Исторические данные: REST-эндпоинты для сделок; дневные снапшоты скачиваются отдельно
Kalshi
- Расчёты: USD через ACH и wire (нужен банк США)
- Авторизация: email + пароль → bearer-токен, ИЛИ API-ключ (институциональный)
- Выставление ордеров: стандартный авторизованный REST POST на
/portfolio/orders - Discovery рынков: REST-эндпоинты для событий, рынков и серий; чистая схема
- Данные в реальном времени: WebSocket и FIX (институциональный) для исполнений, стакана, тикера
- Исторические данные: REST-эндпоинты для сделок; данные о разрешении рынка и расчётах прямолинейны
Бок о бок
| Polymarket | Kalshi | API Pick | |
|---|---|---|---|
| Авторизация | EIP-712-подписанные ордера + кошелёк Polygon | Email/пароль → bearer; или API-ключ | Заголовок x-api-key (read-only discovery) |
| Расчёты | USDC на Polygon | USD банковский перевод (только США) | n/a (только поиск) |
| Легальность в США | Геоблокировка (не США) | Регулируется CFTC | n/a |
| Реальное время | WebSocket | WebSocket + FIX | n/a |
| Исторические | REST сделки + снапшоты | REST сделки + расчёты | Поиск возвращает ссылки на источник |
| Лучший сценарий | Crypto-native, глобальные рынки, отслеживание smart-money | Регулируемые в США, выборы и экономика | Кросс-площадочный discovery контрактов |
Рабочий код: 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: discovery на естественном языке по обеим
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.Три продакшен-паттерна, которые реально работают
1. Кросс-площадочный арбитражный бот
Самый частый паттерн на GitHub: курируемый whitelist "этот контракт Polymarket разрешается по тому же исходу, что и этот контракт Kalshi". Бот следит за обоими стаканами, считает подразумеваемую вероятность и занимает позицию, когда спред пересекает порог. Примеры: ImMike/polymarket-arbitrage и realfishsam/prediction-market-arbitrage-bot.
Сложная часть — whitelist. "Will the Fed cut by 25 bps at the December meeting" для человека выглядит одинаково, но источники разрешения и точная формулировка различаются; автоматический matcher ошибается достаточно часто, чтобы реальные боты использовали сопоставления, курируемые человеком.
2. Монитор smart-money
Киты на Polymarket видны on-chain. Монитор следит за Polygon на крупный поток ордеров по конкретным рынкам, выводит большие позиции и помечает резкие движения цены до того, как заголовки попадут в news-API. Совместите с News Search, чтобы подтвердить, движение ли это, вызванное новостями, или чистая спекуляция.
3. Forecasting-фид для LLM-агента
Подтягивание текущих цен Polymarket / Kalshi в контекст LLM-агента позволяет модели давать ответы, обоснованные вероятностью: "текущие ставочные рынки подразумевают ~65% вероятность X". Это и есть сценарий discovery, который покрывает API Pick — по вопросу на естественном языке от агента вернуть ранжированные контракты, чтобы агент мог процитировать цену в своём ответе.
Частые подводные камни (собрано из комментариев HN)
- Подпись EIP-712 в Polymarket — подпись ордера детерминирована, но ошибки инструментария часты. Используйте
py-order-utils, а не свою реализацию. Большинство ранних потерь ботов — от рассогласований подписи, которые API молча отклоняет. - Rate-limit Kalshi — задокументирован как 100 запросов/сек, но ниже для некоторых эндпоинтов в загруженные событийные дни (ночи выборов, FOMC). Встройте retry-with-backoff в свой клиент.
- Скачки газа Polymarket — газ Polygon может подскочить в дни большого объёма. Polymarket субсидирует большую часть выставления ордеров через мета-транзакции, но расчёты и вывод средств оплачивает пользователь. Учитывайте это в расчётах P&L.
- Рассогласования расчётов — явные эквиваленты иногда разрешаются по-разному. Всегда читайте пункты об источнике разрешения обоих контрактов до парной торговли.
- Разрывы WebSocket — у обеих площадок бывают рутинные сбои WebSocket. Логика переподключения с воспроизведением по sequence-number необсуждаема для любого продакшен-бота.
Выбираем быстро
Куда это движется
Prediction-markets получают необычно много внимания мейнстрима прямо сейчас: большие объёмы вокруг выборов в США, событий FOMC, спорта и вопросов AI-takeoff; более широкие интеграции с новостными сайтами, выводящими подразумеваемые вероятности; и волна инструментария для разработчиков (Show HN, GitHub-репозитории), сходящаяся на одной теме — 'кто-нибудь должен написать CCXT для prediction-markets.'
Мы не думаем, что унифицированная библиотека исполнения в стиле CCXT — правильная форма. Различия в авторизации, расчётах и регуляторном режиме слишком глубоки, чтобы абстрагировать их чисто, не вводя пользователя в заблуждение. Но проблема discovery — по вопросу на естественном языке найти уже существующие контракты — решаема семантическим поиском, и именно это делает API Pick Prediction Markets Search. Найдите контракт; выставьте ордер на площадке.
Часто задаваемые вопросы
У какой площадки больше контрактов?
На момент написания обе листят десятки тысяч активных рынков. Polymarket уклоняется в crypto-native и глобальное (политика, спорт, крипто, текущие события); Kalshi регулируется CFTC и ориентирован на США (выборы, экономика, погода, спорт). Распределение объёма зависит от категории — по выборам в США Kalshi обычно глубже; по глобальной политике и crypto-native вопросам — Polymarket.
Почему open-source 'унифицированные' библиотеки постоянно всплывают на Show HN?
Потому что спрос существует, а никто не решил это хорошо. Посты Show HN вроде 'Open-source library to unify Polymarket and Kalshi APIs' и 'dr-manhattan — CCXT for Prediction Markets' — повторяющиеся паттерны. Сложность — в сопоставлении эквивалентных контрактов (один исход, разная формулировка) и согласовании семантики расчётов. Библиотеки обычно справляются с обёрткой авторизации, но останавливаются, не доходя до сопоставления контрактов.
Как сделать базовый кросс-площадочный арбитраж?
Концептуально: найти два контракта, разрешающихся по одному исходу на разных площадках, проверить подразумеваемые вероятности, взять более дорогую сторону 'No' и более дешёвую сторону 'Yes', держать до разрешения. На практике трение — в исполнении: плата за газ Polymarket, USD-фондирование Kalshi, частичные исполнения и проблема сопоставления выше. Большинство живых арбитражных ботов на GitHub работают по курируемому whitelist сопоставлений пар контрактов, а не находят их автоматически.
Легален ли Polymarket в США?
Polymarket в настоящее время не авторизован для пользователей США; доступ геоблокируется. Kalshi регулируется CFTC и легален в США. Если вы строите продукт для пользователей США, Kalshi — единственный вариант. Если строите глобально, Polymarket несёт более широкое покрытие рынков.
Где API Pick вписывается в этот стек?
API Pick Prediction Markets Search решает проблему 'discovery': по вопросу на естественном языке (например, 'Fed cuts rates by year-end') он возвращает ранжированные семантические совпадения по контрактам Polymarket и Kalshi одним POST-вызовом. Мы не заменяем API исполнения ордеров — для выставления ордеров вы по-прежнему идёте к каждой площадке напрямую. Мы делаем поиск нужного рынка простым.
API, использованные в статье
Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.