Consolidated probability
One YES probability per real-world question across Kalshi and Polymarket, liquidity-weighted, with stale and wide quotes left out. The methodology, the exclusions and how to read it.
The Langbot consolidated probability is one YES probability per real-world question, worked out from the markets on Kalshi and Polymarket that resolve on that question in the same way. It is a published measurement with its methodology, below. It is not advice, not a signal, not a forecast by Langbot and not a settlement source. Fees are not included.
What "equivalent" means
Two markets on different venues are equivalent when a YES on one settles the same way as a YES on the other in every outcome their published terms allow, under normal resolution:
- the same subject (person, team, place, office, competition) and the same occurrence (year, date, season);
- the same YES outcome (not its complement, not a different bucket);
- the same thresholds: count ("7+ times" against one mention is not equivalent), strike and its boundary ("above 4.25%" against "4.25% or above" is not equivalent), spread, rank, exact score;
- the same deadline or observation time;
- for a measured quantity (prices, temperatures, economic data), the same source and method: CF Benchmarks' index against a Binance candle, or a daily climate report against hourly METAR readings, is not equivalent.
Differences only in how unusual cases are handled (a cancelled game resolving 50-50 on one venue and at a fair price on the other, tie-breaks) are not checked and do not stop a pair being equivalent. Read both venues' full rules for those.
Pairs that ask the same question with terms that can settle differently are related, not equivalent. They are shown beside a market as "the same question on the other venue, different terms" with the checks that disagreed. They never feed the consolidated number.
How pairs are found
- Candidates. Every open market is normalized: names and places, party and league spellings, US district codes ("MI-06"), dates, numbers with units. A pair is proposed when both markets are in the same category, their dates are close, and their wording is similar (word overlap weighted by how rare each word is).
- The strict check. Each check above is run on both rule texts and recorded with what was read on each side. A concrete mismatch of subject, outcome, year or date makes the pair different; a mismatch of terms makes it related, not equivalent; equivalent needs every check to agree and enough agreeing evidence.
- Review. A person's decision in the manual links file always wins. An optional language-model reading may make a decision stricter, and may lift a pair to equivalent only when the strict check found no concrete mismatch; it must quote both markets' rule text, and a reply without verbatim quotes is discarded.
Every link carries its reasons, so each one can be checked (GET /v1/consolidated/{group_id} returns them).
Measured accuracy
On 2 November 2026 we matched every open market on both venues (163,492 on Kalshi, 64,781 on Polymarket) and labelled pairs by hand. On a held-out sample of 60 pairs, drawn and labelled after the rules were frozen: 40 called equivalent, 38 of them correct (precision 0.95); of the 41 pairs that were truly equivalent, 38 were called equivalent (recall 0.93 on the sample). The two wrong calls were a combination market against one of its legs, and an exact score against "ends in a draw"; both are now checked. Recall is measured only over pairs the candidate stage proposed.
The number
For each group of equivalent markets, at time t, from each venue's latest quote at or before t:
| input | definition |
|---|---|
| mid | (best YES bid + best YES ask) / 2, in dollars (0 to 1) |
| spread | best YES ask − best YES bid |
| depth | USD resting at the touch: bid size × bid + ask size × ask |
| 24 h volume | USD traded on the market in the 24 hours before t |
Exclusions. A venue's quote is left out when it is older than 5 minutes, when either side is missing, when it is crossed (bid above ask), or when the spread is wider than 10 cents. Each response says which venues were left out and why.
Weights. Among the venues that remain, each venue's weight is the average of its share of depth and its share of 24 h volume:
w_i = mean( depth_i / Σ depth , volume_i / Σ volume )p = Σ w_i × mid_iA share that no included venue reports is dropped from the average; when neither is known the venues are weighted equally. When every venue is left out there is no number (p is null).
Venue gap. venue_gap is the largest included mid minus the smallest. A gap is a measurement of how far the venues' quotes are apart before fees; it is not an opportunity.
Fees not included. Mids are the venues' quoted prices. Trading and settlement fees, and the cost of moving money between venues, are not in the number.
History
The number is recorded once a minute going forward. Before the first recorded minute, the history is computed on request from recorded order books, else from recorded candles (a candle is used as of the end of its period). A recorded book row stands until the next one, for at most 15 minutes. Recorded history rarely carries sizes, so historical points usually weigh the venues equally; every point says how many venues it used.
Reading it
GET /v1/consolidated?q=&category=&ticker=— groups with their current number, venues and gap.GET /v1/consolidated/{group_id}?since=&until=&step=— the series, every component, and the links with their reasons.GET /v1/consolidated/divergences?threshold=0.05&min_depth_usd=— groups whose venues disagree by at least the threshold, with liquidity.GET /v1/consolidated/market/{ticker}— the group a market belongs to and the markets linked to it on the other venue.
These endpoints are public and need no token. They have a tight per-minute limit of their own (20 a minute anonymous or on Free). Bulk access, redistribution, commercial feeds and embeds at scale are the licensed API tier: see Pricing. The SDKs expose them as consolidated, consolidated_group, consolidated_divergences, consolidated_market (Python) and consolidated, consolidatedGroup, consolidatedDivergences, consolidatedMarket (TypeScript); the MCP tool is get_consolidated.
Cite it as "Langbot consolidated probability" with the time and a link to the group.