← Back to blog

We Decoded Polymarket's Invisible Parlay Market

By the ZenHodl team — we run the trading bots this blog writes about, and the qualifying live-position record, including losses, is public with its admission rules at /results.

Correction — 2026-08-16, from our own adversarial re-verification. Two updates. (1) Our headline summed the wrong side's cash: in this RFQ market the dealer is the buyer on 100% of real fills, and the recorded fill cash is the dealer's funding of each mint, not the bettors' premium. Restated for the full Aug 6–9 window with proxy-duplicate rows classified out: ~$9.5M of parlay contracts minted — bettors staking ~$2.5M of premium against ~$7.0M of dealer funding — across ~51,000 fills (81,000 on-chain fill events), 19,242 distinct parlays, and ~3,900 wallets (~3,850 bettors vs ~120 dealers). The corrected market is bigger than we published, and it surfaces the sharper fact: this is a dealer-funded market — roughly 120 dealers fund ~74 cents of every minted dollar. (2) One day after publication, Kalshi began scalar-settling void-affected parlays (Aug 10; 72 observed by Aug 15, fractional values unlike Polymarket's strict 0.5-per-void product) — our pre-registered scorer skips unknown settlement vocabulary rather than coercing it, which is exactly how the change surfaced. Every other measured claim reproduced under re-verification; details inline.

Polymarket has a parlay market. You will not find it on the website's order books: no public listings, no quotes, no trade feed. Combos — their name for parlay-style multi-leg positions — trade through a request-for-quote system where a user asks, market makers answer privately, and the fill settles on-chain. From the outside, the market is invisible.

It is not small. We have been recording every combo fill from the Polygon blockchain since August 6 — the first complete independent reconstruction of this market that we are aware of. In the first four days: ~$9.5 million of parlay contracts minted across ~51,000 fills and 19,242 distinct parlays, with ~3,850 bettor wallets staking ~$2.5M of premium against ~120 dealer wallets funding the rest (corrected 2026-08-16 — see the note above).

This post is what we found when we decoded it — including the part Polymarket doesn't publish anywhere: what's inside each parlay.

The market nobody can see

Combo fills settle through Polymarket's Exchange v3 contract. Each fill emits an OrderFilled event carrying price, size, fee, and the parlay's position id. Recording those events continuously gives you the only public tape of this market — but with a catch: the position id is opaque. Nothing in any public API tells you which games a parlay contains.

We verified that the hard way first — eight API endpoints, all dead ends.

Then we read the contract. Exchange v3's implementation is verified open-source, and its CombinatorialModule does three things that change everything:

  1. The parlay's condition id is a hash of its leg set — the id is the contents, cryptographically.
  2. The contract stores the canonical leg array for every parlay ever prepared.
  3. It exposes it: getLegs(conditionId) returns every leg, each carrying its own YES/NO side.

So every parlay in the tape — past and future — decomposes with one free contract call. We decoded all of them, and because the id is a hash of the legs, every decode is self-verifying: we recompute the id from the returned legs and refuse the row on mismatch. Across all 19,242 parlays in the window: zero mismatches (independently re-verified 2026-08-16 on a 500-condition hash recompute).

Settlement reads the same way. getPayout() — the same code path that pays real redemptions — told us the outcome of every resolved parlay.

What's actually inside a parlay

With legs decoded and the market catalog joined, the invisible market gets a composition. Of the classified premium: esports is the largest parlay category (~27–28% under every cash weighting), with tennis, soccer, MLB and cross-sport tickets (parlays mixing leagues) each at ~14–19% depending on how you weight the cash — the mid-order reshuffles within a few points by weighting, so we no longer publish a strict ranking below first place. Two-leg parlays are ~54% of economic fills; the tail runs past ten legs.

The behavioral finding cuts against sportsbook folklore. Measuring the same product on Kalshi — whose multivariate markets publish their leg composition, letting us price every leg at the moment each parlay printed — parlay bettors overwhelmingly stack favorites, not longshots:

These are accumulator tickets, not moonshots.

The two venues settle parlays differently — measurably

A parlay's fine print matters exactly when a leg is postponed or voided, and the two venues genuinely differ:

Same normal-day behavior, different contracts when something breaks. The full measured comparison is in our parlay settlement notes.

The same parlay costs the same on both venues

Both venues list overlapping sports, so many identical parlays — same games, same picks — trade on both. We matched them with a deliberately conservative crosswalk (explicit team maps, doubleheaders rejected rather than guessed, pregame prints only, Polymarket timestamps taken from the blockchain itself), then paired prints one-to-one, each required to be the other's nearest in time.

For MLB moneyline parlays — 454 equivalent definitions, 91 print pairs within ten minutes of each other:

window pairs Kalshi − Polymarket
≤ 1 min 20 −0.28c
≤ 5 min 58 +0.08c
≤ 10 min 91 −0.04c
≤ 15 min 118 +0.01c

The −0.04c is a signed mean, so here is the full distribution rather than a headline: across those 91 pairs the median absolute difference is 0.36c (interquartile range 0.16–0.68c), 92% of pairs differ by less than one cent — one full tick — and the largest disagreement observed was 2.62c. The two venues price the same parlay almost identically, in real time, with no systematic side cheaper than the other (mean −0.04c, CI [−0.19, +0.10]).

That precision doubles as validation: a wrong team map or a flipped side in our matching would show up as large random differences, not 0.04 cents.

One honest asterisk: this is price equivalence for parlays that complete normally. Because of the void-handling difference above, the contracts are not identical in every state of the world, so none of this is an arbitrage claim.

What we're still testing — and won't claim yet

The obvious next question is whether parlays are fairly priced against outcomes. Our first cohorts show parlays on both venues resolving below their price across most of the price range — but parlays that share legs win and lose together, so a few days of games is effectively a handful of independent observations, however many thousand fills it contains. We have retracted a headline number before for exactly this class of error, and we are not repeating it.

The test is pre-registered: 7–14 independent game-slates, errors clustered by slate, published either way — including if the effect disappears. The daily capture is accumulating it now.

The data

Two different kinds of capture back this study, and they age differently. Polymarket's fills live on a public blockchain — anyone could reconstruct those later, and our decode method is described above precisely so anyone can check it. What cannot be reconstructed is the point-in-time context: Kalshi's leg order books at the moment each parlay printed, and the daily market catalogs that expire as games end. Those observations exist only if someone was recording when they happened. We were.

Want the full historical panel, the Polymarket decoded tape, or a custom cut (we also produce dealer-level benchmarking for market participants): [email protected].

ZenHodl records prediction-market microstructure continuously across both major U.S. venues. We publish our negative results, our retractions, and our methods — that's the product.

Related reading

Get ZenHodl Weekly

One weekly email with live results, one model insight, and product updates.

Tuesday mornings. No spam.

Want the data behind this post?

Historical sports prediction-market datasets with measured coverage, documented schemas, and disclosed gaps.

Join the community

Discuss strategies, share results, get help.

Join Discord