Polymarket API Rate Limits: The Complete Reference
Polymarket publishes its rate limits across several pages, in two completely different systems, using a 10-second window almost nobody expects. This is all of it in one table set — plus what actually happens when you cross a limit.
If you have ever tried to answer a simple question — how many requests per second can I send to Polymarket? — you will have discovered that there is no simple answer. The limits are spread across two separate systems, published on different pages, and expressed in a 10-second window rather than the per-second or per-minute figures most APIs use.
This page collects every documented limit in one place, explains the two systems, and shows what actually happens when you cross a line. All figures come from Polymarket's official documentation and are current as of September 2026.
Two different rate limit systems
This is the part that catches most developers out. Polymarket runs two independent limiters, and being under one does not protect you from the other.
| Cloudflare IP limits | Per-signer token buckets | |
|---|---|---|
| Scoped to | Your IP address | Your signer address |
| Applies to | Every API and endpoint | CLOB order + cancel requests only |
| Mechanism | Sliding window | Token bucket (refill rate + burst) |
| Over the limit | Requests are throttled — delayed and queued | Request is rejected with 429 |
| Varies by | Endpoint | Your 30-day trading volume tier |
Gamma API rate limits
Base URL https://gamma-api.polymarket.com. Gamma serves market and event metadata — the endpoints most people hit first when they are exploring the platform.
| Endpoint | Limit | Per second |
|---|---|---|
| General | 4,000 req / 10s | 400 rps |
/events | 500 req / 10s | 50 rps |
/markets | 300 req / 10s | 30 rps |
/markets + /events listing | 900 req / 10s | 90 rps |
/comments | 200 req / 10s | 20 rps |
/tags | 200 req / 10s | 20 rps |
/public-search | 350 req / 10s | 35 rps |
Data API rate limits
Base URL https://data-api.polymarket.com. Positions, trade history and portfolio data. Note how much tighter this API is than Gamma or CLOB — the general limit is 1,000 req / 10s, a quarter of Gamma's.
| Endpoint | Limit | Per second |
|---|---|---|
| General | 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 |
Health check (/ok) | 100 req / 10s | 10 rps |
CLOB API rate limits
Base URL https://clob.polymarket.com. The order book itself. CLOB has the highest general allowance of any Polymarket API (9,000 req / 10s) but splits into four distinct groups with very different limits.
General
| Endpoint | Limit | Per second |
|---|---|---|
| General | 9,000 req / 10s | 900 rps |
GET balance allowance | 200 req / 10s | 20 rps |
UPDATE balance allowance | 50 req / 10s | 5 rps |
Market data
The pattern to notice here: singular endpoints get 1,500 req / 10s, plural batch endpoints get 500 req / 10s. That looks like a downgrade until you remember one batch call covers many tokens. Batching is 3× cheaper per request but each call does far more work — always prefer /books over a loop of /book.
| Endpoint | Limit | Per second |
|---|---|---|
/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 |
| Market tick size | 200 req / 10s | 20 rps |
Ledger
| Endpoint | Limit | Per second |
|---|---|---|
/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 |
Authentication
| Endpoint | Limit | Per second |
|---|---|---|
| API key endpoints | 100 req / 10s | 10 rps |
Trading — burst and sustained
Trading endpoints are the only ones with two Cloudflare limits: a burst limit for short spikes and a sustained limit measured over 10 minutes. You must stay under both.
| Endpoint | Burst | Sustained |
|---|---|---|
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 |
DELETE /cancel-all at 250 req / 10s is worth flagging. Market makers who cancel-all on every re-quote cycle burn through this quickly, and the sustained limit of 6,000 per 10 minutes works out to just 10 cancel-all calls per second on average.
Bridge, Relayer and everything else
| Endpoint | Limit |
|---|---|
| General rate limiting (global ceiling) | 15,000 req / 10s |
Health check (/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 |
Per-signer token buckets (CLOB trading)
Separately from Cloudflare, Polymarket evaluates CLOB order and cancel requests against per-signer token buckets. Each signer address gets an order bucket and a cancel bucket; spending from one does not affect the other. Unlike the Cloudflare layer, exceeding these returns a real 429.
Requests cost tokens rather than counting as one unit each:
| Bucket | Request | Token cost |
|---|---|---|
| Order | POST /order | 1 |
| Order | POST /orders | Number of orders in the batch |
| Cancel | DELETE /order | 1 |
| Cancel | DELETE /orders | Number of submitted order IDs |
| Cancel | DELETE /cancel-all | 1 + number of orders actually canceled |
| Cancel | DELETE /cancel-market-orders | 1 + number of matching orders canceled |
Volume tiers
Your bucket size depends on the maker wallet's cumulative volume over a rolling 30-day window. Tier assignments refresh every three hours.
| Tier | 30-day volume | Order rate/s | Order burst | Cancel rate/s | Cancel burst |
|---|---|---|---|---|---|
| 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 |
Work out how long a full burst lasts with burst_seconds = burst / rate_per_sec. For a Standard signer that is 60 / 40 — 1.5 seconds of full-speed order submission before you are limited to the 40/s refill rate.
Reading the rate limit headers
The per-signer limiter returns headers on every evaluated request. These are the cheapest possible way to monitor your budget — no extra API calls needed.
| Header | Meaning |
|---|---|
Poly-RateLimit-Remaining | Token balance in the applicable bucket after this request |
Poly-RateLimit-Reset | Unix timestamp when the current wait period ends |
Poly-RateLimit-Tier | Which tier was applied |
Retry-After | Retry delay in seconds — only on 429 responses |
Poly-RateLimit-Warning | true when live enforcement would have rejected the request |
Handling 429s properly
The correct retry strategy differs depending on which limiter you hit, and getting it wrong makes things worse. Respect Retry-After when it is present; fall back to exponential backoff with jitter when it is not. Jitter matters: without it, every one of your workers retries at the same instant and you re-trigger the limit immediately.
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");
}Staying under the limits by design
- Batch instead of looping. One
/bookscall instead of fifty/bookcalls costs you one request against a 500 req/10s budget rather than fifty against a 1,500 req/10s budget — a 17× improvement in headroom. - Cache metadata. Market metadata from
/marketsbarely changes within a market's life, but/marketshas the tightest Gamma limit at 300 req/10s. Fetch once, cache, and stop re-requesting it in your hot loop. - Use WebSockets for live state. Polling
/bookon a timer is the most common way to burn a request budget. Subscribe to the stream instead and let the server push changes. - Add jitter to scheduled jobs. If every worker wakes on the exact minute, you create a synchronised spike well above your average rate. Randomise start offsets.
- Watch latency, not just error rates. Because Cloudflare throttles rather than rejects, rising p99 latency is your first signal that you are over an IP limit — long before anything shows up as an error.
- Track the headers.
Poly-RateLimit-Remainingcosts nothing to read and tells you exactly how much budget is left.
Rate limits are not the same as data access
One last thing worth being explicit about, because it is the most common misconception we see: no rate limit tier gives you historical order book depth. Polymarket's API serves the current state of the book. It does not expose a historical archive of what the book looked like at 14:03:17 last Tuesday, and once a market resolves it disappears from the public feeds entirely.
That is a structural gap rather than a throttling problem, and no amount of backoff logic solves it. If you are trying to backtest a strategy, you need point-in-time snapshots that somebody recorded at the time — which is exactly what PolyTest exists to provide: 90M+ historical snapshots of Polymarket crypto Up/Down markets with full order book depth, sub-second resolution, and no gaps.
| Plan | Requests / min | Burst / sec | History |
|---|---|---|---|
| Free | 30 | 2 | Recent markets |
| Builder | 250 | 12 | 14 days |
| Pro | 750 | 40 | Full history |
| Enterprise | Custom | Custom | Full history + bulk export |
GET /api/v1/limits. See rate limits and pricing.Frequently asked questions
- What is the Polymarket API rate limit in requests per second?
- Polymarket publishes limits per 10-second window, so divide by 10. The global ceiling is 15,000 req / 10s (1,500 rps), but per-endpoint limits are much lower and they are the binding constraint: CLOB /book and /price allow 1,500 req / 10s (150 rps), the Gamma /markets endpoint allows just 300 req / 10s (30 rps), and the Data API /positions endpoint allows 150 req / 10s (15 rps).
- Does Polymarket return a 429 when you exceed the rate limit?
- It depends which limiter you hit. The Cloudflare IP-based limits throttle requests — they are delayed and queued rather than rejected — so you see rising latency instead of errors. The separate per-signer token buckets on CLOB order and cancel endpoints do return 429 Too Many Requests, along with a Retry-After header telling you the minimum delay before retrying.
- What are the Polymarket CLOB API rate limits?
- The CLOB general limit is 9,000 req / 10s. Market data endpoints /book, /price and /midpoint allow 1,500 req / 10s each, while their batch equivalents /books, /prices and /midpoints allow 500 req / 10s. Ledger endpoints allow 900 req / 10s. Trading endpoints have both burst and sustained limits: POST /order allows 5,000 req / 10s burst and 120,000 req / 10 min sustained.
- What are the Polymarket Gamma API rate limits?
- The Gamma API general limit is 4,000 req / 10s. Individual endpoints are tighter: /events is 500 req / 10s, /markets is 300 req / 10s, combined /markets + /events listing is 900 req / 10s, /public-search is 350 req / 10s, and /comments and /tags are 200 req / 10s each. The /markets limit is the tightest commonly-used limit on the platform.
- Are Polymarket rate limits per IP address or per API key?
- The main Cloudflare limits are per IP address, not per API key, so multiple keys behind one IP share a single budget. The separate token-bucket limits on CLOB order and cancel endpoints are scoped to your signer address and sized by your maker wallet's 30-day trading volume tier.
- Can I get historical Polymarket order book data through the API?
- No. Polymarket's API serves current market state only — there is no historical order book depth archive, and resolved markets disappear from the public feeds. Backtesting requires point-in-time snapshots recorded as markets ran. PolyTest provides 90M+ such snapshots for Polymarket crypto Up/Down markets with full 8-level order book depth and sub-second resolution.
Get the historical data Polymarket does not keep
PolyTest records Polymarket crypto Up/Down markets as they run — 90M+ snapshots with 8 levels of order book depth, sub-second timestamps, and resolved markets preserved. Free tier, no card.
Keep reading
Polymarket WebSockets: Real-Time Data That Does Not Drop
Polling the order book is the most common way to burn a rate limit budget for no benefit. Here are the four streams, the subscription options nobody documents, and the failure mode where your bot receives silence and calls it calm.
Polymarket API Errors: Every Code, Decoded
Polymarket's error messages are terse, and the ones that break your bot at 3am are usually the ones missing from the documentation entirely. Here is the full reference — documented errors, undocumented ones, and what to actually do about each.
How to Build a Polymarket Trading Bot
Most Polymarket bot tutorials are built on SDKs that no longer exist. This is the current path end to end — what to install in 2026, how auth actually works, where the data gaps are, and the failure modes that kill bots in week one.