What is exchange liquidity?

Exchange liquidity is the money waiting to be matched at each price on exchanges like Kalshi and Novig. How to read depth and why thin prices mislead.

The money waiting to be matched at each price on an exchange.

A Kalshi or Novig price with $20 behind it says far less than one with $20,000. Read the size next to every exchange price before treating it as the market.

Exchange liquidity is the money waiting to be matched at each price on an exchange. On Kalshi, Polymarket, Novig or ProphetX, nobody posts both sides of a market the way a sportsbook does. Participants rest orders in an order book, and the best price on screen is only as good as the money behind it. A quote with $20 resting at it and a quote with $20,000 resting at it can show the same number, but they tell you very different things about the market. This guide covers what exchange liquidity measures, how to read order book depth, how contract prices in cents relate to odds, why thin prices mislead, and how the PreciseAPI API returns liquidity with every exchange price.

How exchange liquidity works

On a sportsbook, the book is the counterparty to every wager. It posts both sides, builds its margin into the price and accepts bets up to a limit it sets. On an exchange, the venue matches participants against each other. Someone who wants a side either takes an order that is already resting in the book or posts a new order and waits for someone else to take it.

Every resting order has a price and a size. The best price on each side is the order closest to the other side of the book, and the amount resting there is the available liquidity at the top of the book. Behind it sit more orders at progressively worse prices. Taken together, those levels are the order book depth: how much could be matched, and at what average price, before the book runs out of orders.

That is the core difference from a sportsbook price. A sportsbook quote is good up to the book's limit, which is rarely published. An exchange quote is good only for the size resting at it. Ask for more and the rest of the order fills at the next level, or not at all.

Reading order book depth

Here is a simplified book for a "Team A wins" contract on a contract exchange:

PriceContracts offeredAmerican odds
$0.53500-113
$0.542,000-117
$0.558,000-122

A 100-contract order fills entirely at $0.53, so the quoted price is the price paid. A 1,000-contract order takes all 500 at $0.53 and 500 at $0.54, an average of $0.535, or about -115. A 5,000-contract order reaches the third level and averages $0.544, about -119. The quote never changed; the size did. That average, the volume-weighted price across the levels an order consumes, is the number to compare with a sportsbook when size matters. Depth also differs by outcome: one side of a market can be deep while the other is thin, and both change every time an order is placed, filled or cancelled.

Why $20 means less than $20,000

A price with $20 behind it is usually one participant's order. It may be stale, left over from before an injury report, or an outlier waiting for someone to take it by mistake, and it may be cancelled a second after you read it. Nobody else has backed that number with money.

A price with $20,000 behind it is a different kind of evidence. Several participants are willing to trade there, market makers who hedge across sportsbooks and other venues are likely involved, and moving the price would take real money. That is why exchange prices with deep books are often treated as sharp, and why the same venue's price on a thin market can be little more than noise.

Thin prices cause the same few problems in code. They win "best price" rankings by accident, because one generous order beats every sportsbook on the board. They create false signals: a stale order that looks four points better than a de-vigged sharp book price is usually a data artifact. And they distort consensus, because averaging a $20 price with a $20,000 price on equal terms gives the thin one far too much weight. The fix is the same each time: read the price together with its available liquidity, set a floor below which a price is display-only, and weight by depth when you combine venues.

Contract prices and odds

Contract exchanges such as Kalshi, Polymarket, Polymarket US and Fanatics Markets list contracts that pay $1 if an outcome happens and nothing if it does not. A contract trading at $0.62 costs 62 cents and returns $1.00 if it wins, a net of 38 cents. The price in cents is the market's implied probability, so converting contract prices to odds is direct:

implied probability = price
decimal odds        = 1 / price
American odds       = -100 * price / (1 - price)    if price > 0.50
                    = 100 * (1 - price) / price      if price <= 0.50
Contract priceImplied probabilityDecimalAmerican
$0.2525%4.000+300
$0.3838%2.632+163
$0.5050%2.000+100
$0.5353%1.887-113
$0.6262%1.613-163
$0.8080%1.250-400

Check the $0.62 row: -100 × 0.62 / 0.38 = -163.16, which rounds to -163. A contract bought at $0.62 risks $0.62 to net $0.38, a 61.3% return on the outlay, the same as a -163 sportsbook price to within rounding. Betting exchanges such as Novig, ProphetX and 4CX quote odds rather than cents, but the same arithmetic applies in reverse, and their order books carry the same kind of depth.

Overround, ticks and fees

If "Yes" costs $0.53 and "No" costs $0.49, buying both costs $1.02 for a pair that settles at exactly $1.00. That 2% is the quoted overround, the exchange equivalent of a sportsbook's hold (a -110 / -110 market is 4.76%), and it only holds for the size resting at both asks. Contracts usually trade on a one-cent grid, so near the edges one tick is a large change in return: $0.10 to $0.11 moves from +900 to +809. The quoted price also excludes fees, which differ by venue and change over time; the betting exchanges vs sportsbooks guide works through realistic fee shapes.

Exchange liquidity in the PreciseAPI API

Of the 36 sources in the catalog, seven have type exchange. They share one response shape and the same liquidity field. The prediction tag marks contract exchanges and the exchange tag marks betting exchanges. Tags are for grouping and filtering, not legal or regulatory statements, and availability of every venue varies by jurisdiction.

SourceidTag
Kalshikalshiprediction
Polymarketpolymarketprediction
Polymarket USpolymarket_usprediction
Fanatics Marketsfanatics_marketsprediction
Novignovigexchange
ProphetXprophetxexchange
4CX4cxexchange

