NEW: Live arbitrage across 10+ prediction markets.Arbitrage →
← Index
Prediction MarketsSep 4, 202614 min read

How to Track Probability Shifts Across Prediction Markets

How to Track Probability Shifts Across Prediction Markets

The Short Answer

Track shifts from the bid and the ask on every venue at once, not the midpoint, and discard any move on a market with no live book behind it. A contract at 62 cents prices a 62% chance, so a price move is a probability shift, but only when someone stands behind the new number. Across 5,000 live Kalshi markets, 18.1% had no bid at all, so many of the moves on screen are an ask drifting with nobody opposite. Predictefy streams live bids and asks from 15+ venues on one normalized schema over a WebSocket at /v1/stream, on a Free plan that costs 0 USD.

Key Takeaways

  • A price is a probability. A contract moving from 62 cents to 66 cents is a four point shift, provided a live bid and ask sit behind both numbers.
  • 18.1% of 5,000 live Kalshi markets had no bid at all. A tracker built on midpoints invents shifts on every one of them.
  • Size the threshold to the book. Median spread on two-sided Kalshi books was 5.1 cents, 8 cents under 100 contracts of 24 hour volume, 1 cent above 10,000.
  • Cheap tails lie the most. Under 5 cents, 41% of markets had no bid. Between 25 and 50 cents, 0% had no bid.
  • Polling burns your rate limit and still misses moves. Free includes 60 requests a minute and 2 WebSocket streams that push changes to you.
  • Stored history is proven for 11 venues, not all 17, so log your own series from day one.

What does a probability shift mean on a prediction market?

A binary contract pays 100 cents if the event happens and 0 if it does not, so the price is the probability, in cents. A YES contract at 62 cents is the market saying roughly 62%. When it trades at 66 cents an hour later, the crowd has revised its forecast up four points.

The complication is that there is no single number called "the price." There are three, and they often disagree:

  • Best bid. The highest price someone will actually pay. The number you can sell into.
  • Best ask. The lowest price someone will actually sell at. The number you can buy at.
  • Midpoint. The average of the two. A convenience, not a trade, and not a real quote when one side is missing.

The legs are linked. On a Kalshi binary, NO_ask equals 100 minus YES_bid, so a zero YES bid makes the NO leg cost 100 cents. An empty bid side is not cosmetic, it propagates straight through to the other side of the same market.

So a shift is narrower than "the number changed." It is the executable price moving, on a book that had both sides at the time, by more than that market's own spread.

Why do prediction market price trackers show false moves?

Because they log midpoints, and a midpoint needs both sides of the book. Across 5,000 live Kalshi markets, 18.1% had no bid at all. On those, the only quote is an unmatched ask, so when a maker widens it by three cents a midpoint tracker records a shift. Nothing shifted, no money moved, and there was never a price at which you could have sold. It gets worse at the cheap end: under 5 cents, 41% of markets had no bid, while in the 25 to 50 cent band, 0% did.

The second cause is one threshold applied everywhere. Median spread on two-sided Kalshi books was 5.1 cents, and that median hides a huge range. Sorted by 24 hour volume, the median spread was 8 cents under 100 contracts and 1 cent above 10,000. The widest books measured were scalar economic markets, with KXUSCPIYEAR at 57 cents. A flat 4 cent alert is deafening on a liquid market and silent on a wide one.

How do you tell a real probability shift from noise?

Four filters, in this order. Each is cheap, and each kills a class of false alerts.

  1. Qualify the book first. No bid means no probability. Skip the market, or flag it as one-sided and watch how long it stays that way.
  2. Compare like to like. Bid against previous bid, ask against previous ask. Never bid against ask, and never midpoint against midpoint when the book gained or lost a side between samples.
  3. Set the threshold from the market's own spread. A move smaller than the spread is quote drift, not news. Use the live spread, with the volume band as a fallback.
  4. Require persistence. Hold the new level across two updates before calling it a shift. A print that reverts is inventory management.
Book stateWhat the data showsHow to treat a move
No bid at all18.1% of 5,000 live Kalshi marketsDo not log it as a probability shift
Priced under 5 cents41% had no bidRequire a live bid before trusting anything
Priced 25 to 50 cents0% had no bidTreat moves as real, threshold at the spread
Under 100 contracts of 24h volumeMedian spread 8 centsIgnore moves smaller than 8 cents
Above 10,000 contracts of 24h volumeMedian spread 1 centA 2 cent move is already meaningful
Scalar economic marketsKXUSCPIYEAR at 57 centsWidest measured, midpoint means very little

One unit warning: Kalshi volume is counted in contracts and Polymarket volume in US dollars, so never divide one by the other or rank them in the same column.

How often do prediction market prices change?

Two clocks decide it: how fast the venue's markets resolve, and how much money is working the book. On speed, none of Kalshi's 274 crypto series runs shorter than 15 minutes. Polymarket runs 5 minute, 15 minute and hourly Bitcoin windows, with the 5 minute heading reading "BTC Up or Down 5m", and five minute contracts on BTC, ETH, SOL, XRP and HYPE.

On money, the fastest clock is the emptiest. Five minute traded volumes seen were 18 USD, 78 USD and 229 USD, many at 0 USD, while hourly windows ran 8.4K, 10.1K, 12.5K and 46.6K USD. The market that reprices most often carries the least conviction behind each reprice.

The practical consequence is request budget. Poll 200 markets individually every five seconds and that is 40 requests a second, or 2,400 a minute, against a Free plan limit of 60 a minute. You are forty times over the line and you still miss every move between polls. Streaming inverts it: you are told when something changed, and you spend nothing while the book is quiet.

How do you track price changes across prediction markets in one place?

