Kalshi Scraper & API — Odds, Probabilities, Volume avatar

Kalshi Scraper & API — Odds, Probabilities, Volume

Pricing

from $1.05 / 1,000 markets

Go to Apify Store
Kalshi Scraper & API — Odds, Probabilities, Volume

Kalshi Scraper & API — Odds, Probabilities, Volume

Every Kalshi market in one table: implied probability, yes and no price, best bid and ask, 24h move, volume, open interest and close date. Events with all outcomes, minute-level price history and full order books. No API key, no login.

Pricing

from $1.05 / 1,000 markets

Rating

5.0

(2)

Developer

Matvey

Matvey

Maintained by Community

Actor stats

0

Bookmarked

19

Total users

11

Monthly active users

21 hours ago

Last modified

Share

Kalshi Scraper & API turns the whole Kalshi exchange into a table. Every market comes back with the implied probability in per cent, the yes and no price, best bid and ask, the 24-hour move, volume, open interest, the close date and a link — no API key, no login, no browser.

One run of Kalshi Scraper: markets with implied probability, price move, volume and open interest.

Five modes: markets (one row per tradable contract), events (one row per question with every outcome and its probability), search by keyword, price history down to the minute, and the order book with both sides. A run over the active markets takes a few seconds.

What is Kalshi Scraper?

Kalshi is the CFTC-regulated US event exchange: contracts that pay $1 if something happens, on rates, elections, weather, inflation prints, company events and sport. Its price is the crowd's probability, and this Actor reads all of it in one call — for traders, journalists, researchers, dashboards and AI agents that get asked "what are the odds the Fed cuts in September".

What other Kalshi tools get wrong — and what this one does instead

Most Kalshi scrapers return the market list and stop there. That leaves you with four problems this Actor solves in the same run.

One contract per row, when the question has five answers. A race with five candidates arrives as five unrelated rows and you have to stitch them back together. Event mode returns one row for the whole question, with every outcome sorted most likely first, the favourite and its probability already on the row.

Thousands of dead markets. Kalshi lists contracts nobody trades. Without a floor, a keyword search fills with them. minVolume and minOpenInterest are applied before you are billed, so you pay for rows you would keep.

Prices without the depth. A probability of 12% means little if the spread is eight cents wide. Every row carries bestBid, bestAsk and spread, and order-book mode returns both sides level by level.

No history. The current price answers "what are the odds"; it cannot answer "when did that change". History mode returns one row per point, down to one-minute resolution for short windows and up to 90 days back.

What data does it return?

Markets

FieldExample
marketId, seriesTicker, slugKXOAIANTH-40-OAI · KXOAIANTH
question, shortTitle, eventTitleWill OpenAI or Anthropic IPO first? — OpenAI
probability, yesPrice, noPrice6.0 (per cent) · 0.06 · 0.94
bestBid, bestAsk, spread, lastPrice0.05 · 0.07 · 0.02 · 0.06
priceChange24h-0.03 — a move in price, so ±0.03 is three points of probability
volume, volume24h, volume1w, openInterest171,344 · 2,840 · … · 40,639
status, resultopen · empty until it settles
openTime, closeTime, endDateISO 8601
category, tags, marketType, strikeTypeEconomics · binary · greater
outcomes[{name: "Yes", price: 0.06, probability: 6.0}, {name: "No", …}]
rules, urlresolution text · link to the market

Open interest is Kalshi's own depth measure — how many contracts are still live. Kalshi reports a liquidity figure of zero on nearly every market, so this Actor does not show a liquidity column that would always read empty.

Events

One row per question with outcomes sorted most likely first, favourite and favouriteProbability, outcomeCount, total volume and openInterest, and a ready summary sentence. This is the shape for "who will win": one row for the whole race with every candidate and their probability, instead of one contract per candidate.

Price history and order book

History returns one row per point with time, price and probability — a week at hourly resolution by default, one-minute resolution for short windows, up to 90 days. The order book returns both sides with price and size per level.

How much does it cost?

Pay per row, and only for rows you actually get:

EventPrice
Market$0.0015
Event$0.0008
Price point$0.0002
Order book snapshot$0.001

Error rows are never charged. There is no browser and no proxy — one public JSON API — so platform usage on top of that is negligible.

JobCost
500 active markets$0.75
One market with 7 days of hourly price history (≈168 points)$0.034
A daily 200-market snapshot for a month$9.00

Other Kalshi Actors charge $0.001 to $0.01 per market row (one asks $0.10) and most return the market list only. This one is priced inside that range and adds events, history and order books at the same time.

Bulk export: what 50,000 markets actually cost

This Actor is built for bulk jobs — put hundreds of inputs into one run, or call it from the API on a schedule. There is no fee per run, no fee per page and no proxy charge: you pay for the rows you keep, and error rows are free. That is what decides the bill once you pull a whole market rather than a single market.

JobThis ActorMost-used Actor in this category
50,000 markets across 100 runs$75$200

