Guide
Analyzing Polymarket bid-ask spreads
Spread is the gap between the best bid and best ask — the cost of immediate execution. This guide covers what spreads tell you about market quality and how they evolve across a market’s lifecycle.
What this guide covers
- Spread = best_ask - best_bid on a 0-1 probability scale
- Tight spreads indicate liquid markets with active market makers
- Spreads follow predictable patterns across market lifecycles
- Spread data is available pre-computed on the /metrics endpoint
What spreads tell you
The spread is the most direct measure of market quality. A 1-cent spread means the cheapest sell is 1 cent above the highest buy.
On Polymarket, spreads are quoted on the 0-1 probability scale. A spread of 0.01 means the market maker is charging a 1-cent fee for immediacy.
Spreads also reflect uncertainty. When the market is uncertain about the outcome, market makers widen their spreads to protect against adverse selection.
Tracking spread over time reveals how market maker confidence evolves. Narrowing spreads mean increasing confidence; widening spreads mean increasing uncertainty.
Spread patterns across market lifecycles
At market open, spreads are typically wide. Market makers are establishing initial quotes and have not yet calibrated.
During steady-state trading, spreads narrow as market makers compete for flow. Active BTC 5-minute markets often see spreads settle to 1 to 2 cents.
As resolution approaches, spreads may widen again. Market makers reduce their quotes to avoid being caught on the wrong side of the resolution.
In the final seconds before resolution, spreads can blow out to 5 to 10 cents or more as market makers withdraw entirely.
| Phase | Typical Spread | Behavior |
|---|---|---|
| Open (0-30s) | 3-10 cents | Wide, market makers establishing quotes |
| Steady (30s-3m) | 1-2 cents | Tight, competitive market making |
| Pre-settlement (3-4.5m) | 2-5 cents | Widening, market makers reducing exposure |
| Final (last 30s) | 5-10+ cents | Blowout, market makers withdrawing |
Using spread data in analysis
Spread is a key input for execution cost estimation. If the current spread is 2 cents, crossing the spread to buy costs you 1 cent per share (half the spread).
Spread data helps compare market quality across coins and timeframes. BTC markets typically have tighter spreads than ETH markets.
Spread anomalies signal market events. A sudden spread widening often precedes or accompanies large trades, news events, or market maker withdrawals.
For backtesting, spread data is essential for realistic fill simulation. A strategy that ignores spread will overestimate returns.
Combining spread data with depth data gives a more complete picture of market quality. A tight spread with deep books is a far more liquid market than a tight spread with shallow depth, where even a small order will walk through multiple levels. Pull both the /metrics and /books endpoints and look at spread alongside bid_depth and ask_depth to distinguish genuinely liquid markets from those that appear liquid at the top of book alone.
For statistical analysis across markets, compute the mean, median, and standard deviation of spread for each market. These summary statistics reveal which markets consistently offer tight spreads and which are more volatile in their pricing. A market with a low mean spread but high standard deviation may be liquid on average but unpredictable moment to moment, which matters for execution planning.
A practical tip: use 60-second resolution for most spread analysis to reduce noise. At 1-second resolution, individual snapshots can capture transient spread spikes from market maker quote updates that do not reflect the prevailing market condition. Resampled to 60-second intervals, the spread series is smoother and more representative of the levels at which you would actually execute.
Code examples
import requests, pandas as pd
BASE = "https://api.polyorderbooks.com/v1"
HEADERS = {"X-API-Key": "your-key"}
metrics = requests.get(
f"{BASE}/markets/btc-updown-5m-1787486400/metrics",
headers=HEADERS,
params={"resolution": "1s"},
).json()
df = pd.DataFrame(metrics)
df["elapsed"] = df["timestamp"] - df["timestamp"].min()
df["bucket"] = pd.cut(df["elapsed"], bins=range(0, 301, 30))
print(df.groupby("bucket")["spread"].mean())Free tier
The Starter plan is free, includes order books, prices, and metrics at 1-second resolution, with 3 days of history, 60 requests/min, 1,000/day, 1 free AI backtest, and 3 strategy backtests. No credit card required.
Paid data windows from $19/mo extend history to 30–120 days at higher throughput. Backtest AI add-on is +$19/mo or standalone at $29/mo.
FAQ
What is a good spread on Polymarket?
For active BTC 5-minute markets, spreads of 1 to 2 cents during steady-state trading indicate good liquidity. Wider spreads (5+ cents) suggest low participation.
Why do spreads widen near resolution?
Market makers widen spreads to protect against adverse selection. As resolution approaches, the risk of being on the wrong side of a binary outcome increases.
Can I trade at the spread?
Yes. Placing a limit order at the best bid or best ask means you are providing liquidity, not crossing the spread. You earn the spread instead of paying it.
How does spread relate to slippage?
Spread is the minimum cost of immediate execution. Slippage is the additional cost when your order walks through multiple price levels.