Exchange prices arrive mapped onto the same events, market keys, periods and outcome sides as sportsbook prices. A "Team A wins" contract appears as a moneyline market with a home or away outcome, priced in the format you ask for. Each exchange outcome also carries liquidity, the size available at the quoted price in USD. Sportsbook outcomes do not carry the field.

The free /v1/sportsbooks?type=exchange call lists exchange-type sources with their tags and current league coverage. Then request prices with format=probability, which returns implied probability directly (2 credits per /v1/odds call):

curl "https://api.preciseapi.com/v1/odds?league=nfl&markets=moneyline&status=scheduled&format=probability&books=kalshi,polymarket,pinnacle" \
  -H "Authorization: Bearer $PRECISEAPI_KEY"
{
  "data": [{
    "id": "evt_0uuc6p2dsqa",
    "bookmakers": [
      { "id": "kalshi", "name": "Kalshi", "type": "exchange", "markets": [{
        "key": "moneyline", "period": "full_game",
        "outcomes": [
          { "side": "home", "price": 0.6198, "liquidity": 3100 },
          { "side": "away", "price": 0.4, "liquidity": 2650 }
        ] }] },
      { "id": "pinnacle", "name": "Pinnacle", "type": "sportsbook", "markets": [{
        "key": "moneyline", "period": "full_game",
        "outcomes": [ { "side": "home", "price": 0.6154 }, { "side": "away", "price": 0.4049 } ] }] }
    ]
  }],
  "meta": { "format": "probability", "credits_used": 2 }
}

Two details in that response are worth knowing. First, liquidity is per outcome, so the home side here shows $3,100 and the away side $2,650. Second, a $0.62 contract comes back as 0.6198, not 0.62. PreciseAPI normalizes every source to one internal price representation (American odds) and converts on the way out, so $0.62 becomes -163 and then 163 / 263 = 0.6198. The difference is rounding, not a different market; round contract exchange rows to the venue's tick size if you need the original cents.

A short JavaScript example that compares each contract exchange with a de-vigged sportsbook reference and skips prices with less than $500 of available liquidity:

const API = 'https://api.preciseapi.com';
const headers = { Authorization: `Bearer ${process.env.PRECISEAPI_KEY}` };
const MIN_LIQUIDITY = 500;

const { data: sources } = await (await fetch(`${API}/v1/sportsbooks?type=exchange`, { headers })).json();
const venues = sources.filter((s) => s.tags.includes('prediction')).map((s) => s.id);

const url = `${API}/v1/odds?league=nfl&markets=moneyline&format=probability&books=pinnacle,${venues.join(',')}`;
const { data } = await (await fetch(url, { headers })).json();

for (const ev of data) {
  const ml = (bm) => bm.markets.find((m) => m.key === 'moneyline' && m.period === 'full_game');
  const ref = ev.bookmakers.find((b) => b.id === 'pinnacle');
  if (!ref || !ml(ref)) continue;
  const sum = ml(ref).outcomes.reduce((s, o) => s + o.price, 0);
  const fair = Object.fromEntries(ml(ref).outcomes.map((o) => [o.side, o.price / sum]));
  for (const bm of ev.bookmakers.filter((b) => venues.includes(b.id))) {
    for (const o of ml(bm)?.outcomes ?? []) {
      if ((o.liquidity ?? 0) < MIN_LIQUIDITY) continue;
      const gap = ((o.price - fair[o.side]) * 100).toFixed(2);
      console.log(ev.id, bm.id, o.side, o.price, `ref ${fair[o.side].toFixed(4)}`, `${gap} pts`, `$${o.liquidity}`);
    }
  }
}

The WebSocket stream pushes exchange price changes as deltas with liquidity on each outcome, so depth can be tracked alongside price. /v1/history accepts book=kalshi or book=polymarket on main full-game markets (3 credits) and stores prices, not liquidity. /v1/best-lines ranks exchange prices alongside sportsbooks on quoted price alone, so apply your liquidity floor and fees before trusting a "best" exchange price.

Common mistakes in code

See exchange for how order-book venues work, implied probability and decimal odds for the conversions, and no-vig fair odds for the reference side. The betting exchange odds API post covers liquidity-aware consensus and best prices in code, the Kalshi and Polymarket odds data guide is the contract-pricing deep dive, and betting exchanges vs sportsbooks covers fees and spreads. For product details, see the exchange odds API, exchange trading tools and pricing.

Frequently asked questions

What is exchange liquidity?

It is the money resting in an exchange's order book, waiting to be matched at each price. The amount at the best price tells you how much could trade at the quoted number; the levels behind it, the order book depth, tell you how the price would move for a larger order.

What does the liquidity field in the API measure?

The size available at the quoted price, in US dollars, per outcome. It is present on every exchange outcome, from both contract exchanges and betting exchanges, and absent on sportsbook outcomes.

How do I convert a contract price to American odds?

For a price above $0.50, American odds are -100 × price / (1 - price); at or below $0.50 they are 100 × (1 - price) / price. A $0.62 contract is -163 and a $0.38 contract is +163. Or request format=american, the default, and PreciseAPI does it for you.

Can I get exchange prices in the same request as sportsbooks?

Yes. Pass a mixed list such as books=kalshi,novig,draftkings,pinnacle to /v1/odds. Every source uses the same event ids, market keys and outcome sides, and exchange rows add the liquidity field.

Related reading