Kalshi & Polymarket Prediction Market Odds & Volume Scraper avatar

Kalshi & Polymarket Prediction Market Odds & Volume Scraper

Pricing

from $3.50 / 1,000 market rows

Go to Apify Store
Kalshi & Polymarket Prediction Market Odds & Volume Scraper

Kalshi & Polymarket Prediction Market Odds & Volume Scraper

Scrape Kalshi and Polymarket prediction markets into one clean dataset: live odds, 24h volume, open interest, liquidity, close time and category. One row per market, ranked by volume. Official public APIs, no browser, no login. Export as JSON, CSV or Excel.

Pricing

from $3.50 / 1,000 market rows

Rating

0.0

(0)

Developer

The Agent Loop

The Agent Loop

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Features

Limited permissions

Share

Export live prediction-market data from Kalshi and Polymarket into one normalized dataset.

The actor reads each venue's official public API, normalizes each market into one row, filters out zero-value noise, and ranks markets by 24h volume. No browser, no HTML parsing, and no login.

If you need Kalshi market data and Polymarket market data in the same table, this replaces two API integrations with one run.

  • Two venues in one schema, so the same event can be compared without joining two exports.
  • Official public APIs, not HTML scraping. No browser, no login, no proxy.
  • Every volume and open-interest number carries its source, so you know when a venue publishes it only at the event level.
  • If one venue fails, the run still returns the other and records the failure in VENUE_STATUS.

What you get

One row per market with:

  • venue: kalshi or polymarket
  • event_id, event_title, category
  • market_id, market_name, question, subtitle
  • status, result
  • yes_price, no_price (0 to 1)
  • yes_bid, yes_ask, no_bid, no_ask, last_price
  • volume, volume_24h, open_interest, liquidity
  • close_time
  • url
  • volume_rank, rank
  • fetched_at

volume_24h_source and open_interest_source tell you whether the number came from the market itself or from its parent event. Polymarket publishes 24h volume per market but sometimes only publishes open interest at the event level, so the field is explicit instead of guessed. Polymarket category is null when the API does not attach tags to the event.

How it works

  • Kalshi: GET /trade-api/v2/events with with_nested_markets=true. This endpoint excludes multivariate combo events, which is what makes the output useful instead of a wall of zero-liquidity parlays.
  • Polymarket: GET /markets from the Gamma API, ordered by volume24hr. Each market carries its own 24h volume plus an embedded event with the id, title and slug used for the event fields and the public URL.
  • Both sources are fetched in parallel. If one venue fails, the run still returns the other venue and writes the failure to VENUE_STATUS in the key-value store.
  • Markets are filtered by status, optional text query and optional minimum 24h volume, then sorted by 24h volume and capped per venue.

Input example

{
"includeKalshi": true,
"includePolymarket": true,
"query": "",
"status": "open",
"maxMarketsPerVenue": 50,
"scanItemsPerVenue": 1000,
"minVolume24h": 0
}

Input fields

FieldTypeDefaultMeaning
includeKalshibooleantrueRead Kalshi.
includePolymarketbooleantrueRead Polymarket.
querystring""Whole-word text filter on question, event title, subtitle, category and market id. All words must match, so fed rate needs both.
statusstring"open"open, closed or all.
maxMarketsPerVenueinteger50Cap after ranking by 24h volume.
scanItemsPerVenueinteger1000Items read before ranking: events for Kalshi, markets for Polymarket. Higher means broader coverage and a slower run.
minVolume24hnumber0Drop markets below this 24h volume.

How the search filter matches

The filter compares whole words, not substrings. fed matches "Will the Fed cut rates" and ignores "federally legal", so a rate query stays on rates. Common suffixes are accepted, so election still finds "elections".

Only the readable fields are searched: market name, question, event title, subtitle and category. Tickers are skipped, so a market whose id happens to contain FED does not show up under a Fed query.

Every word in the filter has to match somewhere in the row. fed rate returns markets that contain both words. An empty filter keeps everything.

Output example

{
"venue": "kalshi",
"event_id": "KXPRESNOMD-28",
"event_title": "2028 Democratic presidential nominee",
"category": "Elections",
"market_id": "KXPRESNOMD-28-JS",
"market_name": "Will Josh Shapiro be the Democratic Presidential nominee in 2028?",
"question": "Will Josh Shapiro be the Democratic Presidential nominee in 2028?",
"subtitle": "Josh Shapiro",
"status": "active",
"result": null,
"yes_price": 0.0465,
"no_price": 0.9535,
"yes_bid": 0.046,
"yes_ask": 0.047,
"no_bid": 0.953,
"no_ask": 0.954,
"last_price": 0.047,
"volume": 6210635.38,
"volume_24h": 317808.44,
"volume_24h_source": "market",
"open_interest": 4108921.41,
"open_interest_source": "market",
"liquidity": null,
"close_time": "2028-11-07T15:00:00Z",
"url": "https://kalshi.com/markets/kxpresnomd",
"volume_rank": 1,
"rank": 28,
"fetched_at": "2026-10-25T10:36:11.198068+00:00"
}

