Prediction Market Data Suite (Polymarket + Kalshi)
Pricing
Pay per event
Prediction Market Data Suite (Polymarket + Kalshi)
Unified, normalized prediction-market data from Polymarket and Kalshi: market listings, live prices, orderbooks, recent trades and official resolutions in one cross-platform schema. No auth required.
Pricing
Pay per event
Rating
0.0
(0)
Developer
kyle herman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Share
Prediction Market Data Suite — Polymarket API + Kalshi API in one unified schema
Normalized, cross-platform prediction market data API: market listings, live prices, orderbooks, recent trades and official resolutions from Polymarket and Kalshi — all in a single unified schema, with no API keys or authentication required.
Whether you need a Polymarket scraper, a Kalshi API client, or a combined prediction market data api for research, dashboards, arbitrage monitoring or model training, this actor gives you clean, comparable rows from both platforms:
- Prices always expressed as probabilities in
[0, 1](Kalshi's cent/dollar prices are normalized for you) - Timestamps in ISO-8601 UTC
- One
market_idconvention per platform (PolymarketconditionId, Kalshiticker) - Pagination, retries with backoff, and rate-limit courtesy built in
Modes
Set the mode input field:
| Mode | What it returns | Key inputs |
|---|---|---|
markets (default) | Active/closed/settled market listings with current outcome prices | platforms, status, keyword, maxResults |
orderbook | Bid/ask depth per market | marketIds |
trades | Recent trades per market | marketIds, limit |
resolutions | Settled markets with their official outcome | platforms, keyword, maxResults |
Unified output schemas
markets / resolutions rows
| Field | Type | Notes |
|---|---|---|
platform | string | polymarket or kalshi |
market_id | string | Polymarket conditionId (0x…) or Kalshi ticker |
slug_or_ticker | string | Polymarket slug / Kalshi ticker |
question | string | Human-readable market question |
outcomes | array | [{name, price_prob}], price_prob ∈ [0, 1] |
volume_usd | number | Polymarket USD volume; Kalshi contract volume (each contract settles at $1) |
liquidity_usd | number | null | null for Kalshi (not exposed by public API) |
status | string | active | closed | settled |
close_time_utc | string | ISO-8601 |
resolved_outcome | string | null | e.g. Yes / No / Over — only for settled markets |
url | string | Public market page |
fetched_at | string | ISO-8601 fetch timestamp |
Polymarket rows additionally carry clob_token_ids (use these for orderbook mode); Kalshi rows carry event_ticker and open_interest.
orderbook rows
| Field | Type | Notes |
|---|---|---|
platform, market_id | string | CLOB token id (Polymarket) or ticker (Kalshi) |
side | string | bid or ask, in YES-probability space |
price_prob | number | [0, 1]. Kalshi NO bids are converted to YES asks at 1 − p |
size | number | Shares (Polymarket) / contracts (Kalshi) |
ts | string | Book timestamp (ISO-8601) |
trades rows
| Field | Type | Notes |
|---|---|---|
platform, market_id | string | conditionId (Polymarket) or ticker (Kalshi) |
side | string | buy/sell. Kalshi normalized to YES-space: taker bought YES → buy |
outcome | string | Traded outcome name |
price_prob | number | [0, 1] |
size | number | Shares / contracts |
taker | string | null | Polymarket proxy wallet; null on Kalshi (identity not public) |
ts | string | ISO-8601 |
trade_id | string | Tx hash (Polymarket) / trade id (Kalshi) |
Example inputs
Top 200 active markets on both platforms (this is also the default {} input):
{ "mode": "markets", "platforms": ["polymarket", "kalshi"], "status": "active", "maxResults": 200 }
Bitcoin-related markets only:
{ "mode": "markets", "keyword": "bitcoin", "maxResults": 100 }
Orderbooks — mix Polymarket CLOB token ids and Kalshi tickers freely (auto-detected by format):
{"mode": "orderbook","marketIds": ["71062767620603017016963228301278360791423313061716076409359577603631031433339","KXHIGHNY-26JUL22-T91"]}
Recent trades (Polymarket accepts 0x… conditionIds or CLOB token ids):
{ "mode": "trades", "marketIds": ["0xc0b7319f73f2…", "KXHIGHNY-26JUL22-T91"], "limit": 100 }
Settled markets with official outcomes:
{ "mode": "resolutions", "maxResults": 100 }
Run via API (curl)
curl -X POST "https://api.apify.com/v2/acts/<username>~prediction-market-data-suite/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode": "markets", "keyword": "bitcoin", "maxResults": 50}'
Use in n8n
- Add the Apify node (or a generic HTTP Request node).
- HTTP Request:
POST https://api.apify.com/v2/acts/<username>~prediction-market-data-suite/run-sync-get-dataset-items - Auth: query param
token={{ $env.APIFY_TOKEN }}. - JSON body:
{ "mode": "markets", "keyword": "fed", "maxResults": 100 }. - The node output is the dataset rows — pipe straight into Sheets, Postgres, Slack alerts, etc.
Pagination & limits
- Polymarket (Gamma API): offset pagination, 100 markets/page, sorted by volume.
- Kalshi: cursor pagination, up to 1000 markets/page.
maxResultscaps rows per platform; a hard cap of 40 pages per platform bounds runtime on narrow keyword searches.- A 0.2 s courtesy delay is inserted between pages and per-market requests; 429/5xx responses are retried up to 4 times with exponential backoff.
- Kalshi's list endpoint includes thousands of auto-generated multivariate parlay markets (near-zero liquidity). They are excluded by default; set
kalshiExcludeMultivariate: falseto include them.
Monetization events (PPE)
The actor charges per pushed row: market-row, orderbook-row, trade-row. Local runs are unaffected.
Disclaimer
This is an unofficial tool. It is not affiliated with, endorsed by, or supported by Polymarket or Kalshi. It only calls their public, unauthenticated data endpoints, sends a descriptive User-Agent, and rate-limits itself. Endpoints and schemas may change without notice.
Kalshi data notice: Kalshi's Terms of Service restrict commercial redistribution of their market data by users. This actor is provided as personal-research tooling — you are responsible for ensuring your use of the retrieved data (especially republishing or commercial redistribution) complies with each platform's terms. Polymarket data is on-chain/public but the same diligence applies.
Nothing produced by this actor is financial advice.
FAQ
Do I need a Polymarket or Kalshi account or API key? No. All endpoints used are public and unauthenticated.
Why are Kalshi prices between 0 and 1 instead of cents?
All prices are normalized to probability space [0, 1] so both platforms are directly comparable. Multiply by 100 for cents.
Where do I get the IDs for orderbook/trades mode?
Run markets mode first: Polymarket rows include clob_token_ids and market_id (conditionId); Kalshi rows include market_id (ticker). If you pass no marketIds, the actor auto-picks one liquid market per platform as a demo.
How fresh is the data? Every run fetches live. Schedule the actor (e.g. every 5 minutes) for a continuous feed.
Why is liquidity_usd null for Kalshi?
Kalshi's public market list doesn't expose a comparable USD liquidity figure; use open_interest or the orderbook mode depth instead.
Can I get price history?
Not yet — current snapshot, book, trades and resolutions are covered. Scheduled runs of markets mode build a history in your dataset.
What about other platforms (Manifold, Metaculus, PredictIt)? The schema is platform-extensible; open an issue on the actor page if you need one added.