Skip to main content

Venue comparison

Kalshi and Polymarket together are ~95% of tracked volume. See the $1-face and notional caveats before comparing Nadex or CME with the rest.

Who is taking share, and at what take rate

granularity=MONTH rolls each metric up by its own aggregation type, so SPOT_VOLUME and FEES come back as true monthly totals. Volume gives share, fees over volume gives the implied take rate.
  • Share is consolidating. Kalshi went 58.6% to 70.2% in three months. Polymarket went 28.9% to 21.9% on volume that peaked in June.
  • Take rates are converging from opposite ends. Kalshi’s compressed from 1.08% to 0.92% while Polymarket’s expanded from 0.48% to 0.63%.
  • July fees annualize to roughly $4.5B for Kalshi against $1.0B for Polymarket, at a flat run rate.
Share is measured against the USD-denominated venues only. Nadex and CME quote in contracts whose face value varies by product, so they are excluded from the denominator rather than converted. See the notional caveats.

Which categories are driving the growth

Volume growth is only as durable as the categories behind it. dimensionType=CATEGORY composes with granularity=MONTH, turning the same call into a mix shift over time:
Kalshi’s top three of 17 categories: Sports is the largest book but a shrinking share of it: 58% to 44% while total volume more than doubled. Exotics and crypto absorbed the difference. Each month’s categories sum exactly to that month’s undifferentiated SPOT_VOLUME, so this is a clean partition you can build a mix model on.
granularity respects each metric’s aggregation_type. SPOT_VOLUME and FEES are SUM, so a month bucket is a genuine monthly total. OPEN_INTEREST is LAST, so its bucket is the month-end snapshot and must never be added across months. summarize=true behaves differently again: it returns the endDate day for every metric. See Core concepts.
Metrics have their own inception dates. ACTIVE_MARKETS for Kalshi begins on 2026-07-17, so it covers part of this window rather than all of it. Divide by the number of populated points rather than the row count, since the response returns a row per period either way.