Skip to content

Latest commit

Β 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 

Repository files navigation

Kalshi Scraper [Just πŸ’°$0.80/1k]

Extract structured data from kalshi.com β€” Kalshi Scraper pulls prediction-market odds from kalshi.com: implied probability, yes/no bid and ask, spread, volume, open interest and settlement results. Covers all ~103,000 tradable markets including weather, plus order book, trades and OHLC candles on request.

Kalshi Scraper [Just πŸ’°$0.80/1k] on Apify β†’


πŸš€ How to use this actor

πŸ’š $5 free Apify credits β€” every month

No credit card required. No commitment. Cancel anytime.

  1. Click sign up β€” pick GitHub, Google, or email; takes ~30 seconds
  2. Open this actor β€” input is pre-filled with a working example
  3. Click Start β€” export results as JSON, CSV, or Excel

Your $5 monthly platform credit is enough to run this actor right away β€” and again every month β€” scraping typically several hundred to several thousand results per run, depending on your input.

Key features

Search with filters β€” Search by keyword. Filter by 🏷️ category, πŸ“Š market status, πŸ“ˆ candle period (minutes), and more.

Incremental mode β€” Only get new or changed listings since your last run. Content hash per listing β€” no duplicates, no re-processing.

Change classification β€” Track unchanged, expired, cross-run duplicate detection across runs. Build audit trails of how listings evolve over time.

Compact output β€” Emit core fields only (AI-agent / MCP-friendly). Keeps response size small for LLM workflows.

Result cap β€” Stop after N listings (up to 200.000). Set to 0 for the full catalog.

Export anywhere β€” Download as JSON, CSV, or Excel. Stream via Apify API, webhooks, or integrations with Make, Zapier, Airbyte, Keboola.

Structured data β€” Every listing returns the same schema with consistent field naming. All fields always present β€” null when unavailable, never omitted.


Use cases

Data pipeline automation Integrate with your ETL pipeline to collect structured listings from kalshi.com on a schedule. Export to CSV, JSON, or directly to your database. Use compact mode to control output size.

Market research Monitor listings, track trends, and analyze market dynamics with structured, deduplicated data from kalshi.com.

Change monitoring Run daily or hourly in incremental mode to capture only new, updated, or expired ${NOUNS}. Perfect for price-tracking, churn analysis, and alerting pipelines.

AI / LLM training data Structured JSON per listing is ready for RAG pipelines, embeddings, and agent workflows. Compact mode trims tokens for LLM context windows.


Quick start

{
  "query": "all open markets",
  "maxResults": 5,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "notificationLimit": 5,
  "notifyOnlyChanges": false,
  "descriptionFormat": "all",
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false
}

Input parameters

