Prediction Markets Scraper (Kalshi + Polymarket) avatar

Prediction Markets Scraper (Kalshi + Polymarket)

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Prediction Markets Scraper (Kalshi + Polymarket)

Prediction Markets Scraper (Kalshi + Polymarket)

Kalshi and Polymarket odds in one run: prices, implied probability, volume, open interest, order book and daily history, plus matched cross-venue pairs with the price spread. Public market data, no login. Bounded retries; failed venues are never charged.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

signal clear

signal clear

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Categories

Share

Get a snapshot of Kalshi and Polymarket in one run: each market's prices, implied probability, bid and ask, volume, open interest or liquidity, open and close times, and the outcome once it resolves. You can also add the order book and daily price history.

When both venues list the same question, the Actor adds a pair row with both Yes prices and the spread between them. NFL games, Super Bowl futures, NBA games and presidential nominations are the usual pairs.

  • Both venues in one dataset, normalized to one schema (prices from 0 to 1).
  • Cross-venue pairs with the spread, sorted from widest to narrowest.
  • Bounded: every request has a timeout, every source has an attempt cap, and the market count per venue is capped.
  • A venue or keyword that fails is never charged. Its rows are dropped, and the failure is recorded in the FAILED_SOURCES record.
  • Public market data only, from the venues' own public APIs. No login, no API key, no account data.

Input

FieldDefaultWhat it does
venuesbothboth, kalshi or polymarket. Pairs need both.
queryemptyOne keyword per line, such as nfl, super bowl, fed rate or bitcoin. Each line runs as its own source on each venue. Leave it empty to get the most-traded markets.
categoryemptysports, politics, elections, economics, finance, weather, climate, crypto, entertainment, tech, science, business, world, health, commodities or ai. Any other value is tried as a Polymarket tag, such as nba. Kalshi doesn't know those tags, so the Kalshi part fails and isn't charged.
statusopenopen, closed (includes resolved markets) or all.
minVolume0Skips markets whose lifetime volume is lower. Kalshi counts contracts and Polymarket counts US dollars.
matchAcrossVenuestrueAdds the type: pair rows.
includeOrderbookfalseAdds the top 5 levels on each side, total depth and the spread. Costs one extra request per market.
includeHistory / historyDaysfalse / 30Adds one Yes price per day for up to 90 days. Costs one extra request per market.
maxMarketsPerVenue500The cap for each venue and each keyword.
maxItemsnoneA hard cap on rows for the whole run, markets and pairs together. Pairs are written last.
maxConcurrency4The number of requests in flight to each venue at once.
maxAttempts3 (max 5)Each attempt uses a fresh proxy session and reuses what earlier attempts already fetched.
requestTimeoutSecs30The timeout for each request.
proxyConfigurationApify proxyDatacenter is enough. Residential isn't needed.

Example:

{
"venues": "both",
"query": ["nfl", "super bowl"],
"category": "sports",
"maxMarketsPerVenue": 200,
"matchAcrossVenues": true
}

Output

There are two row types. The dataset has a Markets view and a Cross-venue pairs view.

Market row (type: market)

{
"type": "market",
"venue": "kalshi",
"marketId": "KXNFLGAME-26OCT29CARGB-GB",
"ticker": "KXNFLGAME-26OCT29CARGB-GB",
"eventId": "KXNFLGAME-26OCT29CARGB",
"seriesTicker": "KXNFLGAME",
"title": "Green Bay wins",
"eventTitle": "Carolina vs Green Bay",
"subtitle": "Green Bay",
"rulesSummary": "If Green Bay wins the Carolina vs Green Bay Pro Football game originally scheduled for Oct 29, 2026, then the market resolves to Yes.",
"category": "Sports",
"tags": ["Pro Football"],
"status": "open",
"outcomes": [
{"name": "Yes", "price": 0.645, "impliedProbability": 0.645},
{"name": "No", "price": 0.355, "impliedProbability": 0.355}
],
"yesPrice": 0.645,
"noPrice": 0.355,
"lastPrice": 0.65,
"bestBid": 0.64,
"bestAsk": 0.65,
"volume": 300707.87,
"volume24h": 112288.41,
"volumeUnit": "contracts",
"openInterest": 264523.06,
"openTime": "2026-10-20T04:06:00Z",
"closeTime": "2026-11-01T00:15:00Z",
"resolutionTime": "2026-10-30T03:15:00Z",
"resolvedOutcome": null,
"url": "https://kalshi.com/markets/kxnflgame",
"query": "nfl",
"scrapedAt": "2026-10-28T20:25:46Z"
}

