Prediction Markets Data: Kalshi and Polymarket Odds API
Pricing
Pay per event
Prediction Markets Data: Kalshi and Polymarket Odds API
Get Kalshi and Polymarket prediction market odds, prices, volume, order books and price history in one clean schema. Filter by category, keyword, status and minimum volume. Official public APIs, no login.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Hay Equipos
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Pull live and historical prediction market data from Kalshi and Polymarket in one clean, normalized table. Every row is one market with its implied probability, best bid and ask, last price, volume, liquidity, close time and a link. Optionally add an order book snapshot and a price history series for each market.
The actor reads only the exchanges' official public market data APIs. No login, no cookies, no account, no personal data.
What you can do with it
- Track the odds on elections, Fed decisions, inflation prints, sports, weather and more across both exchanges at once.
- Compare the same question on Kalshi and Polymarket to spot price gaps.
- Feed forecasting models, trading bots, dashboards or AI agents with a steady, consistent schema.
- Pull daily or hourly price history for backtests and charts.
- Snapshot the order book to measure depth and spread.
How it works
- Choose the exchanges, the market status (open, closed or settled) and your filters: keyword, categories and minimum volume.
- The actor scans the exchange listings, applies your filters and keeps the markets with the highest total volume, up to your limit per exchange.
- If you ask for them, it adds an order book snapshot and a price history for the Yes side of each market.
- Results land in the dataset. Export them as JSON, CSV, Excel or through the API.
Input example
{"sources": ["kalshi", "polymarket"],"keyword": "fed","categories": ["Economics", "Economy"],"status": "open","minVolume": 1000,"maxMarkets": 25,"includeOrderBook": true,"orderBookDepth": 5,"includePriceHistory": true,"historyDays": 7,"historyInterval": "1d"}
| Field | What it does |
|---|---|
sources | kalshi, polymarket or both |
keyword | Keeps markets whose question, event title or outcome contains this text |
categories | Kalshi categories (Politics, Economics, Sports, Climate and Weather, Financials and so on) or Polymarket tags (Politics, Crypto, Sports, Economy and so on). Case insensitive |
status | open, closed or settled (settled applies to Kalshi; on Polymarket it is treated as closed) |
minVolume | Minimum total volume. Kalshi counts contracts, Polymarket counts US dollars |
maxMarkets | Maximum markets per exchange, highest volume first |
includeOrderBook, orderBookDepth | Adds the top bids and asks for the Yes side |
includePriceHistory, historyDays, historyInterval | Adds hourly or daily Yes prices for the last N days |
maxPagesPerSource | Safety cap on listing pages scanned per exchange (default 80) |
Output example
{"source": "kalshi","marketId": "KXLAYOFFSYINFO-26-494000","marketUrl": "https://kalshi.com/markets/kxlayoffsyinfo","eventId": "KXLAYOFFSYINFO-26","eventTitle": "More tech layoffs in 2026 than in 2025?","question": "More tech layoffs in 2026 than in 2025?","outcomeLabel": "Yes","category": "Economics","tags": ["Economics"],"status": "open","result": null,"openTime": "2026-02-25T15:00:00Z","closeTime": "2027-03-01T15:00:00Z","yesBid": 0.948,"yesAsk": 0.954,"lastPrice": 0.949,"impliedProbability": 0.951,"volume": 31479865.08,"volume24h": 1360.67,"volumeUnit": "contracts","liquidityUsd": 0,"openInterest": 166499.19,"outcomes": [{ "name": "Yes", "price": 0.951, "tokenId": null },{ "name": "No", "price": 0.049, "tokenId": null }],"orderBook": {"side": "yes","sizeUnit": "contracts","bids": [{ "price": 0.948, "size": 86.25 }],"asks": [{ "price": 0.954, "size": 6.7 }],"snapshotAt": "2026-09-27T05:35:59.368Z"},"priceHistory": [{ "timestamp": "2026-09-26T04:00:00.000Z", "price": 0.955, "yesBid": 0.951, "yesAsk": 0.955, "volume": 102.3 }],"scrapedAt": "2026-09-27T05:35:33.086Z"}
Prices are in US dollars per share or contract, from 0 to 1, so a price of 0.62 means the market puts the Yes outcome at about 62%. impliedProbability is the midpoint of the best bid and ask when both exist, otherwise the last price (Kalshi) or the listed outcome price (Polymarket).
Polymarket rows carry the real outcome names and CLOB token ids in outcomes, which is useful for multi outcome markets.
Pricing
Pay per event, no subscription and no charge for platform usage:
| Event | Price |
|---|---|
| Market record saved | $0.001 (that is $1 per 1,000 markets) |
| Order book snapshot added | $0.001 per market |
| Price history added | $0.001 per market |
A daily pull of the top 100 markets on both exchanges with order books costs about $0.40. You can cap your spend with the maximum charge setting on each run; the actor stops cleanly when the cap is reached.
Limits
- Kalshi does not offer server side keyword search, so the actor scans all listing pages for the chosen status (about 65 pages and 120,000 markets for open markets, which takes around 30 seconds). Closed and settled history is very large; raise
maxPagesPerSourceto go deeper. - Kalshi volume is counted in contracts and Polymarket volume in US dollars. The
volumeUnitfield says which. - Order book and price history cover the Yes side (the first outcome on Polymarket). The No side is the mirror image on binary markets.
- Kalshi multi leg combo markets (parlays) are not included.
- Data is as published by each exchange at the time of the run. This is market data, not investment advice.
- Not affiliated with Kalshi or Polymarket.
FAQ
Do I need a Kalshi or Polymarket account? No. The actor reads only public market data.
Can I run it on a schedule? Yes. Use Apify schedules to run it hourly or daily and send results to Google Sheets, a webhook or your database.
Why is Polymarket missing from my results? Polymarket blocks some countries at the network level. Apify's servers are not affected, but if you run the actor on your own machine in a blocked country, the Polymarket part will fail and Kalshi results are still saved. The run log names any exchange that failed.
How do I match the same question across exchanges? Filter both with the same keyword and compare question, closeTime and impliedProbability. Each exchange words its markets differently, so automatic matching is not attempted.
Something broke or you need a field added? Open an issue on the actor's Issues tab. Issues are answered quickly.