Parameter Type Default Description
query string β€” Keyword to match against the market question, both outcome subtitles and the tickers (case-insensitive substring). Leave empty to browse every open market, or combine with Series ticker to browse one series.
seriesTicker string β€” Return only markets from one series, e.g. KXFED (Fed funds rate), KXNFLGAME (NFL games), KXBIGGESTQUAKE (daily earthquakes). Leave empty to return the whole open-market feed. For several series at once, paste a JSON array: ["KXFED","KXNFLGAME"].
category enum "" Return only markets in this category. The exchange indexes its series by category, so the actor asks it for that category's series and fetches only those β€” it does not scan the whole feed and discard the rest. Typing a close variant works too ("weather" finds Climate and Weather); an unrecognised one stops the run and lists the valid names rather than returning nothing.
status enum "open" Which markets to return. Was previously fixed to "open", which put closed and settled markets β€” the whole historical and settlement use case β€” out of reach.
excludeMultivariate boolean true Kalshi auto-generates enormous numbers of multi-leg parlay markets (KXMVECROSSCATEGORY…). Measured on the live feed they are 98.6% of all open markets and almost none of them trade. On by default so a run returns markets a person recognises.
minVolume24h integer β€” Drop markets that traded fewer than this many contracts in the last 24h. Use 1 to keep only markets that traded at all today.
minVolume integer β€” Drop markets with less total volume than this.
minOpenInterest integer β€” Outstanding contracts. A better liveness signal than volume β€” it says money is still at risk, not merely that a trade once happened.
minLiquidity integer β€” Resting order-book depth in dollars. Note: the open-markets feed reports 0 here for most markets, so a non-zero value filters hard.
maxResults integer 200 Maximum number of markets to return. The exchange carries about 103,000 tradable markets and 0 returns all of them, which is a long run β€” a measured run delivered 30,000 in 55 minutes, and how long a full sweep takes varies a great deal from run to run. Most of the exchange is auto-generated combination markets, which are excluded by default, so narrowing by Category or Series Ticker is what makes a large run quick.
includeOrderBook boolean false Resting bids on both sides, with best price and total depth. COSTS ONE EXTRA REQUEST PER MARKET returned β€” a 1,000-row run is 1,000 extra requests.
orderBookDepth integer 10 Price levels per side. Only used when the order book is on.
includeTrades boolean false The public trade tape for each market: time, side, size, price, and whether it was a block trade. No trader identity exists in this data β€” Kalshi publishes none. COSTS ONE EXTRA REQUEST PER MARKET.
tradesLimit integer 20 Newest trades to keep per market. Only used when trades are on.
includeCandles boolean false OHLC candles with open interest and volume per period. COSTS ONE EXTRA REQUEST PER MARKET.
candleLookbackHours integer 24 How far back to fetch OHLC candles, in hours. Long windows at fine periods are split into several requests per market and fetched in sequence, so they work but they take time: 24 hours of hourly candles is one request, while 90 days of 1-minute candles is 26 requests and about 5 seconds for a single market.
candlePeriodMinutes enum "60" Candle size. The exchange supports exactly three: 1 minute, 1 hour and 1 day β€” anything else is rejected outright. Finer candles over a long lookback mean more requests per market; see Candle Lookback Hours.
startUrls array β€” One or more direct search or listing detail URLs to process. When set, other search filters are ignored.
compact boolean false Core fields only β€” ticker, title, status, quote, volume and dates (for AI-agent/MCP workflows).
excludeEmptyFields boolean false Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.
incrementalMode boolean false Compare against the previous run and report what is new, what moved, and what closed. stateKey is optional β€” it defaults to a value derived from the series you are tracking, so different series never share state.
stateKey string β€” Optional. Stable identifier for the tracked set of markets. Leave empty to auto-generate it from the series you selected.
telegramToken string β€” Telegram bot token (from @BotFather). Required for Telegram notifications.
telegramChatId string β€” Telegram chat or channel ID (e.g. "-100123456789"). Required when telegramToken is set.
discordWebhookUrl string β€” Discord incoming webhook URL. Server Settings β†’ Integrations β†’ Webhooks β†’ New Webhook.
slackWebhookUrl string β€” Slack incoming webhook URL. api.slack.com/messaging/webhooks.
notificationLimit integer 5 Maximum number of markets included in each notification message (1–20).
notifyOnlyChanges boolean false When Incremental Mode is on, only send notifications for NEW and UPDATED markets. Has no effect outside incremental mode.
whatsappAccessToken string β€” WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h (service-conversation window β€” free since Nov 2024).
whatsappPhoneNumberId string β€” Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set.
whatsappTo string β€” Recipient phone in E.164 format without + (e.g. "436641234567"). Recipient must have messaged your business number within last 24h.
webhookUrl string β€” Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n / Make / Zapier / custom backends.
webhookHeaders object β€” Optional JSON object of custom headers (e.g. {"Authorization":"Bearer ..."}).
appConnector string β€” Optional. Pick a connected app under Settings β†’ API & Integrations to receive your results. Best-effort across MCP connectors as Apify expands its catalog.
mcpIssueTeam string β€” Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one.
descriptionFormat enum "all" Choose which representation of the listing description to include. all keeps every variant; the others keep only the selected one.
emitUnchanged boolean false When incremental mode is on, also emit listings whose content has not changed since the last run. Markets that vanish from the exchange are marked inactive in state but are not emitted as rows.
emitExpired boolean false Also return a row for markets that were in a previous run but are gone now. The row carries the market ticker, when it disappeared and your state key β€” not a price, because the market is no longer there to have one. Requires Incremental Mode and a run that saw the whole set.
skipReposts boolean false In incremental mode, skip listings that appear to be reposts of a previously-seen expired listing with matching details.

Output fields

