Kalshi Prediction Markets Scraper: prices, volume, order book avatar

Kalshi Prediction Markets Scraper: prices, volume, order book

Pricing

from $0.005 / actor start

Go to Apify Store
Kalshi Prediction Markets Scraper: prices, volume, order book

Kalshi Prediction Markets Scraper: prices, volume, order book

Scrape live and settled Kalshi prediction markets from the public trading API: yes/no prices, top of the order book, volume, open interest, close and settlement times, and the result.

Pricing

from $0.005 / actor start

Rating

0.0

(0)

Developer

Michal Pšenčík

Michal Pšenčík

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Kalshi Prediction Markets Scraper (prices, order book, settlements)

What does Kalshi Prediction Markets Scraper do?

This Actor reads Kalshi prediction markets straight from the exchange's public trading API (docs.kalshi.com). For every market it returns the ticker, the question, the Kalshi category, the yes and no bid/ask in dollars, the top of the order book with sizes on both sides, traded volume, 24-hour volume, open interest, the open and close times, the expiration times, and the result once the market settles.

Filter by category (weather, sports, economics, politics and more), by a single series such as KXHIGHNY, and by status (open, settled, or everything). Because it runs on the Apify platform you get a REST API for the results, scheduled runs, run monitoring, and integrations with Google Sheets, Zapier, Make, Slack and the rest.

Try it from the Input tab: leave everything at its default and hit Start to get 100 markets that are trading right now.

Why use Kalshi Prediction Markets Scraper?

  • No API key, no account. Kalshi's read endpoints are open, and this Actor uses only those. You never hand over a trading credential to run it.
  • Both sides of the book. Most Kalshi datasets stop at the last traded price. This one carries the best bid and best ask with resting size on the yes side and the no side, which is what tells you whether a quoted price is real or a one-lot.
  • Settlement history. Set Market status to Settled and every item carries result (yes, no, or scalar) alongside the final volume and open interest, so you can backtest a model against outcomes.
  • The event context, not just the ticker. Kalshi's own /markets feed publishes no category and no readable event title. This Actor sweeps events instead, so every market arrives with its category, its event title and its series ticker attached.
  • Cross-market research. One run pulls weather, sports, economics, politics, crypto and company markets in the same schema, ready for a spreadsheet, a dashboard or a Polymarket comparison.

How to use Kalshi Prediction Markets Scraper

  1. Click Try for free (or open the Actor in Apify Console).
  2. On the Input tab, pick a Category. The default returns every category.
  3. Optionally type a Series ticker such as KXHIGHNY to pin the run to one recurring question.
  4. Pick a Market status. Open is the default and returns markets that are trading now.
  5. Set Maximum results. The default is 100 markets. 0 means no limit, and Kalshi lists over 100,000 markets.
  6. Click Start. A default run takes about 15 seconds.
  7. Open the Output tab (or Storage → Dataset) and export as JSON, CSV, Excel or HTML, or pull it through the Apify API.

To keep the data fresh, use Schedules in Apify Console to run the Actor every few minutes against a single series, or once a day for a full category sweep.

Input

All fields are optional; the defaults return 100 open markets across every category.

FieldTypeDefaultDescription
categorystringallOne of all, weather, sports, economics, politics, crypto, companies, entertainment, world.
seriesTickerstringemptyRestrict the run to one Kalshi series, e.g. KXHIGHNY. Applied on top of the category filter.
statusstringopenOne of open, settled, all. all returns open markets first, then settled, closed, and not-yet-open ones.
maxItemsinteger100Stop after this many markets. 0 means no limit.
includeOrderBookbooleantrueFetch the best bid and ask with sizes on both sides. Costs one extra API request per open market. Turn it off for a price-and-volume-only run.

economics covers Kalshi's Economics, Financials and Commodities categories. politics covers Politics and Elections. The category field in the output always carries Kalshi's own category name.

Example input:

{
"category": "weather",
"status": "open",
"maxItems": 100,
"includeOrderBook": true
}

Output

Each market is one dataset item. Download the dataset in various formats such as JSON, HTML, CSV, or Excel.

An open market, from a run with seriesTicker: KXHIGHNY:

