Search "Kalshi bot" and you'll find a lot of code: repositories that poll the 15-minute markets, bots for sale, and threads about a friend of a friend who's printing money. Most of the ideas come down to three trades. Before you run one, here's what each of them would have done on Kalshi's Bitcoin 15-minute markets from Aug. 29 to Sept. 27, 2026, fills and fees included.
First, what every bot is up against
The price is fair. Across 2,764 graded windows, every 10-cent price band won within about one point of its price: 8.1¢ contracts won 8.6% of the time, 46.2¢ won 45.8%, 91.9¢ won 91.4% (the full test). There's no lazy mispricing to scoop up.
The fee is at the fill, win or lose. Kalshi's taker fee is 7% × price × (1 − price) per contract:
| Contract price | Taker fee per contract | As a share of the price |
|---|---|---|
| 50¢ | 1.75¢ | 3.5% |
| 90¢ | 0.63¢ | 0.7% |
| 97¢ | about 0.20¢ | 0.2% |
Trade in and out of a window and you pay it twice. Run any size through the Kalshi fee calculator.
The spread is real. With five minutes left in a window, the Bitcoin book's median spread was 1¢. A bot that crosses it to get filled gives that up on every trade, before the fee.
Bot 1: buy the late favorite
The idea: with a minute or two left, the side priced 95¢ or more almost always wins. Buy it, collect the few cents.
What happened: we took every window where the favorite's midpoint was 95–99¢ closest to 90 seconds before the close, and bought it at the ask.
| Result | |
|---|---|
| Windows | 807 |
| Won | 97.8%, at an average midpoint of 97.8¢ |
| Per contract, before fees | −0.07¢ |
| Per contract, after fees | −0.22¢ |
It won almost every time and still lost. The favorite wins about as often as its midpoint says, so paying the ask on top of that is a small loss, and the fee makes it a bigger one. It also means sitting in the final minute, when the 60-second settlement average is mostly locked in and the fastest traders are repricing faster than any retail bot can.
Bot 2: trade a fair-value model
The idea: estimate the true odds from where Bitcoin sits against the target, how much time is left and how fast it's moving, then buy whichever side the model says is cheap.
What happened: our own Bitcoin 15-minute model does exactly that. We took its reading with five minutes left in each window and traded whenever it disagreed with the market's midpoint by more than 3 points, taking the ask or the bid.
| Result | |
|---|---|
| Windows graded | 2,710 |
| Trades (model vs. price gap above 3 points) | 1,571 |
| Per contract, before fees | −0.30¢ |
| Per contract, after fees | −1.36¢ |
| Brier score, market price | 0.1269 |
| Brier score, model | 0.1326 (worse) |
The market's own price was the better forecast (a lower Brier score is better), so trading against it lost money before the fee did anything. A better model could do better. But the bar isn't "beat a coin flip." It's "beat a price that is already fair, by more than the fee and the spread."
Bot 3: arbitrage another venue
The idea: Polymarket also lists 15-minute Bitcoin markets. When the two prices disagree, buy "up" on one and "down" on the other and lock in the gap.
What happened: Polymarket's international venue settles on a Chainlink 60-second average, not the CF Benchmarks index Kalshi uses. Across 663 identical windows from Sept. 21 to Sept. 27, 2026, the two settled opposite ways four times. Every one was a window Kalshi's settle decided by $5.10 or less: 3 of the 30 windows decided by under $5 split between the venues (the same-window test). On a split, both legs of your "arbitrage" can lose. Polymarket US settles on the same index as Kalshi, but it's a separate order book that publishes no volume, so the depth to fill both legs isn't there to measure.
If you build one anyway
- Read by series, not the whole exchange.
GET /trade-api/v2/markets?series_ticker=KXBTC15M&status=openreturns the open window. Querying every open market returns thousands of rows you don't want. - Know the fields.
floor_strikeis the target, locked at the open.close_timeis the close. On settled markets,resultandexpiration_valuetell you what happened. Event tickers end in the Eastern close time:KXBTC15M-26SEP271945closes at 7:45 PM ET. - Go easy on the API. Kalshi drops some 15-minute reads under heavy parallel load. Read a few series at a time and retry.
- Price the fee into every signal, at the price you'll actually fill, and count it twice if you'll exit early.
- Grade yourself on profit, not win rate. Bot 1 won 97.8% of the time and lost money.
- Size small. The Kelly calculator will tell you that with no edge, the right size is zero.
Every series has a ticker-named page with the same builder notes, starting with Ethereum (KXETH15M), all on the Kalshi 15-minute markets board. How the 15-minute contract stacks up against Kalshi's hourly, daily and perp clocks: which Kalshi clock fits your view.
