API Polymarket vs Kalshi: przewodnik porównawczy dla programistów (auth, CLOB, WebSocket, dane historyczne)

Polymarket i Kalshi realizują ten sam prymityw — kontrakty tak/nie na CLOB — przez zupełnie różne API. Jedno wymaga podpisów EIP-712 i portfela Polygon; drugie to endpoint REST z opcjonalnym FIX. Jeśli budujesz agenta prognozującego, bota arbitrażowego lub monitor smart money, oto przewodnik porównawczy, który już powinien istnieć.
TL;DR
- •Polymarket używa zleceń podpisanych EIP-712 wysyłanych do swojego CLOB na Polygon — obowiązują onboarding portfela i opłaty za gas.
- •Kalshi używa standardowej autoryzacji REST + WebSocket (e-mail/hasło → token), plus opcjonalna bramka FIX dla użytkowników instytucjonalnych.
- •Oba udostępniają księgę zleceń, transakcje i dane historyczne, ale schemat i semantyka rozliczeń różnią się na tyle, że 'ujednolicone' biblioteki są najczęściej proszonym tematem Show HN w tym zakątku narzędzi crypto/quant.
- •Arbitraż międzyrynkowy na równoważnych kontraktach to najczęstszy wzorzec budowy (ponad 10 botów open-source na GitHubie).
- •API Pick Prediction Markets Search opakowuje oba rynki w jeden endpoint POST do odkrywania kontraktów w języku naturalnym — 50 kredytów za wywołanie, posortowane wyniki semantyczne.
Dlaczego ten artykuł istnieje
Jeśli spędziłeś jakikolwiek czas budując na rynkach predykcyjnych, znasz kanoniczną prośbę: 'chcę odpytać Polymarket i Kalshi z tego samego skryptu w Pythonie i otrzymać czystą listę pasujących kontraktów.' Wątek komentarzy na HN przy każdym Show HN o rynkach predykcyjnych nieuchronnie zbiega się do tego — istnieje powracający wzorzec postów "CCXT dla rynków predykcyjnych", co wskazuje, że popyt istnieje, a obecne rozwiązania nie do końca trafiają w sedno.
Trudność jest realna. Oba rynki rozwiązują ten sam prymityw — binarne kontrakty "tak/nie" na centralnej księdze zleceń limitowanych — ale udostępniają je przez dramatycznie różne API. Oto działające, programistyczne spojrzenie na oba, obok siebie, z kodem, którego naprawdę potrzebujesz.
Dwa rynki, dwie architektury
Polymarket
- Łańcuch: Polygon (rozliczenia w USDC.e)
- Auth: podpisywanie typowanych danych EIP-712 kluczem prywatnym portfela; brak tradycyjnego tokenu bearer
- Składanie zleceń: podpisane zlecenie wysłane do API CLOB; gas opłacany przez Polymarket via meta-transakcje
- Odkrywanie rynków: Gamma API (REST + JSON) do przeglądania aktywnych rynków, plus osobne API CLOB dla księgi zleceń na żywo
- Dane w czasie rzeczywistym: strumień WebSocket dla aktualizacji księgi zleceń i transakcji
- Dane historyczne: endpointy REST dla transakcji; dzienne snapshoty do pobrania osobno
Kalshi
- Rozliczenie: USD przez ACH i przelew (wymagany bank w USA)
- Auth: e-mail + hasło → token bearer, LUB klucz API (instytucjonalny)
- Składanie zleceń: standardowy uwierzytelniony POST REST do
/portfolio/orders - Odkrywanie rynków: endpointy REST dla zdarzeń, rynków i serii; czysty schemat
- Dane w czasie rzeczywistym: WebSocket i FIX (instytucjonalny) dla realizacji, księgi zleceń, tickera
- Dane historyczne: endpointy REST dla transakcji; dane rozstrzygnięcia i rozliczenia rynków proste
Obok siebie
| Polymarket | Kalshi | API Pick | |
|---|---|---|---|
| Auth | Zlecenia podpisane EIP-712 + portfel Polygon | E-mail/hasło → bearer; lub klucz API | Nagłówek x-api-key (odkrywanie tylko do odczytu) |
| Rozliczenie | USDC na Polygon | Przelew bankowy w USD (tylko USA) | nd. (tylko wyszukiwanie) |
| Legalność w USA | Geofenced (nie USA) | Regulowany przez CFTC | nd. |
| Czas rzeczywisty | WebSocket | WebSocket + FIX | nd. |
| Historyczne | Transakcje REST + snapshoty | Transakcje REST + rozliczenie | Wyszukiwanie zwraca linki do źródła |
| Najlepsze dopasowanie | Crypto-native, rynki globalne, śledzenie smart money | Regulowany w USA, wybory i ekonomia | Odkrywanie kontraktów międzyrynkowe |
Działający kod: hello-world na każdym
Polymarket: lista aktywnych rynków
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: złóż podpisane zlecenie (szkic)
# 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: zaloguj się i złóż zlecenie limitowane
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: odkrywanie w języku naturalnym na obu
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.Trzy wzorce produkcyjne, które naprawdę działają
1. Bot arbitrażu międzyrynkowego
Najczęstszy wzorzec na GitHubie: ręcznie wyselekcjonowana biała lista "ten kontrakt Polymarket rozlicza się na tym samym wyniku, co ten kontrakt Kalshi". Bot obserwuje obie księgi, oblicza prawdopodobieństwo implikowane i zajmuje pozycję, gdy spread przekroczy próg. Przykłady: ImMike/polymarket-arbitrage oraz realfishsam/prediction-market-arbitrage-bot.
Trudną częścią jest biała lista. "Czy Fed obniży o 25 pb na grudniowym posiedzeniu" dla człowieka wygląda tak samo, ale źródła rozstrzygnięcia i dokładne sformułowanie się różnią; automatyczny matcher myli się na tyle często, że prawdziwe boty używają mapowań tworzonych ręcznie.
2. Monitor smart money
Wieloryby na Polymarket są widoczne on-chain. Monitor obserwuje Polygon pod kątem dużego przepływu zleceń na konkretnych rynkach, wydobywa duże pozycje i sygnalizuje szybkie ruchy cen, zanim nagłówki dotrą do API z wiadomościami. Połącz z News Search, aby potwierdzić, czy pozorny ruch jest napędzany wiadomościami, czy to czysta spekulacja.
3. Kanał prognostyczny dla agenta LLM
Wciągnięcie aktualnych cen Polymarket / Kalshi do kontekstu agenta LLM pozwala modelowi udzielać odpowiedzi opartych na prawdopodobieństwie: "obecne rynki zakładów implikują ~65% prawdopodobieństwa X". To jest przypadek użycia odkrywania, który pokrywa API Pick — mając pytanie w języku naturalnym od agenta, zwróć posortowane kontrakty, aby agent mógł zacytować cenę w swojej odpowiedzi.
Częste pułapki (zebrane z komentarzy HN)
- Podpisywanie EIP-712 Polymarketu — podpis zlecenia jest deterministyczny, ale błędy narzędziowe są częste. Używaj
py-order-utils, zamiast pisać własne. Większość wczesnych strat botów wynika z niezgodności podpisów, które API po cichu odrzuca. - Limity zapytań Kalshi — udokumentowane na 100 req/s, ale niższe dla niektórych endpointów w ruchliwe dni zdarzeń (wieczory wyborcze, FOMC). Wbuduj w klienta ponawianie z backoffem.
- Skoki gas Polymarketu — gas na Polygon może podskoczyć w dni dużego wolumenu. Polymarket subsydiuje większość składania zleceń via meta-transakcje, ale rozliczenie i wypłatę opłaca użytkownik. Uwzględnij to w obliczeniach P&L.
- Niezgodności rozliczeń — pozorne równoważniki czasem rozliczają się inaczej. Zawsze czytaj klauzule źródła rozstrzygnięcia obu kontraktów przed handlem parami.
- Rozłączenia WebSocket — oba rynki mają rutynowe zaniki WebSocket. Logika ponownego łączenia z odtwarzaniem numerów sekwencji jest nienegocjowalna dla każdego bota produkcyjnego.
Szybki wybór
Dokąd to zmierza
Rynki predykcyjne otrzymują obecnie niezwykłą ilość uwagi mainstreamu: większe wolumeny wokół wyborów w USA, zdarzeń FOMC, sportu i pytań o AI-takeoff; szersze integracje ze stronami z wiadomościami, które pokazują prawdopodobieństwa implikowane; oraz fala narzędzi programistycznych (Show HN-y, repozytoria GitHub), która zbiega się do tego samego tematu — 'ktoś powinien napisać CCXT dla rynków predykcyjnych.'
Nie sądzimy, że biblioteka ujednoliconej realizacji w stylu CCXT to właściwa forma. Różnice w autoryzacji, rozliczeniu i reżimie regulacyjnym są zbyt głębokie, by je czysto wyabstrahować bez okłamywania użytkownika. Ale problem odkrywania — mając pytanie w języku naturalnym, znaleźć kontrakty, które już istnieją — jest rozwiązywalny dzięki wyszukiwaniu semantycznemu, i to właśnie robi API Pick Prediction Markets Search. Znajdź kontrakt; złóż zlecenie na rynku.
Najczęściej zadawane pytania
Który rynek ma więcej kontraktów?
W chwili pisania oba wymieniają dziesiątki tysięcy aktywnych rynków. Polymarket skłania się ku crypto-native i globalności (polityka, sport, krypto, bieżące wydarzenia); Kalshi jest regulowany przez CFTC i skupiony na USA (wybory, ekonomia, pogoda, sport). Rozkład wolumenu różni się w zależności od kategorii — dla wyborów w USA Kalshi jest zwykle głębszy; dla polityki globalnej i pytań crypto-native jest nim Polymarket.
Dlaczego open-source'owe biblioteki 'ujednolicone' wciąż pojawiają się na Show HN?
Bo popyt istnieje, a nikt nie rozwiązał tego dobrze. Posty na Show HN takie jak 'Open-source library to unify Polymarket and Kalshi APIs' oraz 'dr-manhattan — CCXT for Prediction Markets' to powracające wzorce. Wyzwaniem jest dopasowanie równoważnych kontraktów (ten sam wynik, inne sformułowanie) i pogodzenie semantyki rozliczeń. Biblioteki zwykle dopinają wrapper autoryzacji, ale zatrzymują się przed dopasowywaniem kontraktów.
Jak zrobić podstawowy arbitraż międzyrynkowy?
Koncepcyjnie: znajdź dwa kontrakty rozliczające się na tym samym wyniku na różnych rynkach, sprawdź prawdopodobieństwa implikowane, zajmij droższą stronę 'No' i tańszą stronę 'Yes', trzymaj do rozliczenia. W praktyce tarciem jest realizacja: opłaty za gas Polymarketu, finansowanie w USD Kalshi, częściowe realizacje i problem dopasowania powyżej. Większość żywych botów arbitrażowych na GitHubie działa na ręcznie wyselekcjonowanej białej liście mapowań par kontraktów, zamiast odkrywać je automatycznie.
Czy Polymarket jest legalny w USA?
Polymarket nie jest obecnie autoryzowany dla użytkowników z USA; dostęp jest geofenced. Kalshi jest regulowany przez CFTC i legalny w USA. Jeśli budujesz produkt dla użytkowników z USA, Kalshi to jedyna opcja. Jeśli budujesz globalnie, Polymarket oferuje szerszy zasięg rynkowy.
Gdzie API Pick pasuje w tym stacku?
API Pick Prediction Markets Search rozwiązuje problem 'odkrywania': mając pytanie w języku naturalnym (np. 'Fed obniża stopy przed końcem roku'), zwraca posortowane semantyczne dopasowania w kontraktach Polymarket i Kalshi w jednym wywołaniu POST. Nie zastępujemy API realizacji zleceń — aby składać zlecenia, nadal idziesz bezpośrednio na każdy rynek. Sprawiamy, że znalezienie właściwego rynku jest proste.
API użyte w tym artykule
Sarah Choy jest CEO API Pick. Pisze o budowaniu produkcyjnych API dla agentów AI i przepływów pracy z LLM.