{
"ticker": "KXHIGHNY-26SEP03-T83",
"eventTicker": "KXHIGHNY-26SEP03",
"seriesTicker": "KXHIGHNY",
"title": "Will the maximum temperature be <83° on Sep 3, 2026?",
"eventTitle": "Highest temperature in New York City on Sep 3, 2026?",
"subtitle": "82° or below",
"category": "Climate and Weather",
"status": "open",
"rawStatus": "active",
"marketType": "binary",
"strikeType": "less",
"yesBid": 0.6,
"yesAsk": 0.62,
"noBid": 0.38,
"noAsk": 0.4,
"lastPrice": 0.62,
"previousPrice": 0.33,
"orderBook": {
"yesBid": { "price": 0.6, "size": 1 },
"yesAsk": { "price": 0.62, "size": 111.75 },
"noBid": { "price": 0.38, "size": 111.75 },
"noAsk": { "price": 0.4, "size": 1 }
},
"volume": 21066.03,
"volume24h": 19396.48,
"openInterest": 11701.29,
"liquidity": 0,
"openTime": "2026-09-02T14:00:00Z",
"closeTime": "2026-09-04T05:00:00Z",
"expectedExpirationTime": "2026-09-04T19:00:00Z",
"expirationTime": "2026-09-10T14:00:00Z",
"result": null,
"rules": "If the maximum temperature recorded at New York City (CLINYC) for Sep 3, 2026, is less than 83° fahrenheit according to The Weather Company, then the market resolves to Yes.",
"seriesUrl": "https://kalshi.com/markets/kxhighny",
"apiUrl": "https://api.elections.kalshi.com/trade-api/v2/markets/KXHIGHNY-26SEP03-T83",
"scrapedAt": "2026-09-03T16:59:04.369Z"
}

A settled market carries its result. Settled markets have no resting orders, so orderBook is null and the bid/ask fields fall back to Kalshi's 0 and 1 placeholders:

{
"ticker": "KXHURRICANENAMES-26DEC01EPAC-FAU",
"eventTicker": "KXHURRICANENAMES-26DEC01EPAC",
"seriesTicker": "KXHURRICANENAMES",
"title": "Will Fausto be categorized as a hurricane in the Eastern Pacific in 2026?",
"eventTitle": "What named storms will be hurricanes in the Eastern Pacific this year?",
"subtitle": "Fausto",
"category": "Climate and Weather",
"status": "settled",
"rawStatus": "finalized",
"marketType": "binary",
"strikeType": "custom",
"yesBid": 0,
"yesAsk": 1,
"noBid": 0,
"noAsk": 1,
"lastPrice": 0.99,
"previousPrice": 0.99,
"orderBook": null,
"volume": 1001.29,
"volume24h": 0,
"openInterest": 780.54,
"liquidity": 0,
"openTime": "2026-05-15T22:00:00Z",
"closeTime": "2026-07-29T14:46:04Z",
"expectedExpirationTime": "2026-12-01T15:00:00Z",
"expirationTime": "2026-12-08T15:00:00Z",
"result": "yes",
"rules": "If a storm named Fausto is a storm categorized as a hurricane in the Eastern Pacific between May 15, 2026 and December 01, 2026, then the market resolves to Yes.",
"seriesUrl": "https://kalshi.com/markets/kxhurricanenames",
"apiUrl": "https://api.elections.kalshi.com/trade-api/v2/markets/KXHURRICANENAMES-26DEC01EPAC-FAU",
"scrapedAt": "2026-09-03T16:58:59.592Z"
}

With includeOrderBook: false the shape is identical and orderBook is null, which halves the run time:

{
"ticker": "KXWCCAREERGOALS-KMBAPPE-30",
"eventTicker": "KXWCCAREERGOALS-KMBAPPE",
"seriesTicker": "KXWCCAREERGOALS",
"title": "Will Kylian Mbappe score at least 30 goals in the World Cup in his career?",
"eventTitle": "Kylian Mbappe Total FIFA World Cup Career Goals",
"subtitle": "30+ Goals Scored",
"category": "Sports",
"status": "open",
"rawStatus": "active",
"marketType": "binary",
"strikeType": "structured",
"yesBid": 0.8,
"yesAsk": 0.83,
"noBid": 0.17,
"noAsk": 0.2,
"lastPrice": 0.8,
"previousPrice": 0.8,
"orderBook": null,
"volume": 687.03,
"volume24h": 3,
"openInterest": 231.36,
"liquidity": 0,
"openTime": "2026-07-20T23:52:00Z",
"closeTime": "2043-07-28T14:00:00Z",
"expectedExpirationTime": "2043-07-21T14:00:00Z",
"expirationTime": "2043-07-28T14:00:00Z",
"result": null,
"rules": "If Kylian Mbappe scores at least 30 goals in FIFA World Cup Tournament games during his career, then the market resolves to Yes.",
"seriesUrl": "https://kalshi.com/markets/kxwccareergoals",
"apiUrl": "https://api.elections.kalshi.com/trade-api/v2/markets/KXWCCAREERGOALS-KMBAPPE-30",
"scrapedAt": "2026-09-03T16:59:09.103Z"
}

Data fields

All prices are in dollars per contract, where a contract settles at $1.00. 0.62 is 62 cents, or a 62% implied probability.