Every listing returns the same 57-field schema. Missing values are null β€” never omitted.

  • ticker
  • eventTicker
  • title
  • status
  • result
  • marketUrl
  • portalUrl
  • sourceApiUrl
  • yesSubtitle
  • noSubtitle
  • marketType
  • rulesSecondary
  • yesBid
  • yesAsk
  • noBid
  • noAsk
  • yesBidSize
  • yesAskSize
  • lastPrice
  • previousPrice
  • midPrice
  • spread
  • impliedProbability
  • priceChange
  • hoursToClose
  • previousYesBid
  • previousYesAsk
  • liquidity
  • volume
  • volume24h
  • openInterest
  • notionalValue
  • openTime
  • closeTime
  • expirationTime
  • expectedExpirationTime
  • latestExpirationTime
  • createdTime
  • updatedTime
  • canCloseEarly
  • isProvisional
  • strikeType
  • priceLevelStructure
  • settlementTimerSeconds
  • customStrikeJson
  • priceRangesJson
  • mveCollectionTicker
  • mveLegs
  • rawJson
  • listingId
  • searchQuery
  • contentQuality
  • detailFetched
  • scrapedAt
  • source
  • contentHash
  • changeType

Sample output

One object per listing. Here is a real example from a production run:

{
  "ticker": "KXFED-27APR-T4.25",
  "eventTicker": "KXFED-27APR",
  "title": "Will the upper bound of the federal funds rate be above 4.25% following the Fed's Apr 28, 2027 meeting?",
  "status": "active",
  "result": null,
  "marketUrl": "https://kalshi.com/markets/kxfed",
  "portalUrl": "https://kalshi.com/markets/kxfed",
  "sourceApiUrl": "https://api.elections.kalshi.com/trade-api/v2/markets/KXFED-27APR-T4.25",
  "yesSubtitle": "Above 4.25%",
  "noSubtitle": "Above 4.25%",
  "marketType": "binary",
  "rulesSecondary": "This market will expire the first 2:05 PM ET following the release of a Federal Reserve statement for their Apr 28, 2027 meeting or one week following the last day of that meeting."
}

Truncated β€” full records contain 57 fields. See Output fields for the complete schema.

Try Kalshi Scraper [Just πŸ’°$0.80/1k] now β€” $5 free credit, no credit card β†’


Pricing

Pay only for what you extract. No subscription required β€” Apify's free $5 credit covers thousands of results.

Event Price (USD)
Actor Start $0.001
Result $0.0008

See the actor on Apify for current pricing.


FAQ

How do I scrape kalshi.com? Use this actor on Apify to extract structured data from kalshi.com. Configure your search query and filters in the input, then click Start β€” no coding required.

How do I get kalshi.com data as JSON, CSV, or Excel? The actor writes each listing to Apify's dataset. Download as JSON, CSV, or Excel from the Console, stream via the API, or push to Make, Zapier, Airbyte, or Keboola.

Is it legal to scrape kalshi.com? Web scraping of publicly available data is generally legal. This actor only accesses publicly visible information. Always check kalshi.com's terms of service for your specific use case.

How much does it cost? Pay-per-event pricing β€” you only pay for ${NOUNS} extracted. Apify's free $5 credit is enough to run thousands of results before you pay anything.

How does incremental mode work? Each listing gets a content hash. On subsequent runs, only new or changed listings are emitted β€” saving time, compute, and storage. Expired listings can be tracked separately.

Do I need an API key or credentials? No. Just sign up for Apify, paste your input, and click Start. No credit card required.


Related products by Black Falcon Data

Browse all Black Falcon Data actors β†’


Getting started with Apify

New to Apify? Create a free account with $5 credit β€” no credit card required.

  1. Sign up β€” $5 platform credit included
  2. Open Kalshi Scraper [Just πŸ’°$0.80/1k] and configure your input
  3. Click Start β€” export results as JSON, CSV, or Excel

Need more later? See Apify pricing.


About Black Falcon Data

Black Falcon Data builds production-grade web scrapers for job boards and marketplace data. Browse our full actor catalog at www.blackfalcondata.com.


Last updated: 2026 09

About

Kalshi Scraper pulls prediction-market odds from kalshi.com: implied probability, yes/no bid and ask, spread, volume, open interest and settlement results. Covers all ~103,000 tradable markets including weather, plus order book, trades and OHLC candles on request.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors