Which prediction market data API publishes the freshest Polymarket data?
Prediction markets produce the most time sensitive event stream in crypto. An election market settles in seconds, a sports book moves on every play, and the price tick a trading UI shows is only as fresh as the API behind it. Builders integrating Polymarket through a data provider rather than hitting the CLOB directly need to know how many milliseconds that provider adds between Polymarket publishing a trade and the provider relaying the same trade to its WebSocket subscribers. This page answers exactly that. The OpenChainBench pm-data-freshness harness holds three WebSocket subscribers in parallel: Polymarket's own CLOB gateway (the canonical T0), Mobula's PM WebSocket, and Codex GraphQL subscriptions, all subscribed to the same basket of top 20 Polymarket markets by 24 h volume, refreshed every 5 minutes. Each trade is matched across providers by a tuple of conditionId, price rounded to 3 decimals, trade size and a 5 second time bucket; the per provider lag versus Polymarket's gateway publish time is recorded as a Prometheus histogram and the leaderboard ranks by p50 in milliseconds, lower is fresher.
Live leaderboard, top 3

Polymarket
#1 · Freshness delta vs Polymarket
1msp99 1 msMobula
#2 · Freshness delta vs Polymarket
10msp99 2.38 sCodex
#3 · Freshness delta vs Polymarket
2.96sp99 48.42 s
Full live data: /benchmarks/pm-data-freshness, refreshed every minute.
Methodology and data sources
Three WebSocket clients run in parallel inside the harness on a Railway europe west 4 instance. Polymarket's own gateway (`wss://ws-subscriptions-clob.polymarket.com/ws/market`, public, no auth, sub 50 ms publish latency from EU West) is the canonical T0 by construction because nothing downstream can be faster than the source. Mobula's PM WebSocket (`wss://pm-api-prod-eu.mobula.io`) requires an API key in the subscribe payload and a browser User Agent on the upgrade request (Cloudflare on the gateway silently filters the default Go HTTP UA). Codex GraphQL (`wss://graph.codex.io/graphql` with the `graphql-transport-ws` subprotocol) runs an `onPredictionTradesCreated` firehose subscription filtered client side to the Polymarket protocol marketIds in the active basket. The cross correlation key is `(conditionId, priceUSD times 1000 rounded, sizeUSD times 1 million rounded, floor(trade_time / 5s))`; the 5 second bucket absorbs minor clock skew between gateways without merging unrelated trades. Histogram buckets run 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000, 60000 ms. Providers that fail to relay a matched trade within 90 seconds are not counted toward p50, only toward their receive total, so a provider cannot look fresh on the leaderboard by silently dropping events; the success rate column surfaces that.
What this number does not tell you
- ·Polymarket's own gateway is the canonical T0 by construction. Its row on the leaderboard sits near zero because the harness compares everything else against it, not because Polymarket has solved network latency; the displayed sub millisecond value is a floor (vector(0.5)) so the row stays visible on the linear chart axis next to the multi second Codex value.
- ·Codex indexes the on chain Polygon confirmation of each Polymarket trade, so its p50 includes Polygon block time (around 2 seconds) plus ingestion. The Codex path is the right one for on chain reconciliation or settlement workflows; for live trading UIs the off chain relay path is the only viable one. The two answer different questions.
- ·Measurement is single region (Railway europe west 4). A provider whose edge gateway is closer to a US East client could post different deltas there; multi region requires running additional monitor instances of the freshness harness, which is on the roadmap.
- ·The basket is the top 20 active Polymarket markets by 24 h volume, refreshed every 5 minutes. Long tail markets with sparse trade flow are not on the leaderboard because the cross correlation matcher needs enough overlapping events to produce a stable histogram per provider.
- ·Kalshi and Limitless are separate exchanges with separate data feeds and a different ingestion path; this bench measures Polymarket as the underlying venue. A Kalshi specific tab is a candidate for a later phase but is not the current scope.
Frequently asked questions
- Which Polymarket data API has the lowest latency right now?
- Polymarket currently leads at 1 ms (p50 over the last 24 hours), measured as wall clock time from Polymarket's own CLOB WebSocket publish to provider relay on the same trade. The leaderboard re sorts every minute on fresh Prometheus samples, so the answer reflects the actual measured lag on the active market basket, not a marketing claim. Mobula's edge cached relay typically clocks tens of milliseconds; Codex's on chain Polygon indexer carries a structural floor near 2 seconds because it ingests block confirmations.
- What does freshness delta mean for a prediction market API?
- The bench connects to Polymarket's own CLOB WebSocket and to each provider's WebSocket simultaneously, subscribes to the same markets, and for every trade event records how many milliseconds the provider takes to relay the event after Polymarket itself publishes it. Lower is better. Polymarket's own gateway publish time is the canonical T0 because by construction nothing downstream can be faster than the source. The cross correlation key (conditionId, price, size, 5 s bucket) survives minor clock skew between gateways without merging unrelated trades.
- Is Mobula's PM WebSocket faster than Codex?
- Yes, by a structural margin, because the two providers do fundamentally different things under the hood. Mobula's PM WebSocket is an edge cached relay of Polymarket's own gateway, so its p50 delta is roughly the network round trip between the two gateways plus a few milliseconds of bookkeeping. Codex ingests the on chain Polygon confirmation of each trade, which adds Polygon block time (around 2 seconds) before any trade can be relayed. For a live UI, Mobula's path wins on freshness; for on chain reconciliation or settlement workflows, Codex's chain indexed path is what you actually want. The leaderboard surfaces both numbers honestly.
- Why not include Polymarket REST polling on this bench?
- Freshness is a WebSocket question. REST polling at 1 second cadence would have a floor freshness near 500 ms (poll interval divided by 2) plus round trip time, dominated by how often you poll. The Polymarket gateway WebSocket exists for exactly this reason, to avoid that floor. Adding REST as a row would make the leaderboard noisy without changing the conclusion: WebSocket beats polling by definition for real time data.
- Are these numbers comparable to Kalshi or Limitless?
- Not directly. This benchmark measures Polymarket as the underlying venue since it is the largest and the one most providers proxy. Kalshi and Limitless are separate exchanges with separate data feeds, and providers that cover them often run a different ingestion path. A Kalshi specific tab is a candidate for a later phase. For now, treat the leaderboard as how fresh is your Polymarket data feed.
- How does the cross correlation matcher avoid false positives?
- The signature is (conditionId, priceUSD times 1000 rounded to 3 decimals, sizeUSD times 1 million rounded, floor(trade_time / 5 seconds)). Two unrelated trades would need to share the same conditionId, the same price to 3 decimals, the same size to 6 decimals, and land in the same 5 second window to collide. On the top 20 markets that combination is unique in practice; on a thinly traded long tail market it could in principle merge two trades, which is one reason the basket is restricted to the top 20 by volume.
- How often is the leaderboard refreshed?
- Continuously at the WebSocket level. Every trade event lands on the harness in real time and updates the freshness histogram; the page reads a rolling 24 h p50, p90 and p99 every minute. The market basket itself is refreshed every 5 minutes against `gamma-api.polymarket.com` so the leaderboard tracks current top markets rather than yesterday's hot list.
Related questions
Same data as /benchmarks/pm-data-freshness, refreshed every minute. Open methodology, open source.