On this page8 sections
The short answer
Polymarket's order book takes four order types: two that rest and two that don't. One flag, post-only, keeps a resting order from ever taking. We pulled the order settings of every open market on November 1, 2026 to see the rules a bot's orders run into. For the API around them, the CLOB, Gamma and the SDKs, start with the Polymarket API explained.
- Two types cover nearly every bot. A resting post-only GTC or GTD to make, a FOK or FAK with a worst price to take.
- Minimum size is 5 everywhere. All 217,635 open markets that report a minimum say 5.
- The tick follows the price. 93% of markets with a best bid under 4¢ trade in 0.001 steps, against 18% of those priced in between. A bot that caches the tick gets rejected when it changes.
- A quarter of busy markets make you wait. 4,242 sports markets hold every marketable order for 1 second before matching.
- In the busiest books the fee costs more than the spread. In the 200 busiest books priced 10–90¢, the spread is one cent and the taker fee is bigger than half of it 73% of the time. Taking or resting matters more there than how tight the book is.
The four types and the flag
| Type | Rests on the book? | What happens | Polymarket calls it |
|---|---|---|---|
| GTC, good till cancelled | Yes | Rests until it fills or you cancel it | Limit |
| GTD, good till date | Yes, until the expiry | Rests until it fills or expires | Limit |
| FOK, fill or kill | No | Fills the whole size now, or nothing | Market |
| FAK, fill and kill | No | Fills what it can now, cancels the rest | Market |
| Post-only (flag on GTC or GTD) | Only rests | Rejected if it would match on arrival | — |
The docs describe market orders as "simply limit orders with a price set to execute immediately". A FOK or FAK still carries a price. For a buy it is the most you will pay, and the order walks the book up to it and no further. That worst price is your slippage limit, so set it on purpose. The SDKs' market-order helpers take a dollar amount for buys and a number of shares for sells. Taker fees are added on top of a market buy, so a $100 buy costs more than $100. Use maxSpend if you need to cap the total.
If you leave the type out, the SDKs send FAK. Polymarket doesn't document any other type: no IOC by that name (FAK is the same thing), no stop orders and no trailing orders. A bot that wants a stop has to watch the price and send the order itself, which is one of the pieces our build guide walks through.
GTC
The default resting order. It stays on the book through anything short of a fill, a cancel, the market closing, or your heartbeat lapsing (more on that below). A partially filled GTC keeps its remainder on the book. When the market resolves, the remainder is cancelled.
GTD
A GTC with an expiry, and two rules that catch people:
- It expires one minute before the time you set. Polymarket calls this a "security threshold".
- The time you set must be at least 3 minutes out. So the shortest a GTD can actually live is about two minutes.
To make a GTD live N seconds, set the expiry to now + 60 + N, with N at least 120. GTD is the safe way to quote around a known event, such as a game start, a data release or a market's close. The quote removes itself even if your bot has died.
FOK
All or nothing, right now. If the book can't fill the whole size at your price or better, nothing fills. The order is rejected with "order couldn't be fully filled. FOK orders are fully filled or killed." Use it when a partial fill is worse than no fill. The classic case is one leg of an arbitrage, where half a position is unhedged risk.
FAK
Takes what is there at your price or better and cancels the rest. If nothing matches, it is rejected with "no orders found to match with FAK order". Use it when some fill beats none: following news, exiting a position, or copying a trade where 80% of the size is fine.
Post-only
Set postOnly: true on a GTC or GTD. If the order would match the moment it arrives, the exchange rejects it rather than letting it take: "invalid post-only order: order crosses book". On Polymarket that is the difference between earning and paying:
- Makers pay no fee. When a resting order fills, the maker also earns a maker rebate: a share of the taker's fee, 20% in crypto, 15% in sports and 25% in most other categories.
- Takers pay
shares × rate × p × (1 − p), where p is the price. The fee peaks at 50¢. 100 crypto shares at 50¢ pay $1.75 (rate 0.07), 100 sports shares $1.25 (rate 0.05).
Without post-only, a quote that lands while the price is moving can cross the book and turn your market maker into a taker. It then pays the fee instead of earning the rebate.
The rules that get orders rejected
We pulled every open market's settings to see what an order actually has to fit.
Tick size: it follows the price
A price must be a multiple of the market's current tick, or it is rejected with "Price (…) breaks minimum tick size rule". The docs list six possible ticks. In practice two do all the work:
| Tick | Open markets | Traded in 24h | Share of 24h volume |
|---|---|---|---|
| 0.01 | 178,230 (81.9%) | 9,509 (53.1%) | 44.0% |
| 0.001 | 39,404 (18.1%) | 8,396 (46.9%) | 56.0% |
The tick follows the price:
| Best bid | Traded markets | On 0.001 | On 0.01 |
|---|---|---|---|
| Under 4¢ | 5,020 | 92.5% | 7.5% |
| 4¢ to 96¢ | 10,628 | 17.7% | 82.3% |
| Over 96¢ | 418 | 100% | 0% |
This fits a market getting a finer tick as its price nears 0 or 1, though Polymarket doesn't document the threshold. For a bot, the point is that the tick can change while a market is open. A bot that reads the tick once at startup works until a price drifts to the edge. After that, every order it sends is rejected. Subscribe to the tick_size_change event on the market WebSocket and re-round. The SDKs' order methods look the tick up for you (our Python walkthrough shows where); raw requests and hand-rounded prices are where this bites.
Minimum size: 5, with an unclear unit
Every one of the 217,635 open markets that reports a minimum reports 5 (31 report none). The error is "Size (…) lower than the minimum: 5". The docs disagree about what the 5 counts. The market-data page calls it "minimum USDC notional", while the order page says the minimum "number of shares". Read it from the market, and if your bot trades cheap outcomes, test a small order before you rely on either reading. At 2¢, 5 shares is 10 cents and $5 is 250 shares.
The minimum matters most to copy-trading bots, which scale down other people's trades. Whalidate, for example, skips any copy under $5 so that every position stays large enough to sell.
Matching delays: one second on a quarter of busy markets
When you place an order, the response has a status:
| Status | Meaning |
|---|---|
live | Resting on the book |
matched | Matched immediately |
delayed | Marketable, but the market holds it before matching |
unmatched | Was delayed, found nothing to match when the delay ended, placement still succeeded |
A delayed order shows zero filled and no trade ids. It can't be cancelled while it waits, and if checks fail when the delay ends, it is rejected. The docs describe two delays but give the length of only one. We measured both:
| Delay | Traded markets | Share of 24h volume | Where |
|---|---|---|---|
| None | 13,663 (76.3%) | 86.1% | — |
1 second (seconds_delay) | 4,242 (23.7%) | 13.9% | Sports: moneylines (1,182), totals (890), spreads (585), exact score, team totals, both teams to score |
| 250 ms taker delay | 300 (1.7%) | 0.2% | Mostly stock-price markets, such as "Will AAPL reach $400 in November?" |
Every delayed sports market in our pull used exactly one second. That second is there so a bot watching the game feed can't pick off stale quotes the moment something happens. For a sports bot it changes three things. Taking costs a second of price risk. A FOK that would have filled can come back unmatched. And a resting quote is safer than it looks, because takers can't reach it instantly either. Our sports guide covers the rest.
Which order type each kind of bot should use
| Bot | Order type | Why |
|---|---|---|
| Market maker | GTC or GTD, post-only | Never pays the fee, earns the rebate. GTD for quotes that must disappear before an event |
| Arbitrage | FOK on every leg | A half-filled leg is an open position, not an arbitrage |
| Sniper / news bot | FAK with a worst price | Takes what is there before the price moves; the worst price caps slippage |
| Copy trading | FOK or FAK with a price cap | FOK keeps the copy's size; FAK keeps the copy's timing |
| Scalper | Post-only entries, FAK exits | Earn the spread getting in, pay it only when getting out has to be now |
The bots in our catalog that publish their order logic follow this pattern. PolyTraderBot enters arbitrage with fill-or-kill orders, shrinks and retries, then falls back to fill-and-kill. Pulse Market sends FOK or FAK market orders and has a limit mode with an open or dated expiry. poly-maker is an open-source market maker built on resting quotes.
Poly-Maker
Open-source market-making bot for Polymarket. Quotes both sides of the book over WebSockets with configurable spreads, position merging and risk controls.

