Polymarket API 요청 한도: 완벽 레퍼런스
Polymarket은 요청 한도를 여러 페이지에 걸쳐, 완전히 다른 두 시스템으로, 거의 아무도 예상하지 못하는 10초 구간 기준으로 공개합니다. 그 전부를 표 하나로 모았습니다. 한도를 넘으면 실제로 무슨 일이 일어나는지도 함께 다룹니다.
Polymarket에 초당 몇 개의 요청을 보낼 수 있을까?라는 간단한 질문에 답하려 해 본 적이 있다면, 간단한 답이 없다는 것을 알게 되었을 겁니다. 한도는 서로 다른 두 시스템에 나뉘어 있고, 각기 다른 페이지에 공개되어 있으며, 대부분의 API가 쓰는 초당 또는 분당 수치가 아니라 10초 구간으로 표현됩니다.
특정 경로의 한도는 Polymarket API 레퍼런스의 엔드포인트별 페이지에서도 확인할 수 있습니다.
이 페이지는 문서화된 모든 한도를 한곳에 모으고, 두 시스템을 설명하고, 한도를 넘었을 때 실제로 무슨 일이 일어나는지 보여줍니다. 모든 수치는 Polymarket 공식 문서에서 가져왔으며 2026년 9월 기준입니다.
짧은 답
10으로 나누세요. 1,500 req / 10s라는 한도는 초당 150회 요청입니다. Polymarket의 전역 상한은 15,000 req / 10s(1,500 rps)이지만, 모든 엔드포인트 계열에는 그보다 훨씬 낮은 한도가 있으며, 여러분을 멈춰 세우는 것은 엔드포인트 한도입니다.
서로 다른 두 가지 요청 한도 시스템
대부분의 개발자가 여기서 걸립니다. Polymarket은 서로 독립적인 두 개의 제한 장치를 운영하며, 하나의 한도 아래에 있다고 해서 다른 하나로부터 보호받지 못합니다.
| Cloudflare IP 한도 | 서명자별 토큰 버킷 | |
|---|---|---|
| 적용 범위 | IP 주소 | 서명자 주소 |
| 적용 대상 | 모든 API와 엔드포인트 | CLOB 주문 + 취소 요청만 |
| 방식 | 슬라이딩 윈도우 | 토큰 버킷 (충전 속도 + 버스트) |
| 한도 초과 시 | 요청이 지연되어 대기열에 들어감 (속도 제한) | 429로 요청 거부 |
| 달라지는 기준 | 엔드포인트 | 30일 거래량 등급 |
거부가 아니라 속도 제한
Cloudflare 계층에 대해 이해해야 할 가장 유용한 사실입니다. IP 기반 한도를 넘으면 Polymarket은 요청을 바로 거부하지 않고 지연시켜 대기열에 넣습니다. 429가 쏟아지는 것이 아니라 지연 시간이 조용히 올라가는 것을 보게 됩니다. 멀쩡해 보이지만 응답 시간이 40ms에서 3s로 늘어난 봇은 대개 요청 한도를 넘은 봇입니다.
Gamma API 요청 한도
Base URL https://gamma-api.polymarket.com. Gamma는 마켓과 이벤트 메타데이터를 제공합니다. 플랫폼을 처음 살펴볼 때 대부분 가장 먼저 호출하는 엔드포인트들입니다.
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
| 일반 | 4,000 req / 10s | 400 rps |
/events | 500 req / 10s | 50 rps |
/markets | 300 req / 10s | 30 rps |
/markets + /events 목록 | 900 req / 10s | 90 rps |
/comments | 200 req / 10s | 20 rps |
/tags | 200 req / 10s | 20 rps |
/public-search | 350 req / 10s | 35 rps |
/markets가 가장 먼저 부딪히는 엄격한 한도입니다
10초에 300회인 /markets는 플랫폼 전체에서 흔히 쓰이는 엔드포인트 중 가장 제한이 엄격하며, 그 위의 Gamma 일반 한도보다 13배 엄격합니다. 루프로 전체 마켓 목록을 페이지네이션한다면 가장 먼저 여기서 문제가 생깁니다.
Data API 요청 한도
Base URL https://data-api.polymarket.com. 포지션, 거래 내역, 포트폴리오 데이터를 다룹니다. 이 API가 Gamma나 CLOB보다 얼마나 엄격한지 주목하세요. 일반 한도는 10초에 1,000회로 Gamma의 4분의 1입니다.
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
| 일반 | 1,000 req / 10s | 100 rps |
/trades | 200 req / 10s | 20 rps |
/positions | 150 req / 10s | 15 rps |
/closed-positions | 150 req / 10s | 15 rps |
상태 확인 (/ok) | 100 req / 10s | 10 rps |
Data API v2
Data API v2는 2026년 9월 4일 https://data-api.polymarket.com/v2에 출시되었으며 자체 한도를 가집니다. v1도 여전히 동작하지만 동결되었습니다. 새 엔드포인트와 필드는 v2에만 추가됩니다.
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
일반 (모든 /v2 엔드포인트) | 800 req / 10s | 80 rps |
/v2/trades | 300 req / 10s | 30 rps |
/v2/positions, /v2/positions/combos | 200 req / 10s | 20 rps |
/v2/activity, /v2/activity/combos | 200 req / 10s | 20 rps |
/v2/prices-history | 200 req / 10s | 20 rps |
/v2/status | 100 req / 10s | 10 rps |
가격 기록은 호스트가 바뀌고 5배 엄격해졌습니다
data 호스트의 GET /v2/prices-history가 CLOB 호스트의 경로를 대체합니다. CLOB 버전은 10초에 1,000회를 허용했지만 v2 경로는 200회만 허용합니다. 호출만 옮기고 속도 조절을 옮기지 않으면 다섯 배 빨리 상한에 도달합니다. v2는 또한 429와 Retry-After로 부하를 알리며, 불투명한 커서로 페이지네이션합니다. offset은 없습니다.
CLOB API 요청 한도
Base URL https://clob.polymarket.com. 오더북 그 자체입니다. CLOB은 Polymarket API 중 일반 허용량이 가장 높지만(10초에 9,000회), 한도가 크게 다른 네 그룹으로 나뉩니다.
일반
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
| 일반 | 9,000 req / 10s | 900 rps |
잔액 허용량 GET | 200 req / 10s | 20 rps |
잔액 허용량 UPDATE | 50 req / 10s | 5 rps |
마켓 데이터
여기서 주목할 패턴은 단수형 엔드포인트는 10초에 1,500회, 복수형 배치 엔드포인트는 10초에 500회라는 점입니다. 배치 호출 한 번이 여러 토큰을 처리한다는 것을 기억하기 전까지는 하향 조정처럼 보입니다. 배치는 요청당 3배 비싸지만 호출마다 훨씬 많은 일을 합니다. 항상 /book 루프보다 /books를 선택하세요.
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
/book | 1,500 req / 10s | 150 rps |
/books | 500 req / 10s | 50 rps |
/price | 1,500 req / 10s | 150 rps |
/prices | 500 req / 10s | 50 rps |
/midpoint | 1,500 req / 10s | 150 rps |
/midpoints | 500 req / 10s | 50 rps |
/prices-history | 1,000 req / 10s | 100 rps |
| 마켓 틱 크기 | 200 req / 10s | 20 rps |
원장
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
/trades, /orders, /notifications, /order | 900 req / 10s | 90 rps |
/data/orders | 500 req / 10s | 50 rps |
/data/trades | 500 req / 10s | 50 rps |
/notifications | 125 req / 10s | 12.5 rps |
인증
| 엔드포인트 | 한도 | 초당 |
|---|---|---|
| API 키 엔드포인트 | 100 req / 10s | 10 rps |
거래: 버스트와 지속
거래 엔드포인트만 Cloudflare 한도가 두 개입니다. 짧은 급증을 위한 버스트 한도와 10분 단위로 측정하는 지속 한도입니다. 두 한도 모두 지켜야 합니다.
| 엔드포인트 | 버스트 | 지속 |
|---|---|---|
POST /order | 5,000 req / 10s | 120,000 req / 10 min |
DELETE /order | 5,000 req / 10s | 120,000 req / 10 min |
POST /orders | 2,000 req / 10s | 21,000 req / 10 min |
DELETE /orders | 2,000 req / 10s | 15,000 req / 10 min |
DELETE /cancel-all | 250 req / 10s | 6,000 req / 10 min |
DELETE /cancel-market-orders | 1,500 req / 10s | 21,000 req / 10 min |
10초에 250회인 DELETE /cancel-all은 짚고 넘어갈 가치가 있습니다. 재호가 주기마다 cancel-all을 호출하는 마켓 메이커는 이 한도를 빠르게 소진하며, 10분에 6,000회라는 지속 한도는 평균 초당 cancel-all 호출 10회에 불과합니다.
Bridge, Relayer, 그 밖의 모든 것
| 엔드포인트 | 한도 |
|---|---|
| 일반 요청 제한 (전역 상한) | 15,000 req / 10s |
상태 확인 (/ok) | 100 req / 10s |
Bridge API (https://bridge.polymarket.com) | 50 req / 10s |
Relayer /submit | 25 req / 1 min |
| User PNL API | 200 req / 10s |
Relayer 한도는 예외적입니다
Relayer /submit은 10초가 아니라 분 단위로 측정되는 유일한 문서화된 한도이며, 분당 25회로 플랫폼에서 단연 가장 엄격한 수치입니다. relayer를 통해 트랜잭션을 제출한다면 약 2.4초에 한 번 제출하는 셈입니다.
서명자별 토큰 버킷 (CLOB 거래)
Cloudflare와 별도로, Polymarket은 CLOB 주문 및 취소 요청을 서명자별 토큰 버킷으로 평가합니다. 각 서명자 주소는 주문 버킷과 취소 버킷을 하나씩 가지며, 한쪽을 소비해도 다른 쪽에는 영향이 없습니다. Cloudflare 계층과 달리 이 한도를 넘으면 실제 429가 반환됩니다.
요청은 각각 1단위로 세어지는 것이 아니라 토큰을 소비합니다:
| 버킷 | 요청 | 토큰 비용 |
|---|---|---|
| 주문 | POST /order | 1 |
| 주문 | POST /orders | 배치 내 주문 수 |
| 취소 | DELETE /order | 1 |
| 취소 | DELETE /orders | 제출한 주문 ID 수 |
| 취소 | DELETE /cancel-all | 1 + 실제로 취소된 주문 수 |
| 취소 | DELETE /cancel-market-orders | 1 + 취소된 일치 주문 수 |
배치는 전부 아니면 전무입니다
배치는 버킷에 모든 항목을 처리할 만큼 토큰이 있을 때만 받아들여집니다. 그렇지 않으면 요청 전체가 거부되고 아무것도 처리되지 않습니다. 토큰 비용이 등급의 버스트 용량을 넘는 배치는 아무리 기다려도 받아들여지지 않으므로 나누어야 합니다.
거래량 등급
버킷 크기는 최근 30일 동안의 메이커 지갑 누적 거래량에 따라 정해집니다. 등급 배정은 3시간마다 갱신됩니다.
| 등급 | 30일 거래량 | 주문 속도/초 | 주문 버스트 | 취소 속도/초 | 취소 버스트 |
|---|---|---|---|---|---|
| Standard | — | 40 | 60 | 80 | 120 |
| Copper | $30,000+ | 60 | 90 | 120 | 180 |
| Bronze | $50,000+ | 80 | 120 | 160 | 240 |
| Silver | $100,000+ | 200 | 300 | 400 | 600 |
| Gold | $500,000+ | 400 | 600 | 800 | 1,200 |
| Platinum | $2.5M+ | 450 | 675 | 900 | 1,350 |
| Diamond | $5M+ | 525 | 787 | 1,050 | 1,575 |
| Elite | $10M+ | 600 | 900 | 1,200 | 1,800 |
전체 버스트가 얼마나 지속되는지는 burst_seconds = burst / rate_per_sec로 계산하세요. Standard 서명자라면 60 / 40, 즉 최고 속도로 1.5초 동안 주문을 제출한 뒤 초당 40회의 충전 속도로 제한됩니다.
요청 한도 헤더 읽기
서명자별 제한 장치는 평가한 모든 요청에 헤더를 반환합니다. 추가 API 호출 없이 예산을 모니터링하는 가장 저렴한 방법입니다.
| 헤더 | 의미 |
|---|---|
Poly-RateLimit-Remaining | 이 요청 후 해당 버킷의 토큰 잔액 |
Poly-RateLimit-Reset | 현재 대기 기간이 끝나는 Unix 타임스탬프 |
Poly-RateLimit-Tier | 적용된 등급 |
Retry-After | 초 단위 재시도 지연. 429 응답에만 포함 |
Poly-RateLimit-Warning | 실제 적용 시 요청이 거부되었을 경우 true |
Poly-RateLimit-Reset은 충전 완료 시각이 아닙니다
429에서 이 값은 버킷이 가득 차는 시각이 아니라 방금 시도한 요청에 충분한 토큰이 생기는 시각을 알려줍니다. 보통 생각보다 오래 기다릴 필요가 없습니다. 또한 음수 취소 잔액을 허용하는 등급에서는 cancel-all 후 Poly-RateLimit-Remaining이 음수가 될 수 있습니다.
429를 제대로 처리하기
올바른 재시도 전략은 어떤 제한 장치에 걸렸는지에 따라 다르며, 잘못하면 상황이 더 나빠집니다. Retry-After가 있으면 따르고, 없으면 지터를 포함한 지수 백오프로 대체하세요. 지터는 중요합니다. 지터가 없으면 모든 워커가 같은 순간에 재시도해 곧바로 다시 한도에 걸립니다.
const MAX_RETRIES = 5;
async function polyFetch(url: string, init?: RequestInit): Promise<Response> {
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
const res = await fetch(url, init);
// Watch the budget even on success — this is your early warning.
const remaining = res.headers.get("Poly-RateLimit-Remaining");
if (remaining !== null && Number(remaining) < 10) {
console.warn(`Low token budget: ${remaining} (tier ${res.headers.get("Poly-RateLimit-Tier")})`);
}
// Warning mode: not rejected yet, but it would have been.
if (res.headers.get("Poly-RateLimit-Warning") === "true") {
console.warn("Request would be rejected under live enforcement — slow down.");
}
if (res.status !== 429) return res;
if (attempt === MAX_RETRIES) return res;
// Prefer the server's own answer, else exponential backoff.
const retryAfter = res.headers.get("Retry-After");
const baseMs = retryAfter
? Number(retryAfter) * 1000
: Math.min(2 ** attempt * 250, 8000);
// Full jitter — spreads a fleet of workers out instead of resynchronising them.
await new Promise((r) => setTimeout(r, Math.random() * baseMs));
}
throw new Error("unreachable");
}너무 큰 배치를 그대로 재시도하지 마세요
배치의 토큰 비용이 등급의 버스트 용량보다 크다면 재시도는 소용없습니다. 단일 요청으로는 절대 받아들여지지 않습니다. 나누세요. 백오프가 영원히 반복되는 유일한 경우입니다.
설계 단계에서 한도 아래에 머물기
- 루프 대신 배치를 사용하세요.
/book호출 50번 대신/books호출 한 번이면, 10초에 1,500회 예산에서 50회를 쓰는 대신 10초에 500회 예산에서 1회만 씁니다. 여유가 17배 늘어납니다. - 메타데이터를 캐시하세요.
/markets의 마켓 메타데이터는 마켓 수명 동안 거의 바뀌지 않지만,/markets는 10초에 300회로 Gamma에서 가장 엄격한 한도를 가집니다. 한 번 가져와 캐시하고 반복 루프에서 다시 요청하지 마세요. - 실시간 상태에는 WebSocket을 사용하세요. 타이머로
/book을 폴링하는 것이 요청 예산을 소모하는 가장 흔한 방법입니다. 대신 스트림을 구독하고 서버가 변경 사항을 푸시하게 하세요. - 예약 작업에 지터를 추가하세요. 모든 워커가 정확히 정각에 깨어나면 평균 요청률을 훨씬 넘는 동시 급증이 생깁니다. 시작 오프셋을 무작위로 정하세요.
- 오류율만이 아니라 지연 시간을 지켜보세요. Cloudflare는 거부하지 않고 속도를 늦추므로, p99 지연 시간 상승이 IP 한도를 넘었다는 첫 신호입니다. 오류로 나타나기 훨씬 전입니다.
- 헤더를 추적하세요.
Poly-RateLimit-Remaining은 읽는 데 비용이 들지 않으며 남은 예산을 정확히 알려줍니다.
요청 한도는 데이터 접근과 같지 않습니다
마지막으로 분명히 해 둘 것이 있습니다. 저희가 가장 자주 보는 오해이기 때문입니다. 어떤 요청 한도 등급도 과거 오더북 깊이를 제공하지 않습니다. Polymarket API는 오더북의 현재 상태를 제공합니다. 지난 화요일 14:03:17에 오더북이 어땠는지에 대한 과거 아카이브는 노출하지 않으며, 마켓 결과가 확정되면 오더북은 404를 반환합니다.
이는 속도 제한 문제가 아니라 구조적 공백이며, 어떤 백오프 로직으로도 해결되지 않습니다. 전략을 백테스트하려면 누군가 당시에 기록해 둔 특정 시점 스냅샷이 필요합니다. 바로 그것을 제공하기 위해 PolyTest가 존재합니다. 전체 오더북 깊이, 1초 미만 해상도, 누락 없는 Polymarket 암호화폐 Up/Down 마켓의 과거 스냅샷 240M+개.
자주 묻는 질문
- Polymarket API의 초당 요청 한도는 얼마인가요?
- Polymarket은 10초 구간 기준으로 한도를 공개하므로 10으로 나누세요. 전역 상한은 10초에 15,000회(1,500 rps)이지만, 엔드포인트별 한도가 훨씬 낮고 그것이 실제 제약입니다. CLOB /book과 /price는 10초에 1,500회(150 rps), Gamma /markets 엔드포인트는 10초에 300회(30 rps), Data API /positions 엔드포인트는 10초에 150회(15 rps)를 허용합니다.
- 요청 한도를 넘으면 Polymarket이 429를 반환하나요?
- 어떤 제한 장치에 걸렸는지에 따라 다릅니다. Cloudflare IP 기반 한도는 요청을 거부하지 않고 지연시켜 대기열에 넣으므로, 오류 대신 지연 시간 상승을 보게 됩니다. CLOB 주문 및 취소 엔드포인트의 별도 서명자별 토큰 버킷은 429 Too Many Requests를 반환하며, 재시도 전 최소 지연 시간을 알려주는 Retry-After 헤더를 함께 보냅니다.
- Polymarket CLOB API의 요청 한도는 어떻게 되나요?
- CLOB 일반 한도는 10초에 9,000회입니다. 마켓 데이터 엔드포인트 /book, /price, /midpoint는 각각 10초에 1,500회, 배치 버전인 /books, /prices, /midpoints는 10초에 500회를 허용합니다. 원장 엔드포인트는 10초에 900회입니다. 거래 엔드포인트에는 버스트와 지속 한도가 모두 있습니다. POST /order는 버스트 10초에 5,000회, 지속 10분에 120,000회를 허용합니다.
- Polymarket Gamma API의 요청 한도는 어떻게 되나요?
- Gamma API 일반 한도는 10초에 4,000회입니다. 개별 엔드포인트는 더 엄격합니다. /events는 10초에 500회, /markets는 10초에 300회, /markets + /events 목록 합산은 10초에 900회, /public-search는 10초에 350회, /comments와 /tags는 각각 10초에 200회입니다. /markets 한도는 플랫폼에서 흔히 쓰이는 한도 중 가장 엄격합니다.
- Polymarket 요청 한도는 IP 주소 기준인가요, API 키 기준인가요?
- 주요 Cloudflare 한도는 API 키가 아니라 IP 주소 기준이므로, 하나의 IP 뒤에 있는 여러 키는 하나의 예산을 공유합니다. CLOB 주문 및 취소 엔드포인트의 별도 토큰 버킷 한도는 서명자 주소 기준이며, 메이커 지갑의 30일 거래량 등급에 따라 크기가 정해집니다.
- API로 Polymarket 과거 오더북 데이터를 받을 수 있나요?
- 아니요. Polymarket API는 현재 마켓 상태만 제공합니다. 과거 오더북 깊이 아카이브가 없으며, 결과가 확정된 마켓의 오더북은 404를 반환합니다. 백테스팅에는 마켓이 진행되는 동안 기록된 특정 시점 스냅샷이 필요합니다. PolyTest는 Polymarket 암호화폐 Up/Down 마켓에 대해 그런 스냅샷 240M+개를 전체 8단계 오더북 깊이와 1초 미만 해상도로 제공합니다.
Polymarket이 보관하지 않는 과거 데이터를 확보하세요
PolyTest는 Polymarket 암호화폐 Up/Down 마켓을 실시간으로 기록합니다. 8단계 오더북 깊이와 1초 미만 단위 타임스탬프를 갖춘 240M+개의 스냅샷을 제공하며, 결과가 확정된 마켓도 보존합니다. 3일 무료 체험으로 시작하세요.
더 읽어보기
Polymarket WebSocket: 끊기지 않는 실시간 데이터
오더북을 폴링하는 것은 아무 이득 없이 요청 한도를 소모하는 가장 흔한 방법입니다. 네 가지 스트림, 아무도 문서화하지 않은 구독 옵션, 그리고 봇이 무응답을 받고도 평온하다고 여기는 실패 유형을 설명합니다.
Polymarket API 오류: 모든 코드 해설
Polymarket의 오류 메시지는 간결하며, 새벽 3시에 봇을 멈추게 하는 오류는 대개 문서에 아예 없는 것들입니다. 문서화된 오류, 문서화되지 않은 오류, 그리고 각각에 대해 실제로 무엇을 해야 하는지를 담은 전체 레퍼런스입니다.
Polymarket 트레이딩 봇 만드는 방법
대부분의 Polymarket 봇 튜토리얼은 더 이상 존재하지 않는 SDK를 기반으로 합니다. 이 글은 처음부터 끝까지 현재 기준의 방법을 다룹니다. 2026년에 무엇을 설치해야 하는지, 인증이 실제로 어떻게 동작하는지, 데이터 공백이 어디에 있는지, 그리고 첫 주에 봇을 죽이는 실패 유형까지.