Checked on the Apify Store on 24 September 2026 against the general Kalshi market scraper with the most monthly users ($0.004 per market row, $0.01 for a liquid one — the lower price is used here; no start fee). Some Actors here ask less per row — this table compares against the one buyers actually use most.

How to use it

  1. Choose 📋 What to get: markets, events, search, history or order book.
  2. Narrow with 🔍 Keyword (fed, election, bitcoin, super bowl) and 🏷️ Category — several at once, Politics, Crypto keeps a market matching either.
  3. Set 📈 Minimum open interest or 💧 Minimum volume. Kalshi lists thousands of near-empty contracts; a volume floor of 1000 keeps the ones people actually trade.
  4. Sort by 24-hour volume, total volume, closing date, probability or biggest 24-hour move.
  5. Click Start, then export as JSON, CSV or Excel, or read the dataset through the API.

The input form of Kalshi Scraper: mode, keyword, category, volume and open-interest filters.

⬇️ Input

{
"mode": "markets",
"query": "fed",
"minVolume": 1000,
"sortBy": "volume24h",
"maxMarkets": 200
}

Events with all outcomes

{ "mode": "events", "category": "Politics", "minVolume": 5000, "maxMarkets": 50 }

Price history for specific markets

{ "mode": "history", "marketIds": ["KXOAIANTH-40-OAI"], "historyDays": 30 }

One series only

{ "mode": "markets", "seriesTicker": "KXPRESPARTY", "includeClosed": false }

Every input field

FieldWhat it does
modemarkets (one row per contract), events (one row per question), search, history, orderbook.
queryKeyword matched against the question, the event title and the tags.
categoryKalshi category or tag. Several at once — Politics, Crypto keeps a market matching either.
minVolumeDrop markets traded below this. A floor of 1000 removes most of the noise.
minOpenInterestDrop markets with fewer live contracts than this. Kalshi's real depth measure.
sortByvolume24h, volume, closing, probability or move24h — biggest 24-hour repricing first.
maxMarketsHow many rows to return. You are billed per row, so this is your budget.
includeClosedInclude settled markets with their final prices — the backtest set.
marketIdsExact market tickers. Required for history and order book if you want specific contracts.
seriesTickerOne Kalshi series only, e.g. KXPRESPARTY.
historyDaysWindow for history mode, 1 to 90 days. Short windows come back at minute resolution.
orderbookDepthLevels per side in order-book mode, up to 10.

⬆️ Output

{
"type": "market",
"platform": "kalshi",
"marketId": "KXOAIANTH-40-OAI",
"seriesTicker": "KXOAIANTH",
"question": "Will OpenAI or Anthropic IPO first? — OpenAI",
"eventTitle": "Will OpenAI or Anthropic IPO first?",
"category": "Companies",
"probability": 6,
"yesPrice": 0.06,
"noPrice": 0.94,
"bestBid": 0.05,
"bestAsk": 0.07,
"spread": 0.02,
"lastPrice": 0.06,
"priceChange24h": -0.01,
"volume": 171344.62,
"volume24h": 2840,
"openInterest": 40639.56,
"status": "open",
"closeTime": "2027-12-31T15:00:00Z",
"outcomes": [
{ "name": "Yes", "price": 0.06, "probability": 6 },
{ "name": "No", "price": 0.94, "probability": 94 }
],
"url": "https://kalshi.com/markets/kxoaianth",
"scrapedAt": "2026-09-04T01:00:00.000Z"
}

A request that fails arrives as a type: "error" row with the reason, never as a silently short list.

Use cases

Odds for a theme

Filter on fed, cpi or election and get every Kalshi contract on it with the probability each one implies.

Dashboards and newsletters

Sort by 24-hour move to see what repriced overnight, or by closing date for what resolves this week.

Research

Pull price history for a set of markets and study how the crowd's estimate moved against the news.

Bots and alerts

Schedule the run and alert when a probability crosses a threshold you care about.

AI agents

An agent asked "what does Kalshi say about a September rate cut" runs the search mode and reads probability straight off the rows.

🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the Apify MCP server or the Apify API (lergassy/kalshi-scraper).

Purpose: returns what Kalshi currently prices for a question. Use it for "what are the odds of X", "which markets moved most today", "what does the crowd think about the election".

Minimal input:

{ "query": "fed", "minVolume": 1000, "maxMarkets": 50 }

Output: one row per market — marketId, seriesTicker, question, eventTitle, category, tags, probability (per cent, the number to quote), yesPrice, noPrice, bestBid, bestAsk, spread, lastPrice, priceChange24h, volume, volume24h, openInterest, status, openTime, closeTime, outcomes, rules, url, scrapedAt. Event mode returns outcomes sorted by probability with favourite and a summary sentence; history mode one row per price point; order-book mode one row per market with both sides.

