API · 참고 자료
clob.polymarket.com에 있는 CLOB(Central Limit Order Book)은 주문이
대기하고 체결되는 곳입니다. 호가창·가격·틱 사이즈는 인증 없이 읽고, 거래
(주문 넣기/취소, 잔액 조회)는 API 자격 증명과 서명으로 수행합니다.
이 문서는 CLOB V2 참고 자료입니다. 담보는 pUSD이고, 수수료는 온체인이며,
메이커는 수수료를 전혀 내지 않습니다.
호가창 읽기 (인증 불필요)
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 전체 약 10초당 9,000건, /book과 /price는 10초당 1,500건이며,
한도를 초과한 요청은 거부되지 않고 스로틀링됩니다. 429에 관한 자세한 내용.
주문 넣기 & 취소 (인증)
한 번의 호출로 주문을 구성하고 (V2 주문 구조체에) 서명한 뒤 게시합니다. 주문 유형을 선택합니다:
| 유형 | 동작 |
|---|---|
GTC | Good-Till-Cancelled - 체결되거나 취소될 때까지 호가창에 대기. |
GTD | Good-Till-Date - 만료 타임스탬프까지 대기. |
FOK | Fill-Or-Kill - 주문 전체를 즉시 체결하거나 취소. |
FAK | Fill-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 지분이며, 가격은 이미
틱 단위로 반올림되어 있어야 합니다. 그렇지 않으면 주문이 거부됩니다.nonce,
feeRateBps, taker, expiration이 제거되고 timestamp,
metadata, builder가 추가되었습니다. Exchange EIP-712 도메인 버전은 "2"입니다.
수수료는 체결 시점에 온체인으로 징수되며, 메이커는 0을 내고 테이커만 냅니다.
거래하기 전에 세 개의 V2 컨트랙트에 pUSD와 조건부 토큰을 승인해야 합니다
(승인 문제 해결 방법 보기).수수료: 테이커만 내며, 요율은 곡선을 그립니다
메이커는 절대 수수료를 내지 않습니다. 테이커는 정액이 아닌 수수료를 냅니다. 수수료는 시장의 불확실성에 따라 커지고 카테고리별로 다릅니다. 공식은 다음과 같습니다:
fee = shares × feeRate × p × (1 - p) # p = share price, 0..1
p·(1-p) 항 때문에 수수료는 50/50에서 최대가 되고 1센트와 99센트
가장자리로 갈수록 줄어듭니다. 따라서 거의 확실한 아웃컴은 테이크 비용이 저렴하고, 동전 던지기 같은
시장은 비쌉니다. 카테고리별 테이커 feeRate:
| 카테고리 | 테이커 feeRate |
|---|---|
| Crypto | 0.07 (7 bps) - 가장 높음 |
| Economics / Culture / Weather | 0.05 |
| Finance / Politics / Tech / Mentions | 0.04 |
| Sports | 0.03 |
| Geopolitics & world events | 0 - 수수료 없음 |
요율을 하드코딩하지 말고 GET /fee-rate-bps?token_id=로 토큰별 실시간 요율을 읽으세요.
수수료는 소수점 5자리로 반올림됩니다(최소 0.00001 pUSD). 메이커가 0을 내기 때문에 대부분의
수익 우위가 없는 봇은 테이크하지 않고 호가를 냅니다.
네거티브 리스크 (다중 아웃컴) 시장
여러 후보가 있는 이벤트("누가 선거에서 이길까?")는 네거티브 리스크 시장입니다.
아웃컴들이 연결되어 있어, Neg Risk Adapter를 통해 한 아웃컴의 No 지분이 다른 모든 아웃컴의
Yes 지분으로 전환됩니다. 자본 효율적이지만 작동 방식이 다릅니다. 이 시장은 바이너리 시장과
다른 컨트랙트에서 돌아가므로, 주문 옵션에 반드시 neg_risk=True를
전달해야 합니다(Gamma에서 시장의 negRisk 플래그를 읽으세요). 생략하면 주문이 잘못된
거래소에 서명되어 거부됩니다.
조건부 토큰: split, merge, redeem (호가창 너머)
모든 시장의 기반에는 조건부 토큰 프레임워크(CTF)가 있습니다. 아웃컴 토큰은 ERC-1155 토큰이며, 모든 Yes/No 쌍은 정확히 $1.00의 pUSD가 CTF 컨트랙트에 잠긴 것으로 뒷받침됩니다. 이로부터 호가창만으로는 얻을 수 없는 세 가지 기본 동작을 얻습니다:
| 동작 | 기능 | 봇이 쓰는 이유 |
|---|---|---|
| Split | $1 pUSD 잠금 → 1 Yes + 1 No 발행 | 스프레드를 넘지 않고 재고 생성; 양쪽에 호가. |
| Merge | 1 Yes + 1 No 소각 → $1 pUSD 회수 | 헤지된 쌍을 즉시 청산 - 정산 대기 없음, 테이커 수수료 없음. |
| Redeem | 정산 후, 승리 토큰 → $1.00 pUSD | 정산된 포지션 현금화(redeemPositions). |
Split과 merge는 CTF 차익거래의 기반입니다. 호가창에서 Yes + No가 $1.00
미만으로 거래되면 둘 다 매수해 merge로 $1.00을 되찾고, $1.00
초과로 거래되면 split으로 $1을 새 쌍으로 만들어 둘 다 매도합니다.
오라클이 온체인으로 아웃컴을 게시하면 상환은 ConditionalTokens 컨트랙트를 통해
정산됩니다. 청구 가능해지면 포지션은 Data API에서
redeemable: true로 표시됩니다. 포지션 ID는 getConditionId →
getCollectionId → getPositionId 순으로 파생됩니다.
고급: RFQ & 콤보 시장 (진지한 메이커용)
호가창 외에도 폴리마켓은 Request-for-Quote(RFQ) 시스템을 운영하며, 특히 콤보 시장(기존 시장을 묶은 다중 레그 복합 포지션)에 사용됩니다. 흐름은 세 단계입니다: 테이커가 견적을 요청하고, 메이커들이 견적으로 경쟁하며, 선택된 메이커는 실행 전에 확인하거나 거절할 라스트 룩을 얻습니다.
- 콤보 탐색:
GET /v1/rfq/combo-markets(공개;limit1-100,cursor,exclude). 각 콤보는 두 개의 포지션 ID를 노출합니다(Yes = 인덱스 0, No = 인덱스 1). - 메이커로 견적:
POST combos-rfq-api.polymarket.com/v1/maker/quotes(L2 인증).quote_id는 직접 생성하며,rfq_id,maker_address,signature_type, 서명된 Exchange 주문, 그리고price_e6/size_e6를 소수점 6자리 고정소수점 문자열로 보냅니다(*_e6규약은 부동소수점 정밀도 손실을 피합니다). - 라스트 룩: RFQ가
AWAITING_MAKER_CONFIRMATION상태인 동안CONFIRM,DECLINE로 응답하거나TIMED_OUT이 되도록 둡니다.
RFQ 상태 기계: CREATED → COLLECTING_QUOTES → AWAITING_REQUESTER_ACCEPTANCE →
AWAITING_MAKER_CONFIRMATION → EXECUTING → FILLED (그 외 FAILED / EXPIRED / CANCELED / REJECTED).
실시간 상태를 위해 RFQ WebSocket 게이트웨이를 구독하세요. 이는 틈새 기능으로 - 대부분의 봇은 위의
CLOB 호가창만 있으면 됩니다 - 다중 레그와 콤보 유동성의 가격이 책정되는 방식입니다.
잔액 & 승인 확인
client.get_balance_allowance(...) # collateral (pUSD) and conditional-token allowances
승인이 0으로 표시되면, 주문 전에 V2 거래소 컨트랙트에 pUSD/CTF를 승인하세요.
outcomes 배열을 읽어(Gamma는 이 배열과
clobTokenIds를 디코딩해야 하는 JSON 인코딩 문자열로 반환합니다) 이름으로 매핑하세요.다음: 인증 & 지갑 · WebSocket: 호가창 스트리밍 · CLOB 오류 해결.