FieldTypeDescription
tickerstringKalshi's market ticker. Stable across runs, so use it as your primary key.
eventTickerstringThe event this market belongs to. One event usually holds several strike markets.
seriesTickerstring | nullThe recurring series, e.g. KXHIGHNY. Use it as the seriesTicker input to pin a run.
titlestring | nullThe market's own question, including its strike.
eventTitlestring | nullThe event's question, without the strike.
subtitlestring | nullWhat a Yes contract means, e.g. 82° or below.
categorystring | nullKalshi's category, e.g. Climate and Weather, Sports, Elections.
statusstringunopened, open, closed, determined, settled, inactive, or other.
rawStatusstringKalshi's own status string, e.g. active, finalized.
marketTypestring | nullUsually binary.
strikeTypestring | nullgreater, less, between, custom, structured. Empty on plain yes/no markets.
yesBid, yesAsknumber | nullBest bid and ask for a Yes contract, in dollars.
noBid, noAsknumber | nullBest bid and ask for a No contract, in dollars.
lastPricenumber | nullLast traded price.
previousPricenumber | nullKalshi's previous reference price.
orderBookobject | nullyesBid, yesAsk, noBid, noAsk, each with price and size. null for markets that are not trading.
volumenumber | nullContracts traded over the market's life.
volume24hnumber | nullContracts traded in the last 24 hours.
openInterestnumber | nullContracts currently outstanding.
liquiditynumber | nullKalshi's liquidity figure in dollars.
openTimestring | nullWhen the market opened, ISO 8601 in UTC.
closeTimestring | nullLast trading time.
expectedExpirationTimestring | nullWhen Kalshi expects to settle.
expirationTimestring | nullThe latest possible settlement time.
resultstring | nullyes, no or scalar once settled. null while the market is still live.
rulesstring | nullKalshi's primary settlement rule, in full.
seriesUrlstring | nullLink to the series page on kalshi.com.
apiUrlstringLink to this market on Kalshi's public API.
scrapedAtstringWhen this run read the API, ISO 8601 in UTC.

How much does it cost to scrape Kalshi markets?

This Actor uses pay per event pricing: $0.002 per market returned, plus $0.005 per run start. Platform usage is included, so those two numbers are the whole bill.

The default run returns 100 markets and costs $0.205. A single weather series such as KXHIGHNY holds about a dozen open markets, so one run against it costs $0.029 and a five-minute schedule is a little over $8 a day. The Apify free plan comes with $5 of monthly platform credit, which is enough to try the Actor and run it for a while.

To cap spending on a single run, set maxItems, or set a maximum cost in the run options.

Tips and advanced options

  • Pin a series for live tracking. seriesTicker plus a small maxItems is the cheapest way to watch one question. KXHIGHNY is the New York high temperature, KXNFLGAME is NFL games, KXHURRICANENAMES is the hurricane season.
  • Backtest against settlements. status: settled with a category gives you resolved markets with their final result, volume and openInterest. Order books are not fetched for them, so those runs are fast.
  • Read the book, not just the price. A market can show yesAsk: 0.62 with one contract behind it. orderBook carries the resting size, so you can drop quotes that are too thin to trade against.
  • Deduplicate across runs. ticker is stable, so upsert on it. A market pulled while open and again after it settled has the same ticker and a filled result the second time.
  • status: all sweeps in a useful order. Open markets first, then settled, closed, and finally the very large pool of markets that have not opened yet, so a capped run fills with tradeable markets first.
  • Combination markets are excluded. Kalshi auto-generates tens of thousands of KXMVECROSSCATEGORY parlay markets that carry no readable question. This Actor reads events rather than the raw market feed, so those never appear in your dataset.

FAQ, disclaimers and support

Does this Actor need a Kalshi API key? No. Kalshi's market data endpoints are public and were verified working without any credential. A key is only needed for account and trading endpoints, which this Actor never touches.

Does it use a proxy? No. Kalshi's API answers plain requests, so no proxy is configured and there is no proxy cost. The Actor paces itself at roughly nine requests a second so it stays inside the exchange's rate limits.

Is scraping Kalshi legal? This Actor reads Kalshi's own documented public API and collects market facts, not personal data. You are responsible for how you use the output, including Kalshi's Developer Agreement and terms. Nothing here is trading or investment advice.

Why do prices sometimes read 0 and 1 on settled markets? That is what Kalshi's API returns once a market stops trading. orderBook is null for those, and lastPrice holds the last real trade.

Why did I get fewer markets than I asked for? Check maxItems, category, seriesTicker and status. A narrow series may simply not have that many markets open. The run log prints the filters it resolved.

Does it cover Polymarket too? No. This Actor is Kalshi only.

Found a bug, or need something else? Open an issue on the Issues tab of this Actor and it will be picked up. Trade history, candlesticks and WebSocket-level updates are all reachable from the same API, so mention it in the issue if you need them.