What the Kalshi order book shows
The Kalshi order book is the list of resting orders in one market. Each line is a price and the number of contracts waiting to trade at it. Bids are orders to buy. Asks, also called offers, are orders to sell. Kalshi's help center defines a resting order as an offer to buy contracts at a price that did not match right away.
Every market has its own book. An event with ten candidates or ten price ranges has ten markets and ten books. The other side of each trade is another member. Kalshi's help center says you always trade against another member of the platform, never against the exchange. The rulebook says all trading on the central limit order book is anonymous (Rule 5.7).
The rulebook also sets what you can see. Kalshi must let members view the best bid and offer, open interest, trade volume and the depth of the book down to the fifth price level (Rule 5.15). The public API returns every level.
Reading a Kalshi order book, level by level
The book below is made up for illustration. It shows five levels on each side of one market, quoted in YES prices.
| Bids to buy YES | YES price | Offers to sell YES |
|---|---|---|
| 53c | 600 | |
| 52c | 1,500 | |
| 51c | 900 | |
| 50c | 400 | |
| 49c | 250 | |
| 48c | ||
| 300 | 47c | |
| 800 | 46c | |
| 1,200 | 45c | |
| 500 | 44c | |
| 2,000 | 43c |
Read it from the middle out.
- The best bid is 47c, with buyers for 300 contracts.
- The best ask is 49c, with 250 contracts offered.
- The spread is 49c minus 47c, or 2c. Nobody is quoting 48c.
- The midpoint is 48c. It is the usual one-number read on the market: a 48% implied chance.
- Right now you can sell 300 YES at 47c or buy 250 YES at 49c. A larger order reaches the next level.
Kalshi's own glossary notes that highly liquid markets tend to have tighter spreads. The sections below turn the spread and the depth into cents per contract.
Why YES and NO share one book
A YES contract and a NO contract on the same market together pay exactly $1. That ties every order on one side to an order on the other. Kalshi's API documentation states the rule: a YES bid at price X is a NO ask at $1 minus X, and a NO bid at price Y is a YES ask at $1 minus Y.
So in Kalshi's data, the 250 contracts offered at 49c in the sample book are a NO bid at 51c. A trader who bids 51c for NO stands ready to take the other side of a YES buyer at 49c. Read from the NO side, the same book looks like this.
| Top of the book | YES view | NO view |
|---|---|---|
| Best bid | 300 at 47c | 250 at 51c |
| Best ask | 250 at 49c | 300 at 53c |
| Spread | 2c | 2c |
| Midpoint | 48c | 52c |
The spread is the same from both sides, and the two midpoints add up to $1. Kalshi's help center says there is no difference between buying YES and selling NO. The API files both under the same direction: long YES. Use whichever view is easier to think in. The guide to Kalshi odds explains why the YES ask and the NO ask add up to more than $1.
What the bid-ask spread costs
The spread is what you pay to trade right now. A buyer who takes the ask pays half the spread above the midpoint. A seller who hits the bid gives up half the spread below it. In the sample book that is 1c each way, before the fee.
Kalshi charges the fee on the part of an order that matches a resting order. Its fee schedule sets it at:
C is the number of contracts and P is the price in dollars. Kalshi rounds the result up to $0.0001 for direct members. For accounts held through an FCM (futures commission merchant), it rounds up to the cent. Some series scale the fee with a multiplier. On most series a resting order that fills later pays nothing. Series with maker fees charge a resting order a quarter of the taker rate, or half on some combos.
The cost of a quick round trip
Say you buy 250 YES at the 49c ask and sell them straight back at the 47c bid. You lose the spread plus a taker fee each way.
On 250 contracts that is about $13.73 for a position that went nowhere. The bid would have to climb from 47c to about 52.5c before selling at the bid got your money back.
The same spread at different prices
A 2c spread costs one point of implied probability at any price. As a share of what you pay, though, it changes a lot.
| Bid | Ask | Midpoint | Ask above midpoint | As a share of the midpoint |
|---|---|---|---|---|
| 47c | 49c | 48c | 1c | 2.1% |
| 5c | 7c | 6c | 1c | 16.7% |
| 92c | 94c | 93c | 1c | 1.1% |
Suppose you estimate the 6c contract at 8%. Against the midpoint that looks like a 2c edge. At the 7c ask you give up 1c of it. The taker fee at 7c takes another 0.46c. That leaves about 0.54c. The expected value guide runs this calculation in full.
Tick size sets the floor
A spread can never be narrower than one tick: the smallest price step a market allows. Whole-cent prices are valid on every Kalshi market, so on a whole-cent grid 1c is as tight as a spread gets. Kalshi's API documentation also lists grids with finer steps near the ends of the range, such as tenths of a cent below 10c and above 90c. Out there, one cent is a large share of the price. Each market's price_ranges field gives its exact grid.
Depth and the price of a large order
The best ask holds only so many contracts. A bigger order fills that level first, then moves on to the next price. It keeps going until it is complete or reaches its limit. Kalshi's help center gives a simple case. With 500 contracts offered at 10c and more at 12c, a 1,000-contract Quick Order buys 500 at each price, for an average of 11c. The order panel shows that average before you submit.
In the sample book, a YES buy that has to fill at once runs up the offers like this. Fees are the taker fee at each level, before Kalshi's small rounding adjustment.
| Contracts bought | Prices reached | Average price | Taker fees | All-in per contract | Break-even chance |
|---|---|---|---|---|---|
| 100 | 49c | 49.00c | $1.75 | 50.75c | 50.75% |
| 650 | 49c and 50c | 49.62c | $11.37 | 51.37c | 51.37% |
| 1,000 | 49c to 51c | 50.10c | $17.50 | 51.85c | 51.85% |
| 2,000 | 49c to 52c | 50.78c | $34.98 | 52.52c | 52.52% |
Nearly all of the extra cost of size comes from the book. The fee per contract stays close to 1.75c across these levels, because near 50c it hardly changes with price. The average price climbs with every level you reach.
The midpoint of this book says 48%. A 1,000-contract buy needs 51.85% to break even. If your estimate sits between those two numbers, the trade looks positive at the midpoint and is negative at the size you want. Expected value and Kelly sizing both depend on the price you enter. So the Kelly and EV calculator gives a usable answer only when that price is the average fill for your size. The fee calculator prices the fee at each level.
Where a new order lands in the book
Kalshi matches orders by price first and time second (Rule 5.9). A better price always trades first. At the same price, the oldest order trades first. Every order fills at its limit price or better. Any part that cannot fill rests in the book at its limit (Rule 5.10), unless it was sent as immediate-or-cancel or fill-or-kill.
Against the sample book, a buy order for YES can land in one of four places.
| Your YES buy limit | What happens | Fee on the fill |
|---|---|---|
| 49c or higher | Fills at once against the offers at 49c and up to your limit. Any remainder rests at your price. | Taker fee |
| 48c | Rests alone as the new best bid. The spread narrows to 1c. | Maker fee, $0 on most series |
| 47c | Joins the best bid, behind the 300 contracts already there | Maker fee, $0 on most series |
| 46c or lower | Rests deeper in the book, behind every better bid | Maker fee, $0 on most series |
A bid at 48c is first in line. But it fills only when a seller comes down to 48c, and the book can move away first. A bid at 47c waits behind 300 contracts. Kalshi calls that count the order's queue position: the number of contracts that must trade before yours fills. The guide to Kalshi limit orders covers queue position, post-only orders and how long an order rests. To close a position, a sale runs the same steps against the bids. The guide to selling before settlement works through it.
How to judge liquidity on Kalshi
Kalshi describes liquidity as how much order supply a market has. For a trader, a liquid market is one where you can trade your size close to the midpoint. Six checks cover it.
- The spread. 1c on a whole-cent market is as tight as it gets. A wide spread leaves a range of prices where nobody is quoting.
- Size at the top. Compare the contracts at the best bid and best ask with the size you want. The API reports them as
yes_bid_size_fpandyes_ask_size_fp. - Depth near the top. Add up what rests within 2c or 3c of the best prices. That is roughly what you can trade before the price moves against you.
- Both sides. A market with no NO bids has no YES ask. You can rest a YES bid there, but you cannot buy YES at once.
- Recent volume.
volume_24h_fpcounts contracts traded in the past day. It tells you trading happened. It says nothing about what is resting now. - The age of the last trade. The last price is the most recent YES trade, however long ago it printed.
GET /markets/tradeslists each trade with its time and the taker's side.
The book you see can change before your order arrives. Canceling a resting order is free, so a level can disappear in the time it takes to send. Rewards also shape the book in some markets. Kalshi's Liquidity Incentive Program pays eligible members for resting orders close to the top of the book. It covers markets with an active reward period and pays whether or not those orders fill. It scores the book from snapshots taken once a second. Its current terms run to January 1, 2027 and exclude FCM customers.
The same checks apply to any market, from a Fed decision on the economics page to a game on the sports page.
Reading the order book through the API
GET /markets/{ticker}/orderbook returns the book for one market. Kalshi's documentation says it needs no authentication. The response holds two arrays of bids, yes_dollars and no_dollars. Each level is a price and a size, both strings, such as ["0.4700", "300.00"]. Prices carry up to four decimals and sizes two, because some markets trade in fractions of a cent and in fractional contracts.
The response has no asks. You build them from the other side, so the best YES ask is $1 minus the best NO bid. Kalshi's orderbook guide shows each array sorted from low to high, with the best bid last. The endpoint reference describes levels from best to worst. Code that takes the highest price in each array works either way. An optional depth parameter limits the levels returned. GET /markets/orderbooks fetches up to 100 markets in one call.
The sample book, as the API would return it:
{
"orderbook_fp": {
"yes_dollars": [["0.4300", "2000.00"], ["0.4400", "500.00"], ["0.4500", "1200.00"],
["0.4600", "800.00"], ["0.4700", "300.00"]],
"no_dollars": [["0.4700", "600.00"], ["0.4800", "1500.00"], ["0.4900", "900.00"],
["0.5000", "400.00"], ["0.5100", "250.00"]]
}
}
A short Python reader finds the top of the book and prices a YES buy across levels.
from decimal import Decimal
import requests
BASE = "https://external-api.kalshi.com/trade-api/v2"
ticker = "TICKER-FROM-GET-MARKETS"
book = requests.get(f"{BASE}/markets/{ticker}/orderbook").json()["orderbook_fp"]
def levels(side):
"""Bids on one side as (price, size), best price first."""
rows = book.get(side) or []
return sorted(((Decimal(p), Decimal(n)) for p, n in rows), reverse=True)
yes_bids, no_bids = levels("yes_dollars"), levels("no_dollars")
best_bid = yes_bids[0][0] if yes_bids else None
best_ask = 1 - no_bids[0][0] if no_bids else None
def buy_yes_now(contracts):
"""Walk the YES offers (the NO bids). Returns contracts filled and dollars spent."""
left, spent = Decimal(contracts), Decimal(0)
for no_price, size in no_bids:
take = min(left, size)
spent += (1 - no_price) * take
left -= take
if left == 0:
break
return Decimal(contracts) - left, spent
On the sample book, buy_yes_now(1000) returns 1,000 contracts for $501.00. That matches the depth table. For just the top of the book, GET /markets/{ticker} carries yes_bid_dollars, yes_ask_dollars and the sizes behind them.
For a live book, the orderbook_delta WebSocket channel sends an orderbook_snapshot and then a delta each time a level changes. It needs an authenticated connection. Every message carries a seq number, so a gap in the sequence means a missed message. By default the channel reports NO-side levels in NO prices. Pass use_yes_price: true when you subscribe to put both sides on the YES scale. The Kalshi API guide covers keys and request signing.
Questions traders ask
How do you read the order book on Kalshi?
Start in the middle, at the best bid and the best ask. The best bid is the highest price anyone will pay for YES. The best ask is the lowest price anyone will sell it for. The gap between them is the spread. The levels behind each side show how many contracts you can trade, and at what prices, before the price moves.
What is the bid-ask spread on Kalshi?
The spread is the best ask minus the best bid. With YES bid at 47c and offered at 49c, the spread is 2c. A buyer pays 1c above the 48c midpoint and a seller gets 1c below it, before the taker fee. On a market priced in whole cents, the tightest possible spread is 1c.
Is buying NO the same as selling YES on Kalshi?
Yes. Kalshi's help center says there is no difference between the two, and the API records both as the same direction. A NO bid at 51c is the same order as an offer to sell YES at 49c. Either way, the position pays if the event does not happen.
Why does the Kalshi API order book only show bids?
Every ask already appears as a bid on the other side. A YES bid at X is a NO ask at $1 minus X. To find the best YES ask, subtract the highest NO bid from $1. Kalshi's documentation says showing bids only gives the complete book without listing each order twice.
How can I tell if a Kalshi market is liquid?
Check three things: the spread, the contracts at the best bid and ask, and the depth within a few cents of them. Then compare all three with the size you want. Recent volume and the time of the last trade add context. A market can trade heavily during the day and still hold little at the moment you want to trade.
Why did I pay more than the price on the screen?
Your order was larger than the size at the best ask, or the book moved before it arrived. A large order fills level by level, so its average price sits above the best ask. The taker fee adds more. For a Quick Order, Kalshi's order panel shows the average price before you submit.
Sources
- Kalshi Help Center, The Orderbook (accessed Oct 19, 2026)
- Kalshi Help Center, Buying Yes vs Selling No (accessed Oct 19, 2026)
- Kalshi Help Center, Quick Orders (filling across price levels) (accessed Oct 19, 2026)
- Kalshi Help Center, Limit Orders (accessed Oct 19, 2026)
- Kalshi Help Center, Fees (maker fees and canceled orders) (accessed Oct 19, 2026)
- Kalshi Help Center, Who are you trading with (accessed Oct 19, 2026)
- Kalshi Help Center, Liquidity Incentive Program (accessed Oct 19, 2026)
- Kalshi News, Makers and Takers, December 1, 2022 (definitions of resting order and liquidity) (accessed Oct 19, 2026)
- Kalshi News, Glossary: Spread, August 5, 2022 (spreads and liquidity) (accessed Oct 19, 2026)
- Kalshi, Fee Schedule, July 7, 2026 update (general trading fee formula) (accessed Oct 19, 2026)
- Kalshi API documentation, Fee Rounding (accessed Oct 19, 2026)
- KalshiEX LLC Rulebook, Version 1.29, Rules 5.7, 5.9, 5.10, 5.11 and 5.15 (accessed Oct 19, 2026)
- Kalshi API documentation, Orderbook Responses (accessed Oct 19, 2026)
- Kalshi API documentation, Get Market Orderbook (depth parameter) (accessed Oct 19, 2026)
- Kalshi API documentation, Get Multiple Market Orderbooks (accessed Oct 19, 2026)
- Kalshi API documentation, Get Market (bid, ask, size, volume and last price fields) (accessed Oct 19, 2026)
- Kalshi API documentation, Get Trades (accessed Oct 19, 2026)
- Kalshi API documentation, Order direction (outcome_side, book_side and use_yes_price) (accessed Oct 19, 2026)
- Kalshi API documentation, Fixed-Point Representation (price grids and tick sizes) (accessed Oct 19, 2026)
- Kalshi API documentation, Get Series (fee_type and the maker fee rate) (accessed Oct 19, 2026)
- Kalshi API documentation, Create Order (time_in_force values) (accessed Oct 19, 2026)
- Kalshi API documentation, Get Order Queue Position (accessed Oct 19, 2026)
- Kalshi API documentation, WebSocket Orderbook Updates (accessed Oct 19, 2026)