Behaviors an agent should know:

  • probability is the field to quote, in per cent. yesPrice is the same number as a price between 0 and 1, because one contract pays $1 if the event happens.
  • priceChange24h is a change in price, so 0.03 means three percentage points of probability.
  • Kalshi lists thousands of near-empty markets. Always pass minVolume (1000 is a good floor) or the answer fills with noise.
  • Depth on Kalshi is openInterest, not liquidity; the venue leaves its liquidity figure at zero.
  • Filters are applied by this Actor: query matches the question, event title and tags; category matches Kalshi categories.
  • Read rules before treating a market as the bet you have in mind — the resolution wording decides what actually pays.
  • History needs marketIds; without them the Actor uses the most active markets.
  • The API is public: no key, no account, no proxy.

Kalshi API without a key

Kalshi publishes open endpoints and changes their shape often. This Actor handles the pagination, the price conventions and the event-to-market nesting, and returns one stable row shape whichever series a market came from.

Use via API

Run this Actor from your own code or pipeline. Get your token in Apify Console → Settings → API & Integrations. Every input field below has the same name as in the JSON tab of the input form.

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lergassy/kalshi-scraper").call(run_input={
"mode": "markets",
"query": "fed",
"sortBy": "volume24h",
"maxMarkets": 50,
"includeClosed": False
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lergassy/kalshi-scraper').call({
"mode": "markets",
"query": "fed",
"sortBy": "volume24h",
"maxMarkets": 50,
"includeClosed": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL (runs the Actor and returns the results in one call)

curl -X POST "https://api.apify.com/v2/acts/lergassy~kalshi-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"mode": "markets", "query": "fed", "sortBy": "volume24h", "maxMarkets": 50, "includeClosed": false}'

Limitations, stated plainly

  • This is market data, not a forecast. The probability is what people are willing to pay, fees and risk appetite included.
  • Resolution wording decides payouts. Two markets with near-identical questions can settle differently. The rules field carries the text; read it before treating a market as your bet.
  • Kalshi is US-regulated and lists only what the CFTC allows. Questions you can find on other venues may simply not exist here.
  • Liquidity is always zero in Kalshi's own data. Open interest is the number that means something.
  • History depth depends on the market. A contract listed last week has a week of history, whatever you pass in historyDays.
  • Series and categories get renamed. If a saved seriesTicker suddenly returns nothing, search by keyword and take the new ticker from the rows.

Integrations: Kalshi data in n8n, Make, Python and Sheets

The Actor runs from the Apify API like any other, so the odds land wherever your stack already reads data. Call it from Python or JavaScript with the Apify client, schedule it and push rows into Google Sheets, wire it into n8n, Make or Zapier with the Apify app, or send the dataset onward through a webhook. AI agents reach it through the Apify MCP server with no extra setup — see the agent section above.

❓ FAQ

Is this financial advice or a trading tool?

No. It reads public market data and returns it as a table. It places no orders and holds no positions.

Is the probability the true chance of the event?

It is what the market pays, which is the crowd's price after fees and risk appetite. Treat it as a market price, not a forecast from a model.

How fresh are the numbers?

Live at the moment of the run. Schedule the Actor to build a time series of your own.

Do I need a Kalshi account?

No. The endpoints used here are public and read-only.

Why is the liquidity column missing?

Because Kalshi returns zero for it on nearly every market. Open interest is the figure that actually says how much is at stake.

What is the difference between this Actor and Polymarket Scraper?

Different venues. Kalshi is the CFTC-regulated US exchange with dollar-settled contracts; Polymarket is the crypto-settled venue with a wider set of questions. Prediction Markets API returns both in one table when you want to compare the same question across them.

How do I find the ticker of a market?

Run search or markets mode with a keyword and take marketId and seriesTicker from the rows. Those are the values history and order-book modes expect.

Can I track one question over time?

Yes. Either schedule the Actor and let each run append a snapshot, or pass marketIds to history mode and get the past 90 days in one call.

What happens if a market does not exist or has settled?

A settled market comes back with status and result filled in when you pass includeClosed. A ticker that does not exist arrives as a type: "error" row with the reason — the run still finishes and the other rows are still yours.

How many markets can one run return?

As many as you set in maxMarkets. A few thousand rows come back in seconds because the source is a public JSON API with no browser and no proxy in the way.

The Actor reads public, read-only endpoints that Kalshi publishes for its own site, at a normal request rate, and places no orders, which is ordinary public-data collection. What you then do with the data is your call, and your lawyer's.

Can I use it with the Apify API or an MCP server?

Yes. It runs from the API and the official clients, and AI agents reach it through the Apify MCP server without extra setup.

Run health

When a run ends with many error rows, the Actor sends its developer the counts (rows delivered, error types, run ID) so the cause gets fixed fast; your input and results are never sent.

Your feedback

Missing a field, or a series you want covered? Open an issue on the Issues tab — every one gets answered.

You might also like

ActorWhat it does
Prediction Markets APIKalshi and Polymarket in one table
Polymarket Scraper & APIThe same shape for Polymarket
Sports Betting Odds APIBookmaker lines, arbitrage and value bets
Sports Scores & Schedules APILive scores and schedules for 33 leagues

Also known as

People look for this Actor as a Kalshi API, a Kalshi scraper, event contracts data, Kalshi odds, implied probability data, prediction market data and election odds.