The hard part is not one venue, it is 15+ of them. Each has its own identifiers, price units, definition of a market, and auth, so going venue by venue means writing that adapter over and over, then rewriting it whenever one changes a field.

Predictefy collapses that into one normalized schema. 15+ venues arrive in the same shape, so the only thing that changes between requests is the venue segment in the path:

curl -H "Authorization: Bearer pk_live_..." "https://data.predictefy.com/api/kalshi/{verb}"

curl -H "Authorization: Bearer pk_live_..." "https://data.predictefy.com/api/polymarket/{verb}"

What this does

Both calls hit the same reads API at https://data.predictefy.com with the same bearer key, using the request shape /api/{venue}/{verb}. Swap kalshi for polymarket, smarkets or any other supported venue and the response shape holds, so your shift logic is written once, not once per venue.

For live tracking, connect to the WebSocket rather than looping over those requests:

wss://data.predictefy.com/v1/stream

What this does

Opens a push channel on the same API key. Changes arrive when they happen, not when your timer fires. Free includes 2 WebSocket streams and 60 requests a minute, so you can hold a live stream and still make one-off reads beside it.

Compute your shifts from live bids and asks rather than midpoints that 18.1% of 5,000 live Kalshi markets cannot even quote. That is the difference between a tracker that alerts you and one you learn to ignore.

Client packages are available in beta: @predictefy/sdk and @predictefy/mcp at 1.0.0-beta.3 on npm, predictefy at 1.0.0b2 on PyPI. Pin exact versions, because the latest tag points at a beta. The MIT licensed MCP server runs with npx -y @predictefy/mcp, and no tool in it both builds and submits an order.

Can you get historical probability data for prediction markets?

Partly. Stored history is proven for 11 venues, not all 17. For the rest, the only history you get is the history you record, so a shift tracker should write to storage from its first minute.

Store four things on every capture, not one: the best bid in cents (null when there was none), the best ask in cents, the timestamp in UTC, and a two-sided flag telling you later whether that row was a real quote.

An archive of midpoints cannot be repaired afterward. Six months on, you cannot tell which rows were genuine 62% readings and which were an unmatched ask on an empty book. Raw bids and asks cost almost nothing to keep and let you re-derive any measure later, including spread, the input to your noise threshold.

What does it cost to track probability shifts across venues?

PlanPriceWhat it fits
Free0 USD25,000 credits a month, 60 requests a minute, 1 API key, 2 streams
Builder49 USD/moHeadroom past the Free plan
Pro249 USD/moContinuous production trackers
Scale999 USD/moHigh volume, many consumers
EnterpriseFrom 2,500 USD/moCustom terms

A one-person tracker across a handful of venues fits inside Free. The arbitrage API is free as well, which matters here: a cross-venue shift and a cross-venue price discrepancy are the same measurement from two angles, one asking what changed, the other asking where venues disagree now.

What are the limits of a prediction market data API?

Three limits worth knowing. History coverage is 11 venues, not 17. fetchBalance on the hosted API intentionally returns 501 NOT_SUPPORTED, so do not design a dashboard that expects balances from the reads API. And there is no generic server-side signing route, because orders are signed client side.

That last one matters if your tracker acts when a shift fires. Execution is a separate, isolated, non-custodial service at its own origin, not the reads API, with routes under /v1/exec/{venue}/orders/... for build, submit, cancel, modify and refresh. Every write takes an Idempotency-Key, which is what you want when an alert loop fires twice on one shift, and default caps are 100 USD per order and 1,000 USD per key per rolling 24 hours.

Frequently Asked Questions

Does a prediction market price equal the probability?

Yes, near enough, when the book is two-sided. A binary contract pays 100 cents if the event happens, so 62 cents prices roughly a 62% chance and a move to 66 cents is a four point shift. With no live bid behind it, that number is a quote, not a probability.

Is there an API that covers multiple prediction markets?

Yes. Predictefy returns 15+ venues on one normalized schema from https://data.predictefy.com, using the request shape /api/{venue}/{verb} and a single bearer key. Swap the venue segment and the response holds its shape, so you write your shift logic once instead of maintaining a separate adapter for every venue.

How fast do Kalshi and Polymarket prices update?

Faster than the money behind them. None of Kalshi's 274 crypto series runs shorter than 15 minutes, and Polymarket runs 5 minute, 15 minute and hourly Bitcoin windows. Five minute volumes seen were 18, 78 and 229 USD, many at 0 USD, while hourly windows reached 46.6K USD.

How far back does prediction market price history go?

Only as far as your own log, for most venues. Stored history is proven for 11 venues, not all 17, so record the stream yourself from day one. Save the bid, the ask, the UTC timestamp and a two-sided flag on every capture, because a midpoint-only archive cannot be repaired later.

How big does a price move have to be to matter?

Bigger than that market's own spread. Median spread on two-sided Kalshi books was 5.1 cents, 8 cents for markets under 100 contracts of 24 hour volume and 1 cent above 10,000. Anything inside the spread is quote drift, so a 2 cent move only counts on a tight book.

Is the midpoint a good measure of probability?

Not on thin markets. A midpoint needs both sides, and 18.1% of 5,000 live Kalshi markets had no bid at all, which leaves the midpoint either undefined or invented. On a Kalshi binary, NO_ask equals 100 minus YES_bid, so a zero YES bid puts the NO leg at 100 cents.

Do you need a paid plan to track prediction market prices?

No. The Free plan is 0 USD a month with 25,000 credits, 60 requests a minute, 1 API key and 2 WebSocket streams, which covers a working shift tracker. The arbitrage API is free as well. Builder is 49 USD a month if you outgrow the Free plan.