Polymarket rows have the same fields. slug replaces ticker, outcomePrices lists every outcome's price, liquidity is in US dollars and volumeUnit is usd. Markets that aren't Yes/No, such as "Panthers vs. Packers" or an over/under, have yesPrice: null and carry their prices in outcomes.

How prices are set:

  • Polymarket: yesPrice is the displayed outcome price, the same one the venue shows.
  • Kalshi: yesPrice is the bid/ask midpoint when the book is tight (10 cents or less). Otherwise it is the last trade.
  • impliedProbability: each outcome's price divided by the sum of all outcome prices.
  • Order book on: orderbook holds bids, asks, bidDepth, askDepth and spread.
  • History on: priceHistory holds [{date, price}]. Kalshi also gives the day's closing bid, ask, volume and open interest.

Pair row (type: pair)

{
"type": "pair",
"title": "Browns vs. Steelers - Browns",
"kalshiTitle": "Cleveland wins",
"polymarketTitle": "Browns vs. Steelers",
"polymarketOutcome": "Browns",
"kalshiTicker": "KXNFLGAME-26NOV01CLEPIT-CLE",
"polymarketId": "5603316",
"kalshiYes": 0.365,
"polymarketYes": 0.355,
"spread": -0.01,
"absSpread": 0.01,
"matchMethod": "game",
"matchScore": 1.0,
"closeTimes": {"kalshi": "2026-11-01T21:00:00Z", "polymarket": "2026-11-01T18:00:00Z"},
"kalshiUrl": "https://kalshi.com/markets/kxnflgame",
"polymarketUrl": "https://polymarket.com/event/nfl-cle-pit-2026-11-01",
"scrapedAt": "2026-10-28T20:25:46Z"
}

spread is the Polymarket Yes price minus the Kalshi Yes price. A positive spread means Polymarket prices the outcome higher.

How pairing works, and its limits

Pairs are built only from markets saved in the same run, so both venues must return the markets in question. The Actor uses two methods.

  1. Games (matchMethod: game). The Actor reads league, date and team codes from the Kalshi ticker (KXNFLGAME-26NOV01CLEPIT-CLE) and from the Polymarket moneyline slug (nfl-cle-pit-2026-11-01). The dates may differ by one day, because Kalshi dates games in US Eastern time and Polymarket uses UTC. Each team's Kalshi Yes price is compared with that team's Polymarket outcome price. Spreads, totals and player props are not paired.

  2. Everything else (matchMethod: title). The Actor tokenizes both titles and weights the tokens by rarity, so a team or candidate name counts more than "champion". A candidate pair must:

    • agree on years and thresholds (35+ never pairs with 40+);
    • agree on Kalshi's city initials ("Los Angeles C" pairs with the Chargers, not the Rams);
    • resolve within 3 days of each other, or within half the time left until the earlier close for long-dated futures;
    • score at least 0.6.

    Pairs are then picked one-to-one, best score first.

Limits:

  • Matching is fuzzy. Two markets can look alike and still settle on different rules or sources, or at different times. "Win the championship" and "win the Super Bowl" usually mean the same thing, but not always. Read both markets' rules before acting on a spread. This is a research tool and gives no trading signal.
  • Prices are a snapshot. Thin books move, and a wide spread on a low-volume market is often just stale.
  • Kalshi has no search and no volume sort. The Actor visits Kalshi's most-traded series first (by lifetime volume) and matches your keyword against series and event titles, tickers and tags. A small maxMarketsPerVenue can stop before it reaches the markets that Polymarket returned. Use the same keyword and category on both venues, and raise the cap if pairs are missing.

Pricing

You pay per result: each market row and each pair row counts once. A venue or keyword that fails after every attempt writes no rows, so it costs nothing beyond the run's compute. It is listed in FAILED_SOURCES as {venue, query, category, error, attempts}. The run fails (exit 1) only when every source failed. Otherwise the status line reads, for example, 200 markets (+16 pairs) from 2 venues saved, 0 failed (not charged).

Each source needs only a few requests. Kalshi's series catalog is the largest download, fetched once per run: about 0.3 MB compressed for Sports and about 1.8 MB without one. A keyword works without a category; setting one narrows the results and makes the run a little faster. The order book and history each add one request per market.

This Actor reads public market data from Kalshi's and Polymarket's public, unauthenticated APIs. It uses no login, no account, no API key and no personal data. It keeps its requests under the venues' published rate limits and backs off on HTTP 429. Your use of the data is governed by each venue's terms. This is not financial, investment or betting advice. Prediction-market trading is restricted in some places. Check what applies to you.