Kalshi Markets Scraper – Odds, Volume & Order Books avatar

Kalshi Markets Scraper – Odds, Volume & Order Books

Pricing

from $1.00 / 1,000 markets

Go to Apify Store
Kalshi Markets Scraper – Odds, Volume & Order Books

Kalshi Markets Scraper – Odds, Volume & Order Books

Extract Kalshi prediction markets: yes/no prices, volume, open interest, close times and optional order books. Filter by series, event, category or status. Clean JSON for traders, researchers and AI agents.

Pricing

from $1.00 / 1,000 markets

Rating

0.0

(0)

Developer

Rowfeed

Rowfeed

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Get Kalshi prediction-market data as clean JSON rows: every market's YES/NO price, bid and ask, volume, open interest, close time and, on request, the live order book. Built for traders, researchers, AI agents and dashboards that need Kalshi odds without a login, an API key or a headless browser. Plain HTTPS calls to Kalshi's public API with retries and a silent-failure check, so a scheduled run keeps working when the exchange hiccups.

What you get

  • Every market as one row – ticker, title, YES/NO last price, bid and ask, lifetime and 24 h volume, open interest, liquidity, open/close/expiration times, rules and result, plus series_ticker, category (Sports, Politics, Climate and Weather, Crypto, Economics…) and a link to the market page.
  • Order books on demand – the top N price levels on both the YES and the NO side as [price, size] pairs in dollars, read at the same moment as the row.
  • Filters that match real questions – one series (KXHIGHNY for NYC daily highs, KXNFLGAME for NFL games), one event, a category, a market status (open, closed, settled, unopened, all), a minimum volume and a sort order, with a hard cap on rows so the cost of a run is known up front. A default run returns the 200 markets with the highest 24 h volume, not whatever the API happens to list first.

Sample row

One open NYC-temperature market scraped with includeOrderbook: true and orderbookDepth: 3. The raw Kalshi fields (rules_secondary, price_ranges, *_dollars, *_fp, …) are trimmed here but present in every row.

{
"ticker": "KXHIGHNY-26SEP09-T84",
"event_ticker": "KXHIGHNY-26SEP09",
"series_ticker": "KXHIGHNY",
"category": "Climate and Weather",
"title": "Will the maximum temperature be <84° on Sep 9, 2026?",
"yes_sub_title": "83° or below",
"no_sub_title": "83° or below",
"status": "active",
"market_type": "binary",
"yes_price": 0.7,
"yes_bid": 0.68,
"yes_ask": 0.69,
"no_bid": 0.31,
"no_ask": 0.32,
"volume": 7769.32,
"volume_24h": 7769.32,
"open_interest": 5758.8,
"liquidity": 0.0,
"open_time": "2026-09-08T14:00:00Z",
"close_time": "2026-09-10T05:00:00Z",
"expiration_time": "2026-09-16T14:00:00Z",
"result": "",
"url": "https://kalshi.com/markets/kxhighny",
"scraped_at": "2026-09-09T10:32:35+00:00",
"strike_type": "less",
"cap_strike": 84,
"rules_primary": "If the maximum temperature recorded at New York City (CLINYC) for Sep 9, 2026, is less than 84° fahrenheit according to The Weather Company, then the market resolves to Yes.",
"orderbook": {
"yes": [[0.66, 35.0], [0.67, 34.0], [0.68, 15.0]],
"no": [[0.29, 42.0], [0.3, 25.0], [0.31, 40.0]]
}
}

Filters

InputDefaultWhat it does
seriesTickers[]Series to scrape, e.g. ["KXHIGHNY", "KXNFLGAME"]. The series ticker is the first dash-separated part of a market ticker. Empty = all series.
eventTickers[]Specific events, e.g. ["KXHIGHNY-26SEP09"]. Used together with series tickers when both are set.
categories[]Keep only markets whose series category contains one of these words (case-insensitive). ["Weather"] matches "Climate and Weather".
statusopenopen, closed, settled, unopened or all.
minVolume0Skip markets whose lifetime volume (contracts traded) is below this number.
sortByvolume_24hRow order: volume_24h, volume or open_interest (highest first), close_time (soonest first), or none for Kalshi's API order.
maxMarkets200Keep this many rows after filtering and sorting.
includeOrderbookfalseFetch the YES/NO order book for every row.
orderbookDepth10Price levels per side (1–100).

Runs without a series or event ticker skip Kalshi's multivariate combination markets (KXMVECROSSCATEGORY…, tens of thousands of near-identical parlay shards). Pass that series ticker explicitly if you want them.

Kalshi's API lists markets in no useful order (the first pages are mostly zero-volume micro-markets), so a run without a series, event or category filter fetches a pool of up to 3,000 markets, applies minVolume, sorts by sortBy and keeps maxMarkets rows. With filters, the volume floor and the sort order apply to the markets fetched for those filters. Only the rows you keep are charged.

Pricing

Pay per event, no subscription: $1 per 1,000 markets and $2 per 1,000 order books. A default run (200 open markets, no order books) costs $0.20; 200 markets with order books cost $0.60. Set a maximum charge on the run and the Actor stops cleanly when it is reached, charging only for rows that were actually saved.

Use it from your tools

  • API and SDKs – call it via the Apify API or the official Python/JavaScript clients: one call to start the run, one to fetch the dataset as JSON or CSV.
  • Schedules – run it hourly or daily inside Apify and push new rows to Google Sheets, a webhook or your own storage automatically.
  • n8n, Make and Zapier – trigger runs and pipe markets into a workflow through Apify's integration for each.
  • AI agents and MCP – this Actor is eligible for agentic use via Apify's MCP server and supports pay-per-event pricing, so an agent can call it mid-task and pay only per market it actually reads.
  • Webhooks – fire on run finished to kick off the next step in a pipeline as soon as fresh markets land.

Details

  • Source: Kalshi's public trade API v2 (api.elections.kalshi.com/trade-api/v2). No authentication, no proxies, no browser, no personal data.
  • Freshness: prices are read at scrape time; scraped_at is the UTC timestamp of the run. yes_price is the last trade in dollars (0–1, i.e. the implied probability) and stays 0 until a market's first trade, so use yes_bid / yes_ask for untraded markets. Kalshi reports open markets as active in the status column.
  • Reliability: 429 and 5xx responses are retried with exponential backoff (5 tries), a 200 without the expected data counts as a failure, and one bad ticker never stops the run: it becomes an error row (ticker, error, errorMessage) and the rest continues. A run fails only when it produced no rows and hit errors; a filter with no matching markets (e.g. a series with nothing open) is a successful, empty run.
  • Run stats: the STATS record in the run's key-value store holds request and error counts per category (network, rate_limit, blocked, not_found, other).
  • Speed: a default run (3,000 markets pooled, 200 kept) finishes in about 15 seconds. 1,000 markets is a single API call; order books add roughly half a second per market.
  • Output: one dataset row per market with the columns above first and every raw Kalshi field after them. The Overview table shows title, YES price, volume, open interest, close time and ticker. Export as JSON, CSV or Excel, fetch through the Apify API, or schedule runs and pipe them into Google Sheets, Make, Zapier or your own code.