This is a verbatim row from default run 2hgpBVAZtAy2CcbxU (dataset qc4H2edw5Av2Xfg88), not an illustrative example.

Common uses

  • Track odds and volume across two prediction markets in one table.
  • Feed an AI agent or dashboard with a clean market snapshot.
  • Compare pricing on the same event when both venues list it.
  • Build a dataset of resolved markets for calibration research.

Ready-made tasks

Nine public tasks are preconfigured. Open one and press Start; no input editing needed.

TaskWhat it returnsRows in the published runCost at list price
Kalshi vs Polymarket oddsTop 10 markets from each venue, side by side20$0.10
Election prediction marketsOpen election markets from both venues50$0.25
Fed interest rate oddsFed funds and FOMC rate markets20$0.10
Senate and House control oddsParty control markets for the 2026 midterms20$0.10
Trump prediction marketsPresidency, policy and appointment markets20$0.10
NBA championship oddsChampionship, franchise and player markets20$0.10
Champions League oddsChampions League and Premier League winners20$0.10
Bitcoin price marketsStrike levels, ranges and deadlines13$0.07
UFC prediction marketsFight cards and champion markets4$0.02

The row counts come from the published task runs on 2026-10-26. A later run can return more or fewer rows as markets open and close, which is why the UFC task shows four rows between fight cards and 38 during one.

Pricing

Pay per event: $0.005 per market row written to the dataset. You are charged only for rows actually written. If a venue fails or a filter removes everything, you pay for nothing.

TierPrice per rowDiscount
Free$0.005list price
Bronze$0.004510%
Silver$0.004020%
Gold$0.003530%

Apify applies the tier automatically based on your subscription. The run page shows the maximum charge before you start, and the actor stops writing rows when your budget is reached.

Typical costs at the list price:

RowsCost
20$0.10
50$0.25
100$0.50
200$1.00

A default run returns up to 50 markets per venue (100 rows) and costs about $0.50. Set maxMarketsPerVenue lower for a cheaper run.

Run on a schedule

Apify can run the actor on a schedule and keep each snapshot in a dataset:

  1. Open the actor in Apify Console.
  2. Use Schedule to pick an interval, for example every day at 00:00 UTC.
  3. Set maxMarketsPerVenue to the number of markets you want per snapshot.

Each run returns a fresh snapshot. The actor doesn't stream changes and doesn't store history across runs; use the run's dataset for that.

Use with AI agents

The actor is available through the Apify MCP server, so an agent can find it and call it without a browser.

Ask your agent to search for kalshi polymarket and call the actor with the input above. The default dataset is JSON, and the actor page also exposes CSV and Excel exports.

Questions people ask before running it

Do I need a Kalshi API key or a Polymarket API key? No. Both sides are read through public endpoints. There is no signup, no token and no account to connect.

Can I export the result as CSV or Excel? Yes. Every run writes a dataset, and the dataset page exports JSON, CSV, JSONL and Excel.

Does it return historical prices? No. A run is a snapshot of markets that are open or closed at that moment. It doesn't backfill past prices or store a time series between runs. If you need history, schedule the actor and keep each run's dataset.

Can I get only one event, or one league? Yes. Set query to a word from the event title, for example fed, nba or midterm. The filter reads the question, event title, subtitle, category and market id.

Why is liquidity or open_interest null on some Polymarket rows? Polymarket does not publish every field at market level. The actor records what the venue publishes and marks the source in volume_24h_source and open_interest_source instead of filling the gap with a guess.

Can I get resolved markets? Yes. Set status to closed. The result field carries the outcome when the venue publishes one.

What happens when Polymarket blocks the request? Some networks get a legal block (HTTP 451) from Polymarket. The run still returns Kalshi rows and writes the HTTP status into VENUE_STATUS in the key-value store. It doesn't route around the block with proxies.

Can I run it on a schedule? Yes. Apify schedules run the actor on an interval and keep each snapshot as its own dataset.

What this actor does not do

  • No historical backfill. It reads what the venues publish now, not a price archive.
  • No order book or websocket feed. Each run is a batch snapshot, not a live stream.
  • No wallet, position or PnL data. It reads markets, not traders.
  • No trading. It never places, cancels or settles an order.

Notes and limitations

  • This actor is read-only. It does not place, cancel or settle trades.
  • Kalshi prices are returned as probabilities between 0 and 1. Legacy cent fields are converted automatically.
  • Polymarket can return a legal or geo block (HTTP 451) from some networks. When that happens the actor records the HTTP status in VENUE_STATUS and returns Kalshi data. It does not route around the block with proxies by default.
  • The actor returns market data, not financial advice. Verify anything you trade on at the source.
  • Not affiliated with Kalshi or Polymarket.

Support

Open an issue on the actor page and include the run ID plus the VENUE_STATUS value.