An AI trading bot for Kalshi, written in plain English

Windmill turns a Kalshi strategy you describe in plain English into an AI agent that trades it on a schedule. The model reads the markets and decides; the limits you set are enforced in code, and agents trade on paper unless you build them live.

Start paper trading, free

From a sentence to an agent

You describe your idea to the builder, a chat. It asks only for what has to come from you: the idea, how much money the agent manages, and the most a single order may spend. It looks up the Kalshi series for the markets you name, writes the strategy out in full for the model that will run it, picks a schedule that fits the market, and shows the draft on a card. Nothing runs until you deploy it from that card.

Here is one of the agents from our own paper test. Its strategy, in one sentence: in the 8th inning or later of a live MLB game, buy 5 contracts of the team leading by at least two runs if its price is between 80¢ and 96¢, after checking MLB's own live feed. It could enter only Kalshi's MLB game markets, only markets closing within a day, and at most three new orders a run. It was one of about 90 strategies we tested, and as the last section of this page says, none of them found an edge that held up.

Below is one of its runs on paper, on August 31, 2026, step by step as the dashboard shows it, with the longer replies cut down to the one game. The agent recorded its reasoning, read the live score (Giants 6, Braves 3, top of the 9th), found the game's market, read the order book and bought 5 contracts with a limit of 98¢. The order filled at 96¢, the best ask, and paid a 2¢ fee. Open a step to see what the agent sent and what came back.

step 1reasoning

I will follow the fixed late-game MLB leader strategy using the authoritative StatsAPI feed first. I will only consider in-progress games in the 8th inning or later with a leader by at least two runs, then match an active KXMLBGAME market and verify its order book and ask is 80–96¢. With no positions or resting orders, any qualifying entry will be exactly 5 contracts, capped at two cents above the displayed ask; otherwise I will remain flat. Risk is limited to the fixed small stake and the remaining game time must be consistent with holding to settlement.