PolyTraderBot
Six self-hosted Polymarket bots from one developer, sold separately at $10 a month each and delivered as full source with a browser dashboard, tests and a Docker setup for your own PC or VPS.

Whalidate
Verified PartnerCopy trading for Polymarket that starts with the question a profit leaderboard skips: how did the wallet make its money?
Taker or maker: in the busy books, the fee decides
If a bot can either cross the spread now or rest and wait, the cost of crossing is half the spread plus the taker fee. Across books with both sides quoted, priced 10–90¢:
| Books | Median half-spread | Median taker fee at the mid | Fee bigger than half-spread |
|---|---|---|---|
| All two-sided, 10–90¢ (9,381) | 1.50¢ | 0.87¢ | 31.5% |
| 200 busiest by 24h volume, 10–90¢ | 0.50¢ | 0.77¢ | 73.0% |
In the thin books the spread is the main cost, and a taker's problem is the spread. In the busy books the spread is already one tick: 1¢ wide, 0.5¢ from the mid. There the fee is the bigger cost, and only post-only avoids it. One-tick books are where the volume is: 23% of two-sided books are one tick wide, and they carry 66% of the day's volume. 37% of books are 10 ticks wide or more, and they carry 4.5%.
So in a busy politics market at 50¢, crossing costs 0.5¢ of spread plus a 1¢ fee. Resting earns the 0.5¢ and about a quarter of someone else's fee on top. Every share that could have rested and didn't costs a busy-market bot about two cents. Over a few hundred thousand shares a month, that is the whole edge for most strategies. The fee guide works through the totals, and the taker rebate tiers cut the fee by up to half at high volume.
The flip side is that resting orders get filled when someone else wants to trade, which is often when the price is about to move against you. That cost doesn't appear in any fee table. Our market-making guide is about little else.
Cancels, batches and the dead man's switch
- Batches.
POST /orderstakes 1 to 15 signed orders. Each is accepted or rejected on its own. - Cancels. One order (
DELETE /order), up to 3,000 by id (DELETE /orders), every order in a market or one outcome (DELETE /cancel-market-orders), or everything (DELETE /cancel-all). Cancels are still accepted when the exchange is in cancel-only mode. Cancelling a partially filled order removes only the unfilled rest. - Heartbeats. Post to
/v1/heartbeatsevery 5 seconds. After 10 seconds without one, Polymarket cancels every open order on that API key, across all markets and processes. Once you send the first heartbeat, there is no way to turn it off. Polymarket calls the 10 seconds "the expiry threshold, not a guaranteed cancellation time", and a WebSocket ping does not count as a heartbeat. For a bot with resting orders, this is the cheapest insurance there is: if the bot crashes, its quotes go with it. Running a bot 24/7 covers the rest of that list. - Rate limits. Polymarket has moved order and cancel limits to per-signer token buckets: a standard account gets 40 orders and 80 cancels a second, with bursts of 60 and 120, and the limits rise with volume. The new limiter ran in warning mode from July 24, 2026. As of November 1 the docs still say Polymarket will announce when it is enforced, so treat the numbers as the limits you will be held to.
What the docs don't say
- When the tick changes. Only that it can, and that orders on the old tick are rejected. The price bands above are what we observed.
- How long the sports delay is. We measured one second on every delayed market.
- What the minimum size counts. Shares on one page, USDC on another.
- Self-trade prevention. Nothing is documented for the prediction-market book. If your bot quotes both sides from one account, assume it can trade with itself and filter for it.
Method
- Markets. Every market on Polymarket's Gamma API that was active, open and accepting orders on November 1, 2026 (07:38 UTC): 217,635. Tick size, minimum size, neg-risk flag, fee schedule and best bid and ask come from Gamma.
- Delays. For the 17,905 markets with any volume in the previous 24 hours,
seconds_delayfrom the CLOB's/marketsendpoint and the 250 ms taker-delay flag from/clob-markets, as the docs describe. - Spread and cost. Books with both a bid and an ask (16,066 of the traded markets). The spread in ticks is (ask − bid) ÷ tick. The fee is the market's taker rate × mid × (1 − mid), per share, before any rebate tier.
- Rules. Polymarket's docs on placing orders, managing orders, the order lifecycle, market details, fees, error codes and trading rate limits, read on November 1, 2026. Polymarket can change any of it.
- Script.
scripts/order-rules.mjsin our repository does the pull, and--summaryprints every table above. It is plain Node with no keys.
Frequently asked questions
- What order types does Polymarket support?
- Four. GTC (good till cancelled) and GTD (good till date) are limit orders that rest on the book. FOK (fill or kill) fills the whole order at once or not at all, and FAK (fill and kill) fills what it can at once and cancels the rest; those two are what Polymarket calls market orders. On top of GTC or GTD you can set post-only, which rejects the order instead of letting it take. The SDKs send FAK if you don't name a type.
- What is the minimum order size on Polymarket?
- 5, on every one of the 217,635 open markets we pulled on November 1, 2026 that report one. The docs disagree on the unit: one page calls it shares, another USDC notional. An order under the minimum is rejected with a message that names the minimum, so read it from the market and size above it.
- What tick sizes does Polymarket use?
- The docs list 0.1, 0.01, 0.005, 0.0025, 0.001 and 0.0001, and a price has to be a multiple of the market's current tick. In practice two cover everything: 0.01 on 53% of the markets that traded in the last day and 0.001 on 47%. The tick follows the price. 93% of markets with a best bid under 4¢ use 0.001, as do all of those above 96¢, against 18% of markets in between. Polymarket sends a tick_size_change event on the market stream when it changes.
- Why does my Polymarket order say delayed?
- The market holds marketable orders before matching them. On 4,242 of the 17,905 markets that traded in the day to November 1, 2026, all of them sports markets such as moneylines, totals and spreads, the delay was 1 second. On 300 others, mostly stock-price markets, there is a 250 ms taker delay. A delayed order can't be cancelled while it waits, and it is matched or rejected when the delay ends.
- Does a post-only order pay fees on Polymarket?
- No. A post-only order can only rest, and resting orders never pay fees on Polymarket; only takers do. When it gets filled, the maker also earns a share of the taker's fee as a maker rebate: 20% in crypto, 15% in sports, 25% in most other categories. If a post-only order would match the moment it arrives, it is rejected with 'invalid post-only order: order crosses book'.

