Polymarket vs Kalshi API: 개발자를 위한 나란히 비교 가이드 (인증, CLOB, WebSocket, 과거 데이터)

Polymarket과 Kalshi는 같은 원시 요소 — CLOB 위의 예/아니오 계약 — 를 완전히 다른 API로 굴린다. 하나는 EIP-712 서명과 Polygon 지갑을 요구하고, 다른 하나는 선택적 FIX를 갖춘 REST 엔드포인트다. 예측 에이전트, 차익거래 봇, 스마트 머니 모니터를 만든다면, 진작 있었어야 할 나란히 비교 가이드가 여기 있다.
한눈에
- •Polymarket은 Polygon 위 CLOB에 제출되는 EIP-712 서명 주문을 쓴다 — 지갑 온보딩과 가스비가 적용된다.
- •Kalshi는 표준 REST + WebSocket 인증(이메일/비밀번호 → 토큰)에 더해, 기관 사용자를 위한 선택적 FIX 게이트웨이를 쓴다.
- •둘 다 오더북, 거래, 과거 데이터를 노출하지만, 스키마와 청산 시맨틱이 충분히 달라 '통합' 라이브러리가 이 크립토/퀀트 툴링 구석에서 가장 많이 요청되는 HN Show HN 주제가 된다.
- •동등 계약 간 거래소 횡단 차익거래가 가장 흔한 구축 패턴이다(GitHub에 오픈소스 봇 10개 이상).
- •API Pick Prediction Markets Search는 자연어 계약 발견을 위해 두 거래소를 하나의 POST 엔드포인트로 감싼다 — 호출당 50 크레딧, 순위 매겨진 시맨틱 결과.
이 글이 존재하는 이유
예측 시장 위에서 무언가를 만드는 데 시간을 좀 써봤다면, 정설격 요청을 알 것이다: '같은 Python 스크립트에서 Polymarket과 Kalshi를 쿼리하고 매칭되는 계약의 깔끔한 리스트를 돌려받고 싶다.' 모든 예측 시장 Show HN의 HN 댓글 스레드는 필연적으로 이것으로 수렴한다 — "예측 시장을 위한 CCXT" 게시물의 반복 패턴이 있는데, 수요가 존재하고 기존 솔루션은 딱 들어맞지 않는다는 신호다.
어려움은 실재한다. 두 거래소는 같은 원시 요소 — 중앙 지정가 주문장(CLOB) 위의 이진 "예/아니오" 계약 — 를 풀지만, 극적으로 다른 API로 노출한다. 여기 둘 다에 대한 동작하는 개발자 관점을, 실제로 필요한 코드와 함께 나란히 정리한다.
두 거래소, 두 아키텍처
Polymarket
- 체인: Polygon (USDC.e 정산)
- 인증: 지갑 개인키를 쓴 EIP-712 typed-data 서명; 전통적인 bearer 토큰 없음
- 주문 제출: 서명된 주문을 CLOB API에 제출; 가스는 메타 트랜잭션을 통해 Polymarket이 부담
- 시장 발견: 활성 시장 브라우징용 Gamma API(REST + JSON), 그리고 라이브 오더북용 별도 CLOB API
- 실시간 데이터: 오더북 업데이트와 거래를 위한 WebSocket 스트림
- 과거 데이터: 거래용 REST 엔드포인트; 일별 스냅샷은 별도로 다운로드 가능
Kalshi
- 정산: ACH와 전신 송금을 통한 USD(미국 은행 필요)
- 인증: 이메일 + 비밀번호 → bearer 토큰, 또는 API 키(기관)
- 주문 제출:
/portfolio/orders로의 표준 인증 REST POST - 시장 발견: 이벤트, 시장, 시리즈용 REST 엔드포인트; 깔끔한 스키마
- 실시간 데이터: 체결, 오더북, 티커를 위한 WebSocket과 FIX(기관)
- 과거 데이터: 거래용 REST 엔드포인트; 시장 정산 및 청산 데이터가 직관적
나란히 비교
| Polymarket | Kalshi | API Pick | |
|---|---|---|---|
| 인증 | EIP-712 서명 주문 + Polygon 지갑 | 이메일/비밀번호 → bearer; 또는 API 키 | x-api-key 헤더(읽기 전용 발견) |
| 정산 | Polygon 위 USDC | USD 은행 송금(미국 전용) | 해당 없음(검색만) |
| 미국 합법성 | 지오펜싱(미국 아님) | CFTC 규제 | 해당 없음 |
| 실시간 | WebSocket | WebSocket + FIX | 해당 없음 |
| 과거 데이터 | REST 거래 + 스냅샷 | REST 거래 + 정산 | 검색이 출처 링크를 반환 |
| 최적 | 크립토 네이티브, 글로벌 시장, 스마트 머니 추적 | 미국 규제, 선거 & 경제 | 거래소 횡단 계약 발견 |
동작하는 코드: 각각의 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: 둘에 걸친 자연어 발견
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에서 가장 흔한 패턴: "이 Polymarket 계약은 이 Kalshi 계약과 같은 결과로 정산된다"는 큐레이션된 화이트리스트. 봇은 두 주문장을 지켜보며 내재 확률을 계산하고, 스프레드가 임계값을 넘으면 포지션을 잡는다. 예: ImMike/polymarket-arbitrage와 realfishsam/prediction-market-arbitrage-bot.
어려운 부분은 화이트리스트다. "Will the Fed cut by 25 bps at the December meeting"은 사람에게는 같아 보이지만 정산 출처와 정확한 표현이 다르다. 자동 매처는 충분히 자주 틀려서 실제 봇은 사람이 큐레이션한 매핑을 쓴다.
2. 스마트 머니 모니터
Polymarket의 고래는 온체인에서 보인다. 모니터가 특정 시장에 대한 대규모 주문 흐름을 Polygon에서 지켜보고, 큰 포지션을 드러내며, 뉴스 API에 헤드라인이 뜨기 전에 빠른 가격 변동을 표시한다. 외견상 변동이 뉴스 주도인지 순수 투기인지 확인하려면 News Search와 짝지어라.
3. LLM 에이전트를 위한 예측 피드
현재의 Polymarket / Kalshi 가격을 LLM 에이전트의 컨텍스트에 끌어오면 모델이 확률에 근거한 답을 줄 수 있다: "현재 베팅 시장은 X의 확률을 약 65%로 내재한다". 이것이 API Pick이 커버하는 발견 사용 사례다 — 에이전트의 자연어 질문이 주어지면, 순위 매겨진 계약을 반환해 에이전트가 답에 가격을 인용할 수 있게 한다.
흔한 함정 (HN 댓글에서 모음)
- Polymarket EIP-712 서명 — 주문 서명은 결정론적이지만 툴링 오류가 흔하다. 직접 굴리지 말고
py-order-utils를 써라. 초기 봇 손실의 대부분은 API가 조용히 거부하는 서명 불일치에서 온다. - Kalshi 레이트 리밋 — 100 req/sec로 문서화되어 있지만 바쁜 이벤트 날(선거 밤, FOMC)에는 일부 엔드포인트에서 더 낮다. 클라이언트에 백오프 재시도를 넣어라.
- Polymarket 가스 급등 — Polygon 가스는 대량 거래일에 튈 수 있다. Polymarket은 메타 트랜잭션으로 대부분의 주문 제출을 보조하지만 정산과 출금은 사용자 부담이다. P&L 계산에 이를 반영하라.
- 정산 불일치 — 외견상 등가물이 때로 다르게 정산된다. 쌍 거래 전에 항상 두 계약의 정산 출처 조항을 읽어라.
- WebSocket 끊김 — 두 거래소 모두 일상적인 WebSocket 단절이 있다. 시퀀스 번호 재생을 갖춘 재연결 로직은 어떤 운영 봇에도 타협 불가다.
빠른 선택
이것이 향하는 곳
예측 시장은 지금 유별나게 많은 주류의 주목을 받고 있다: 미국 선거, FOMC 이벤트, 스포츠, AI 도약 질문을 둘러싼 더 큰 거래량; 내재 확률을 드러내는 뉴스 사이트와의 더 넓은 통합; 그리고 같은 주제로 수렴하는 개발자 툴링의 물결(Show HN, GitHub 리포) — '누군가 예측 시장을 위한 CCXT를 써야 한다.'
우리는 CCXT 스타일의 통합 실행 라이브러리가 올바른 형태라고 생각하지 않는다. 인증, 정산, 규제 체제의 차이가 너무 깊어서 사용자에게 거짓말하지 않고는 깔끔하게 추상화할 수 없다. 하지만 발견 문제 — 자연어 질문이 주어지면 이미 존재하는 계약을 찾기 — 는 시맨틱 검색으로 풀 수 있고, 그것이 API Pick Prediction Markets Search가 하는 일이다. 계약을 찾고, 주문은 거래소에서 넣어라.
자주 묻는 질문
어느 거래소가 계약이 더 많은가?
작성 시점 기준, 둘 다 수만 개의 활성 시장을 등록한다. Polymarket은 크립토 네이티브하고 글로벌한 쪽으로 기운다(정치, 스포츠, 크립토, 시사). Kalshi는 CFTC 규제를 받고 미국 중심이다(선거, 경제, 날씨, 스포츠). 거래량 분포는 카테고리마다 다르다 — 미국 선거는 보통 Kalshi가 더 깊고, 글로벌 정치와 크립토 네이티브 질문은 Polymarket이 그렇다.
왜 오픈소스 '통합' 라이브러리가 Show HN에 계속 등장하는가?
수요가 존재하는데 아무도 잘 풀지 못했기 때문이다. 'Open-source library to unify Polymarket and Kalshi APIs', 'dr-manhattan — CCXT for Prediction Markets' 같은 Show HN 게시물은 반복되는 패턴이다. 어려운 점은 동등 계약(같은 결과, 다른 표현)을 매칭하고 정산 시맨틱을 조정하는 것이다. 라이브러리는 보통 인증 래퍼는 잘 만들지만 계약 매칭 앞에서 멈춘다.
기본적인 거래소 횡단 차익거래는 어떻게 하는가?
개념적으로는: 서로 다른 거래소에서 같은 결과로 정산되는 두 계약을 찾고, 내재 확률을 확인하고, 더 비싼 'No' 쪽과 더 싼 'Yes' 쪽을 잡아 정산 때까지 보유한다. 실제로는 실행이 마찰이다: Polymarket 가스비, Kalshi USD 자금 조달, 부분 체결, 그리고 위의 매칭 문제. GitHub의 대부분의 라이브 차익거래 봇은 자동으로 발견하기보다 계약 쌍 매핑의 큐레이션된 화이트리스트로 돈다.
Polymarket은 미국에서 합법인가?
Polymarket은 현재 미국 사용자에게 승인되지 않았으며, 접근이 지오펜싱된다. Kalshi는 CFTC 규제를 받고 미국에서 합법이다. 미국 사용자를 위한 제품을 만든다면 Kalshi가 유일한 선택지다. 글로벌하게 만든다면 Polymarket이 더 넓은 시장 커버리지를 갖는다.
이 스택에서 API Pick은 어디에 들어가는가?
API Pick Prediction Markets Search는 '발견' 문제를 푼다: 자연어 질문(예: 'Fed cuts rates by year-end')이 주어지면, 한 번의 POST 호출로 Polymarket과 Kalshi 계약에 걸친 순위 매겨진 시맨틱 매치를 반환한다. 우리는 주문 실행 API를 대체하지 않는다 — 주문을 넣으려면 여전히 각 거래소로 직접 간다. 우리는 올바른 시장을 찾는 일을 쉽게 만든다.
이 글에서 사용한 API
Sarah Choy는 API Pick의 CEO입니다. AI 에이전트와 LLM 워크플로를 위한 프로덕션 등급 API에 대해 씁니다.