step 2tool125 ms
fetch_url{"url":"https://statsapi.mlb.com/api/v1/schedule?sportId=1&hydrate=linescore&fields=dates,games,gamePk,gameDate,status,detailedState,teams,away,home,score,team,…
args
{
  "url": "https://statsapi.mlb.com/api/v1/schedule?sportId=1&hydrate=linescore&fields=dates,games,gamePk,gameDate,status,detailedState,teams,away,home,score,team,name,linescore,currentInning,inningState,outs"
}

result
{
  "url": "https://statsapi.mlb.com/api/v1/schedule?sportId=1&hydrate=linescore&fields=dates,games,gamePk,gameDate,status,detailedState,teams,away,home,score,team,name,linescore,currentInning,inningState,outs",
  "status": 200,
  "contentType": "application/json;charset=UTF-8",
  "fetchedAt": "2026-09-01T00:17:10.878Z",
  "truncated": false,
  "body": "{\"dates\":[{\"games\":[{\"gamePk\":824911,\"gameDate\":\"2026-08-31T22:05:00Z\",\"status\":{\"detailedState\":\"In Progress\"},\"teams\":{\"away\":{\"team\":{\"name\":\"San Francisco Giants\"},\"score\":6},\"home\":{\"team\":{\"name\":\"Atlanta Braves\"},\"score\":3}},\"linescore\":{\"currentInning\":9,\"inningState\":\"Top\",\"teams\":{\"home\":{},\"away\":{}},\"outs\":1}}]}]}"
}
step 2tool19 ms
get_markets{"limit":10,"series":"KXMLBGAME"}
args
{
  "limit": 10,
  "series": "KXMLBGAME"
}

result
{
  "columns": [
    "id",
    "strike",
    "bid",
    "ask",
    "last",
    "vol"
  ],
  "events": [
    {
      "sub": "SF vs ATL (Aug 31)",
      "event": "KXMLBGAME-26AUG311805SFATL",
      "title": "San Francisco vs Atlanta",
      "vol24": 3987846,
      "closes": "2026-09-01T01:05Z",
      "series": "KXMLBGAME",
      "markets": [
        [
          "KXMLBGAME-26AUG311805SFATL-SF",
          "San Francisco",
          95,
          96,
          95,
          1630543
        ],
        [
          "KXMLBGAME-26AUG311805SFATL-ATL",
          "Atlanta",
          4,
          5,
          5,
          2579431
        ]
      ],
      "category": "Sports"
    }
  ]
}
step 3tool26 ms
get_market{"market_id":"KXMLBGAME-26AUG311805SFATL-SF"}
args
{
  "market_id": "KXMLBGAME-26AUG311805SFATL-SF"
}

result
{
  "id": "KXMLBGAME-26AUG311805SFATL-SF",
  "ask": 96,
  "bid": 95,
  "fees": {
    "maker": 1,
    "taker": 1
  },
  "last": 95,
  "ticks": [
    {
      "to": 100,
      "from": 0,
      "step": 1
    }
  ],
  "title": "San Francisco wins",
  "closes": "2026-09-01T01:05Z",
  "result": null,
  "series": "KXMLBGAME",
  "status": "active",
  "settlement": null
}
step 3tool30 ms
get_orderbook{"depth":6,"market_id":"KXMLBGAME-26AUG311805SFATL-SF"}
args
{
  "depth": 6,
  "market_id": "KXMLBGAME-26AUG311805SFATL-SF"
}

result
{
  "asks": [
    [
      96,
      3375
    ],
    [
      97,
      31603
    ],
    [
      98,
      22956
    ],
    [
      99,
      19883
    ]
  ],
  "bids": [
    [
      95,
      36091
    ],
    [
      94,
      29887
    ],
    [
      93,
      617
    ],
    [
      92,
      6
    ],
    [
      91,
      6
    ],
    [
      90,
      5
    ]
  ],
  "more": {
    "asks": 0,
    "bids": 45
  },
  "columns": [
    "price",
    "count"
  ]
}
step 4tool124 ms
place_order{"side":"yes","count":5,"limit":98,"action":"buy","market_id":"KXMLBGAME-26AUG311805SFATL-SF"}
args
{
  "side": "yes",
  "count": 5,
  "limit": 98,
  "action": "buy",
  "market_id": "KXMLBGAME-26AUG311805SFATL-SF"
}

result
{
  "fee": 2,
  "fills": [
    [
      96,
      5,
      2
    ]
  ],
  "filled": 5,
  "status": "filled",
  "resting": 0,
  "order_id": "3642",
  "fillColumns": [
    "price",
    "count",
    "fee"
  ]
}

What the model does and what code enforces

An agent is a language model with a set of tools. On each run it reads and decides: which markets to look at, what the data or the news says, whether to trade, at what price and how many contracts. It can search Kalshi's markets, read a market, its order book and its price history, read its own cash, positions and orders, search the web, fetch public web pages, and place and cancel limit orders.

The model never handles the money itself. Every order it places passes checks written in code first, and an order that breaks one is refused, with the rule it broke, before it reaches the paper book or Kalshi. The model reads the refusal and can try again inside the rules.

  • Allocation. The money the agent manages, set when you build it. A buy is refused if paying for it, or setting cash aside for the part that rests in the book, would take the agent's cash below zero.
  • Largest order. The most one order may cost, contracts times limit price, also set when you build it. It applies to buys and sells alike.
  • Stop loss, if you set one. Before each run, if the agent's equity has fallen below its allocation less the percentage you chose, the run is skipped and the agent paused. It does not sell what the agent holds.
  • Markets it may enter. The Kalshi series, events or markets the agent may buy in, usually set by the builder. They are checked against the ids Kalshi reports for the market, not the ones the model names.
  • Other optional limits: buy only in markets that close within a number of days, buy only with orders that rest in the book instead of crossing the spread, a cap on new orders per run, a cap on the steps one run may take, and, for a live agent, a cap on buys per day.

The limits on buying never block a sale, so an agent can always sell what it holds, and it can sell only what it holds. A large sale may take more than one order.

Schedules

An agent runs on the schedule you give it: an interval, such as every 30 minutes or every 2 hours, or a cron expression in UTC for runs at set times of day. The shortest schedule allowed is every 10 minutes; one that fires more often is rejected. You can also start a run by hand.

Every run counts against your account's run budget over a rolling 24 hours, shared by all your agents, and runs you start by hand count the same as scheduled ones. The pricing page lists each plan's budget.

Windmill is not built for speed. An agent wakes at most every 10 minutes, so a strategy that has to react within seconds or minutes is a poor fit.

Every run on the record

Each run keeps its transcript: the reasoning the agent recorded, every tool it called with what it sent and what came back, and the orders it placed with their fills, prices and fees. Orders the limits refused are counted by rule. The run ends with the agent's own short report, and a run that was skipped says why, such as a spent run budget or a stop loss.

You can pause an agent at any time. Its runs stay on the record.

Paper first, live with your own Kalshi API key

Agents trade on paper unless you build them as live agents. Paper orders fill against Kalshi's live order book at the prices and sizes resting there, pay Kalshi's fees and settle when the real market settles. How paper trading works.

To trade real money, connect your own Kalshi API key on the dashboard. Every plan can, the free one included. A live agent trades on your Kalshi account inside the same limits, plus an optional cap on buys per day, and your money stays on Kalshi. Windmill stores the key encrypted. An agent stays paper or live for its whole life, so going live means building a live agent.

Will it make money?

We can't promise that it will, and our own test says it is hard. From August 27 to September 6, 2026, we ran about 90 strategies on paper: 4,200 settled bets in all.

  • No strategy showed an edge that held up as its sample grew. The early leaders drifted back toward zero.
  • The five results that were statistically significant were all losses.
  • Our conclusion: Kalshi's liquid markets are priced efficiently to within the fees, against price patterns, order-book structure, the public sources markets settle on, and an AI model's judgment layered on any of them.

What an agent gives you is a cheap, honest way to find out whether your strategy holds up: on paper, against the real order book, with the real fees, before you risk money. Read the full results of the 90-strategy test.

Questions

Which AI models does it use?
Free accounts run every agent on the default model. Pro lets you choose the model for each agent from the ones we serve, and change it later. The pricing page lists them.
What does it cost?
Paper trading is free, and signing up needs no card. The pricing page lists how many agent runs a day the free plan includes and what Pro adds. A live agent's orders pay Kalshi's fees on your Kalshi account, as any Kalshi order does.
Can I use it on a phone?
Yes. You can build an agent, deploy it and follow its runs from a phone.
Do I need to know how to code?
No. You describe the strategy in plain English. The builder writes it out for the model that runs the agent and asks about anything it still needs.
Do I need a Kalshi account?
Not to paper trade: that needs only a Windmill account. To trade live, you need a Kalshi account and an API key from it, which you connect on the dashboard.

Start paper trading, free