# Kalshi Scraper: Prediction Markets, Odds, Trades, Order Books (`themineworks/kalshi-scraper`) Actor

Scrape Kalshi prediction markets: yes and no bid and ask, last price, implied probability, volume, open interest, close dates, results and rules. Search, browse by category or paste tickers and links. Also events, series, trades and order books. No login or API key.

- **URL**: https://apify.com/themineworks/kalshi-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** News, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 markets

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Kalshi Scraper: Prediction Markets, Odds, Trades, Order Books

[![50 Kalshi markets from 18 events with live odds in under 3 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/kalshi-scraper-hero.png)](https://console.apify.com/actors/qfUzURXkorFR4CnTd/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Polymarket Scraper](https://apify.com/themineworks/polymarket-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

Updated 21 Oct 2026: first release. Markets, events, series, trades and order book snapshots from Kalshi, the US regulated prediction market exchange, through its public market data API. Search, browse by category, or paste tickers and kalshi.com links. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **Every price a trader reads, as numbers.** Each market row has the Yes bid and ask, the No bid and ask, the sizes at the best prices, the spread, the last trade, the price 24 hours ago and the change, plus an `implied_probability` from 0 to 1 that says how it was worked out (`mid` of a tight book or `last_price`). Volume, 24 hour volume and open interest come in contracts, and one contract pays $1.
- **Five kinds of rows from one actor.** Markets, whole events (all outcomes in one row with the leading one), series (the recurring question behind events, with its fee model and contract filing), trades (one row per fill with side, price, contracts and dollars), and order book snapshots with depth and dollar liquidity per market.
- **Pay per row, nothing for errors.** Tickers Kalshi does not know, searches with no results, the summary row and duplicates found twice are never charged. No Kalshi account, API key or login.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/qfUzURXkorFR4CnTd/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Company and business data family:** [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [EU VAT Checker (VIES)](https://apify.com/themineworks/eu-vat-vies-validator?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Tech Stack Detector](https://apify.com/themineworks/tech-stack-detector?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns 50 open markets from what is trending on Kalshi right now, the 5 most traded outcomes of each event. In our test it read 18 events in under 3 seconds:

```json
{
  "mode": "markets",
  "status": "open",
  "maxItems": 50,
  "maxMarketsPerEvent": 5
}
```

Type words in `searchText` (for example `fed`, `bitcoin` or `super bowl`) to search the way the kalshi.com search box does, pick a `category`, or paste tickers and links. Switch `mode` to get events, series, trades or order books for the same selection.

Apify's free plan includes $5 of credit every month, which covers about 1,350 markets at this actor's price.

#### Copy to your AI assistant

```text
themineworks/kalshi-scraper on Apify. Reads Kalshi prediction markets from Kalshi's public market data API, no login or key, and returns flat rows. Call ApifyClient("TOKEN").actor("themineworks/kalshi-scraper").call(run_input={"mode": "markets", "searchText": "fed", "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Input: mode (markets, events, series, trades, orderbook; default markets), searchText (string), category (Politics, Elections, Economics, Financials, Crypto, Commodities, Companies, Climate and Weather, Science and Technology, Entertainment, Sports, Mentions, Health, Social, World), seriesTickers, eventTickers, marketTickers (lists; tickers or kalshi.com links), status (open, closed, settled, all; default open), sortBy (trending, volume, totalVolume, newest, closingSoon, relevance), minVolume (contracts), maxItems (default 100, 1 to 20000, rows per run), maxMarketsPerEvent (0 = all), tradesPerMarket (default 100), tradesSince (YYYY-MM-DD), orderbookDepth (default 10). Nothing selected = browse trending markets; trades mode with nothing selected = the exchange wide trade feed. Every data row has record_type (market, event, series, orderbook, trade). Market rows carry ticker, event_ticker, series_ticker, title, subtitle, yes_subtitle, no_subtitle, event_title, event_subtitle, series_title, category, tags, status, status_raw, market_type, yes_bid, yes_ask, no_bid, no_ask, yes_bid_size, yes_ask_size, spread, last_price, previous_price, price_change_24h, implied_probability, implied_probability_pct, probability_source, volume, volume_24h, open_interest, notional_value, open_time, close_time, expiration_time, expected_expiration_time, latest_expiration_time, created_time, settlement_time, result, settlement_value, can_close_early, strike_type, floor_strike, cap_strike, rules_summary, rules_details, mutually_exclusive, settlement_sources, url, found_by, position, scraped_at. Order book rows add orderbook_yes_bids, orderbook_no_bids (price, quantity, best first), book_best_yes_bid, book_best_no_bid, book_yes_ask, yes_depth_contracts, no_depth_contracts, liquidity, orderbook_levels, snapshot_at. Event rows: event_ticker, title, category, status, market_count, open_market_count, volume, volume_24h, open_interest, leading_outcome, leading_probability, markets (array), url. Series rows: series_ticker, title, category, tags, frequency, volume, fee_type, contract_url. Trade rows: trade_id, ticker, trade_time, unix_time, taker_side, yes_price, no_price, price, contracts, usd_value, is_block_trade. Prices are dollars per contract, 0 to 1. Rows with _type summary, info or error are not charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~kalshi-scraper/builds/default (Bearer TOKEN). Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Search and browse like kalshi.com.** `searchText` uses the same search feed as the site. With no search, the actor browses Kalshi's markets in the order you pick: trending, recent volume, total volume, newest, or closing soonest. Add a `category` to stay in Politics, Economics, Crypto, Sports or any other Kalshi category.
- **Tickers and links.** Paste a market ticker (`KXFEDDECISION-26OCT-H0`), an event ticker (`KXFEDDECISION-26OCT`), a series ticker (`KXFEDDECISION`) or a kalshi.com link. The actor works out which one it is: an event gives all its outcomes, a series gives its events newest first.
- **Status filter that matches the site.** Open markets still trading, closed markets waiting for their result, settled markets with `result` (`yes` or `no`), `settlement_value` and `settlement_time`, or all of them.
- **One outcome per row, or one event per row.** Markets mode gives each outcome its own row, ready to sort by chance or volume. Events mode puts a whole question in one row, with every outcome in `markets` and, for questions where only one outcome can win, the `leading_outcome` and its probability.
- **Trades and order books.** Trades mode returns each fill with the side the taker bought, the price paid, contracts and dollar value, newest first; with nothing selected it reads the exchange wide trade feed. Order book mode returns every market with its bid levels on both sides, depth in contracts and dollars resting in the book.
- **Stops cleanly.** Six failed requests in a row end the run; 60 events in a row with nothing that passes your filters end the run; the run stops before its time limit and keeps every row. The summary row says why it stopped.

### How to use it

#### Follow one question: the next Fed decision

```json
{
  "eventTickers": ["KXFEDDECISION-26OCT"],
  "status": "all"
}
```

Five rows, one per outcome (cut more than 25 bps, cut 25, hold, hike 25, hike more than 25), each with its bid, ask, last price and implied probability. Run it on a schedule to build your own odds history.

#### Everything about a topic

```json
{
  "searchText": "bitcoin",
  "maxItems": 300,
  "maxMarketsPerEvent": 10
}
```

The best matching events for the search, up to 10 outcomes each, most traded first.

#### A whole category, as events

```json
{
  "mode": "events",
  "category": "Politics",
  "sortBy": "totalVolume",
  "maxItems": 100
}
```

One row per event, biggest by all time volume first, with the leading outcome and every market in `markets`.

#### Settled results for back testing

```json
{
  "seriesTickers": ["KXHIGHNY"],
  "status": "settled",
  "maxItems": 2000
}
```

Each settled New York high temperature market with its strikes, last price before close and `result`. Compare `last_price` with `result` to see how well the market priced the outcome.

#### Large trades on one market

```json
{
  "mode": "trades",
  "marketTickers": ["KXFEDDECISION-26OCT-H0"],
  "tradesPerMarket": 1000,
  "tradesSince": "2026-10-01"
}
```

Filter the rows on `usd_value` to keep the big fills.

#### Order book depth across a series

```json
{
  "mode": "orderbook",
  "seriesTickers": ["KXFEDDECISION"],
  "orderbookDepth": 20,
  "maxItems": 50
}
```

Each open market with its top 20 bid levels per side, `liquidity` in dollars and depth in contracts.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `mode` | string | `markets` | `markets`, `events`, `series`, `trades` or `orderbook`. |
| `searchText` | string | empty | Words to search, as on kalshi.com. |
| `category` | string | any | One Kalshi category, alone or with a search. |
| `seriesTickers` | array | empty | Series tickers such as `KXFEDDECISION`. |
| `eventTickers` | array | empty | Event tickers such as `KXFEDDECISION-26OCT`. |
| `marketTickers` | array | empty | Market tickers or kalshi.com links, up to 500. |
| `status` | string | `open` | `open`, `closed`, `settled` or `all`. |
| `sortBy` | string | `trending` | Order of a search, category or browse: `trending`, `volume`, `totalVolume`, `newest`, `closingSoon`, `relevance`. |
| `minVolume` | integer | `0` | Only rows that traded at least this many contracts. |
| `maxItems` | integer | `100` | Most rows the run returns in total, 1 to 20,000. |
| `maxMarketsPerEvent` | integer | `0` | Most outcomes per event, most traded first; 0 keeps all. |
| `tradesPerMarket` | integer | `100` | Trades mode: most recent trades per selected market. |
| `tradesSince` | string | empty | Trades mode: only trades on or after this day. |
| `orderbookDepth` | integer | `10` | Order book mode: levels per side; 0 keeps the whole book. |

Leave every selection field empty to browse. The sources are read in this order: tickers and links, events, series, then the search, category or browse feed.

### What data do you get?

Every data row has `record_type`: `market`, `event`, `series`, `orderbook` or `trade`. Data rows have no `_type` field; the summary, info and error rows do, so a filter on `_type` separates them.

| Field | What it is |
|---|---|
| `ticker`, `event_ticker`, `series_ticker` | Kalshi tickers of the market, its event and its series |
| `title`, `subtitle`, `yes_subtitle`, `no_subtitle` | The market question and the outcome it stands for |
| `event_title`, `event_subtitle`, `series_title` | The event and series it belongs to |
| `category`, `tags` | Kalshi category and series tags |
| `status`, `status_raw` | `open`, `unopened`, `paused`, `closed` or `settled`, and Kalshi's own word |
| `yes_bid`, `yes_ask`, `no_bid`, `no_ask` | Best prices in dollars per contract, 0 to 1 |
| `yes_bid_size`, `yes_ask_size`, `spread` | Contracts at the best prices, and ask minus bid |
| `last_price`, `previous_price`, `price_change_24h` | Last trade, the last trade 24 hours ago, and the change |
| `implied_probability`, `implied_probability_pct`, `probability_source` | Chance of Yes from 0 to 1, in percent, and whether it is the `mid` or the `last_price` |
| `volume`, `volume_24h`, `open_interest` | Contracts traded in total and in 24 hours, contracts held |
| `open_time`, `close_time`, `expiration_time`, `expected_expiration_time` | When trading opens and closes, and when the result is due |
| `result`, `settlement_value`, `settlement_time` | Settled markets: `yes` or `no`, the settled value, when |
| `strike_type`, `floor_strike`, `cap_strike` | Strikes of range and threshold markets |
| `rules_summary`, `rules_details` | What makes the market resolve Yes, and the edge cases |
| `mutually_exclusive`, `settlement_sources` | Whether only one outcome can win, and the sources Kalshi settles on |
| `url` | Link on kalshi.com |
| `found_by`, `position`, `scraped_at` | The input that found the row, its order in the run, when it was read |

Order book rows add `orderbook_yes_bids` and `orderbook_no_bids` (price and quantity, best first), `book_best_yes_bid`, `book_best_no_bid`, `book_yes_ask`, `yes_depth_contracts`, `no_depth_contracts`, `liquidity` (dollars resting in the levels kept), `orderbook_levels` and `snapshot_at`.

Event rows: `event_ticker`, `title`, `subtitle`, `category`, `status`, `mutually_exclusive`, `strike_date`, `market_count`, `open_market_count`, `volume`, `volume_24h`, `open_interest` (summed over outcomes), `leading_market_ticker`, `leading_outcome`, `leading_probability`, `close_time`, `markets` and `url`.

Series rows: `series_ticker`, `title`, `category`, `categories`, `tags`, `frequency`, `volume`, `fee_type`, `fee_multiplier`, `settlement_sources`, `contract_url`, `contract_terms_url`, `last_updated` and `url`.

Trade rows: `trade_id`, `ticker`, `series_ticker`, `trade_time`, `unix_time`, `taker_side`, `yes_price`, `no_price`, `price`, `contracts`, `usd_value`, `is_block_trade`, plus the market's `event_ticker`, `title`, `category` and `url` when the trades come from selected markets.

**Summary row** (`_type: "summary"`, never charged): `mode`, `rows_delivered`, `charged_for`, `events_read`, `markets_seen`, `filtered_out`, `duplicates_skipped`, `not_found`, `search_pages`, `event_requests`, `http_requests`, `http_megabytes`, `stopped` (why the run ended), `shortfall_reason` when fewer rows came back than asked, and `per_source`, the rows each input delivered. The same summary is saved as the `OUTPUT` record of the run.

**Error rows** (`_type: "error"`, never charged): one per input that could not be read, with `error_type` (`invalid_input`, `not_found`, `no_results`, `fetch_error`), `identifier` and `reason`.

#### Stable fields for automations

Present on every market row of our test runs (50 open markets from 18 events), with names that will not change: `record_type`, `ticker`, `event_ticker`, `series_ticker`, `title`, `subtitle`, `event_title`, `category`, `status`, `yes_bid`, `yes_ask`, `no_bid`, `no_ask`, `last_price`, `implied_probability`, `volume`, `volume_24h`, `open_interest`, `open_time`, `close_time`, `rules_summary`, `url`, `position`, `scraped_at`.

Present only when Kalshi has a value: `spread` and `implied_probability` (a market with no bids and no trades has neither), `result`, `settlement_value` and `settlement_time` (settled markets), `floor_strike` and `cap_strike` (range markets), `rules_details`, `tags`.

#### Output examples

One market from the trending browse (test run, 21 Oct 2026, trimmed):

```json
{
  "record_type": "market",
  "ticker": "KXATPMATCH-26OCT18MEDNAK-NAK",
  "event_ticker": "KXATPMATCH-26OCT18MEDNAK",
  "series_ticker": "KXATPMATCH",
  "title": "Brandon Nakashima wins",
  "subtitle": "Brandon Nakashima",
  "event_title": "Medjedovic vs Nakashima",
  "series_title": "ATP Tennis Match",
  "category": "Sports",
  "tags": ["Tennis"],
  "status": "open",
  "yes_bid": 0.92,
  "yes_ask": 0.93,
  "no_bid": 0.07,
  "no_ask": 0.08,
  "spread": 0.01,
  "last_price": 0.93,
  "previous_price": 0.72,
  "price_change_24h": 0.21,
  "implied_probability": 0.925,
  "implied_probability_pct": 92.5,
  "probability_source": "mid",
  "volume": 545560.23,
  "volume_24h": 430701.66,
  "open_interest": 246715.46,
  "close_time": "2026-11-01T08:00:00.000Z",
  "rules_summary": "If Brandon Nakashima wins the Medjedovic vs Nakashima professional tennis match in the 2026 ATP Lyon Round Of 32 after a ball has been played, then the market resolves to Yes.",
  "mutually_exclusive": true,
  "url": "https://kalshi.com/markets/kxatpmatch/atp-tennis-match/kxatpmatch-26oct18mednak",
  "found_by": "browse: trending",
  "position": 8
}
```

One event row from Events mode (same day, trimmed to two of its five outcomes):

```json
{
  "record_type": "event",
  "event_ticker": "KXFEDDECISION-26OCT",
  "series_ticker": "KXFEDDECISION",
  "title": "Fed decision in Oct 2026?",
  "subtitle": "On Oct 28, 2026",
  "category": "Economics",
  "status": "open",
  "mutually_exclusive": true,
  "market_count": 5,
  "open_market_count": 5,
  "volume": 13012004.81,
  "volume_24h": 434737.11,
  "open_interest": 6175641.04,
  "leading_market_ticker": "KXFEDDECISION-26OCT-H0",
  "leading_outcome": "Fed maintains rate",
  "leading_probability": 0.875,
  "markets": [
    { "ticker": "KXFEDDECISION-26OCT-H0", "outcome": "Fed maintains rate", "status": "open", "yes_bid": 0.87, "yes_ask": 0.88, "last_price": 0.88, "implied_probability": 0.875, "volume": 5942846.22 },
    { "ticker": "KXFEDDECISION-26OCT-H25", "outcome": "Hike 25bps", "status": "open", "yes_bid": 0.12, "yes_ask": 0.13, "last_price": 0.13, "implied_probability": 0.125, "volume": 4393195.34 }
  ],
  "url": "https://kalshi.com/markets/kxfeddecision/fed-meeting/kxfeddecision-26oct"
}
```

An order book row, trimmed to 3 levels a side:

```json
{
  "record_type": "orderbook",
  "ticker": "KXATPCHALLENGERMATCH-26OCT20MILGIU-GIU",
  "title": "Lorenzo Giustino wins",
  "yes_bid": 0.32,
  "yes_ask": 0.33,
  "orderbook_yes_bids": [{ "price": 0.32, "quantity": 209.93 }, { "price": 0.31, "quantity": 745 }, { "price": 0.3, "quantity": 976 }],
  "orderbook_no_bids": [{ "price": 0.67, "quantity": 80 }, { "price": 0.66, "quantity": 5420.67 }, { "price": 0.65, "quantity": 2645.81 }],
  "book_best_yes_bid": 0.32,
  "book_yes_ask": 0.33,
  "yes_depth_contracts": 4273.93,
  "no_depth_contracts": 11855.04,
  "liquidity": 8961.41,
  "orderbook_levels": 10
}
```

A trade row:

```json
{
  "record_type": "trade",
  "trade_id": "072436fb-8109-a3dd-fd7c-b32cad1a2de3",
  "ticker": "KXATPCHALLENGERMATCH-26OCT20MILGIU-GIU",
  "trade_time": "2026-10-20T22:21:20.435Z",
  "unix_time": 1792534880,
  "taker_side": "yes",
  "yes_price": 0.33,
  "no_price": 0.67,
  "price": 0.33,
  "contracts": 142.82,
  "usd_value": 47.13,
  "is_block_trade": false
}
```

An error row for a ticker Kalshi does not know (nothing charged):

```json
{ "_type": "error", "error_type": "not_found", "identifier": "NOTAREALTICKER-XYZ", "reason": "No Kalshi market, event or series has this ticker. Check the spelling, for example KXFEDDECISION-26OCT-H0 (market), KXFEDDECISION-26OCT (event) or KXFEDDECISION (series)." }
```

### Pricing

Pay per event: you pay for the rows you receive, plus a flat $0.003 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `market-scraped` | Once per market, event, series or order book row stored in your dataset | $3.60 per 1,000 | $3.20 per 1,000 | $2.50 per 1,000 | $1.80 per 1,000 |
| `trade-scraped` | Once per trade row stored in your dataset | $3.60 per 1,000 | $3.20 per 1,000 | $2.50 per 1,000 | $1.80 per 1,000 |
| `run-start` | Once per run, after Kalshi returned the first rows | $0.003 | $0.003 | $0.003 | $0.003 |

The price of one row is the price per 1,000 divided by 1,000.

Never charged:

- tickers and links Kalshi does not know, and searches with no results (each gets an error row);
- a market, event, series or trade that a second input of the same run finds again;
- rows past your `maxItems`, or filtered out by `status` or `minVolume`;
- the summary, info and error rows;
- a run with no valid input or nothing to return: the start fee is charged only once Kalshi has returned rows;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every hour, every day at 08:00 and so on).
3. Each run is a snapshot: store `ticker`, `implied_probability` and `scraped_at` to build a probability history, or compare `last_price` between runs to spot moves.
4. Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.

### FAQ

#### What does this actor read?

Kalshi's public market data API at api.elections.kalshi.com, the read only endpoints Kalshi documents for anyone, plus the search feed kalshi.com uses for its search box. It does not log in, place orders or read anything tied to an account.

#### How fresh are the prices?

They are read at run time. `scraped_at` is when the market was read, `snapshot_at` when its order book was read. Kalshi prices can move within seconds on live sports and crypto markets, so the order book and the market's own best prices can differ slightly.

#### How is implied_probability worked out?

A Kalshi Yes contract pays $1 if the market resolves Yes, so its price reads as a chance. When both sides are quoted and the spread is 10 cents or less, the actor uses the middle of the bid and ask; otherwise it uses the last trade price. `probability_source` says which one was used. A market with no bids and no trades has no implied probability.

#### Why do so many trending markets come from sports?

That is what trades most on Kalshi on a given day. Pick a `category`, use `searchText`, or sort by `totalVolume` to see the largest questions of all time instead.

#### What is the difference between an event, a market and a series?

A series is a recurring question (the Fed meeting). An event is one instance of it (the October 2026 meeting). A market is one outcome of that event that trades Yes or No (the Fed holds rates). Markets mode gives one row per outcome, Events mode one row per event, Series mode one row per series.

#### Can I get the result of finished markets?

Yes. Set `status` to `settled`. Each row then has `result` (`yes` or `no`), `settlement_value` (for example the winner's name or the measured number) and `settlement_time`.

#### How long does a run take?

In our tests: under 3 seconds for the "Try it" input (50 markets from 18 events), about 1 second for 30 trades from the trade feed, and 3 seconds for 8 order books. The default time limit is 3,600 seconds; the actor stops before it and keeps every row.

#### Do I need a Kalshi account, an API key or a proxy?

No. The data is public. The actor calls Kalshi directly and switches to Apify Proxy only if Kalshi refuses the run's own address.

#### Which actor should I use for other prediction markets?

[Polymarket Scraper](https://apify.com/themineworks/polymarket-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) reads Polymarket's markets, price history and trades with matching names where the two overlap (`volume_24h`, `liquidity`, `url`, `scraped_at`, prices from 0 to 1), so the two datasets are easy to line up for cross market comparisons.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has four ready views: Markets, Events, Trades and Order books. In CSV and Excel, arrays such as `markets` and `orderbook_yes_bids` are flattened into columns such as `markets/0/ticker`.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/kalshi-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http kalshi-scraper "https://mcp.apify.com/?tools=themineworks/kalshi-scraper"`

#### Is it legal to scrape Kalshi?

The actor reads only public market data that Kalshi publishes through its own API for anyone to use, without an account. You are responsible for how you use the data, including Kalshi's terms. This is general information, not legal or trading advice. The actor is not affiliated with Kalshi.

### Integrations

- **Google Sheets**: send each run's markets to a sheet with Apify's Google Sheets integration; one row per market fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "post the Fed decision odds to Slack every morning".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [EU VAT Checker (VIES)](https://apify.com/themineworks/eu-vat-vies-validator?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Tech Stack Detector](https://apify.com/themineworks/tech-stack-detector?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Bundesanzeiger Scraper](https://apify.com/themineworks/germany-bundesanzeiger-monitor?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Domain to LinkedIn URL Resolver](https://apify.com/themineworks/domain-to-linkedin-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [US Import Records](https://apify.com/themineworks/us-import-supplier-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Y Combinator Scraper](https://apify.com/themineworks/y-combinator-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Norway Company Register](https://apify.com/themineworks/norway-brreg-entity-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a market that comes back with an empty field, or a ticker or link the actor does not understand? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

*Read Kalshi prediction markets as flat rows: Yes and No prices, implied probability, volume, open interest, dates, results and rules, plus events, series, trades and order books, no login.*

# Actor input Schema

## `mode` (type: `string`):

Markets: one row per market with yes and no bid and ask, last price, implied probability, volume, open interest, dates, result and rules. Events: one row per event with all its outcomes and the leading one. Series: one row per series (the recurring question behind events). Trades: one row per trade. Order book: one row per market with its live order book and liquidity.

## `searchText` (type: `string`):

Words to search for, the same as the search box on kalshi.com, for example "fed", "bitcoin", "super bowl" or "election". Leave empty, along with the fields below, to browse Kalshi's markets in the order set in Sort by.

## `category` (type: `string`):

Only markets in this Kalshi category. Works alone (browse a category) or with a search.

## `seriesTickers` (type: `array`):

Kalshi series tickers, for example KXFEDDECISION (Fed meeting), KXBTC (Bitcoin price range) or KXHIGHNY (New York high temperature). Each series returns its events and their markets, newest first.

## `eventTickers` (type: `array`):

Kalshi event tickers, for example KXFEDDECISION-26OCT. Each event returns all its markets (outcomes).

## `marketTickers` (type: `array`):

Market tickers such as KXFEDDECISION-26OCT-H0, or links copied from kalshi.com such as https://kalshi.com/markets/kxfeddecision/fed-meeting/kxfeddecision-26oct. A link to an event returns all its markets. Up to 500 lines.

## `status` (type: `string`):

Open: markets still trading. Closed: trading ended, result not final yet. Settled: finished markets with their result. All: every status.

## `sortBy` (type: `string`):

Order of a search, a category or the browse feed: trending now, most traded recently, most traded ever, newest, closing soonest, or best text match. Ticker, event and series inputs keep Kalshi's own order.

## `minVolume` (type: `integer`):

Only markets (or events, series) that traded at least this many contracts in total. One contract pays $1. 0 keeps everything.

## `maxItems` (type: `integer`):

The most rows this run returns in total, 1 to 20,000. In Trades mode each trade is a row.

## `maxMarketsPerEvent` (type: `integer`):

The most markets (outcomes) taken from each event, the most traded first. A golf tournament can have 120 outcomes; 5 keeps its top 5 and moves on to the next event. 0 keeps every outcome.

## `tradesPerMarket` (type: `integer`):

Trades mode with markets selected: the most recent trades taken from each market, newest first. 1 to 10,000.

## `tradesSince` (type: `string`):

Trades mode: only trades on or after this day (YYYY-MM-DD).

## `orderbookDepth` (type: `integer`):

Order book mode: price levels kept per side, best first. 0 keeps the whole book. 0 to 100.

## Actor input object example

```json
{
  "mode": "markets",
  "category": "",
  "status": "open",
  "sortBy": "trending",
  "minVolume": 0,
  "maxItems": 50,
  "maxMarketsPerEvent": 5,
  "tradesPerMarket": 100,
  "orderbookDepth": 10
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "markets",
    "status": "open",
    "maxItems": 50,
    "maxMarketsPerEvent": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/kalshi-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "markets",
    "status": "open",
    "maxItems": 50,
    "maxMarketsPerEvent": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/kalshi-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "markets",
  "status": "open",
  "maxItems": 50,
  "maxMarketsPerEvent": 5
}' |
apify call themineworks/kalshi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/kalshi-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qfUzURXkorFR4CnTd/builds/WZyXdMq6qFS7dyXzc/openapi.json
