Prediction Market Data Suite (Polymarket + Kalshi) avatar

Prediction Market Data Suite (Polymarket + Kalshi)

Pricing

Pay per event

Go to Apify Store
Prediction Market Data Suite (Polymarket + Kalshi)

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

kyle herman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

3 days ago

Last modified

Categories

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_id convention per platform (Polymarket conditionId, Kalshi ticker)
  • Pagination, retries with backoff, and rate-limit courtesy built in

Modes

Set the mode input field:

ModeWhat it returnsKey inputs
markets (default)Active/closed/settled market listings with current outcome pricesplatforms, status, keyword, maxResults
orderbookBid/ask depth per marketmarketIds
tradesRecent trades per marketmarketIds, limit
resolutionsSettled markets with their official outcomeplatforms, keyword, maxResults

Unified output schemas

markets / resolutions rows

FieldTypeNotes
platformstringpolymarket or kalshi
market_idstringPolymarket conditionId (0x…) or Kalshi ticker
slug_or_tickerstringPolymarket slug / Kalshi ticker
questionstringHuman-readable market question
outcomesarray[{name, price_prob}], price_prob ∈ [0, 1]
volume_usdnumberPolymarket USD volume; Kalshi contract volume (each contract settles at $1)
liquidity_usdnumber | nullnull for Kalshi (not exposed by public API)
statusstringactive | closed | settled
close_time_utcstringISO-8601
resolved_outcomestring | nulle.g. Yes / No / Over — only for settled markets
urlstringPublic market page
fetched_atstringISO-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

FieldTypeNotes
platform, market_idstringCLOB token id (Polymarket) or ticker (Kalshi)
sidestringbid or ask, in YES-probability space
price_probnumber[0, 1]. Kalshi NO bids are converted to YES asks at 1 − p
sizenumberShares (Polymarket) / contracts (Kalshi)
tsstringBook timestamp (ISO-8601)

trades rows

FieldTypeNotes
platform, market_idstringconditionId (Polymarket) or ticker (Kalshi)
sidestringbuy/sell. Kalshi normalized to YES-space: taker bought YES → buy
outcomestringTraded outcome name
price_probnumber[0, 1]
sizenumberShares / contracts
takerstring | nullPolymarket proxy wallet; null on Kalshi (identity not public)
tsstringISO-8601
trade_idstringTx 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

  1. Add the Apify node (or a generic HTTP Request node).
  2. HTTP Request: POST https://api.apify.com/v2/acts/<username>~prediction-market-data-suite/run-sync-get-dataset-items
  3. Auth: query param token={{ $env.APIFY_TOKEN }}.
  4. JSON body: { "mode": "markets", "keyword": "fed", "maxResults": 100 }.
  5. 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.
  • maxResults caps 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: false to 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.