Polymarket & Kalshi Prediction Market Data, No Login avatar

Polymarket & Kalshi Prediction Market Data, No Login

Pricing

from $3.00 / 1,000 market rows

Go to Apify Store
Polymarket & Kalshi Prediction Market Data, No Login

Polymarket & Kalshi Prediction Market Data, No Login

Polymarket and Kalshi prediction markets in one table: question, outcome prices as implied probabilities, volume, liquidity, open interest, close time, status and URL, with optional price history. Search, filter or look up by ID or URL. No login or API key.

Pricing

from $3.00 / 1,000 market rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Get prediction market data from Polymarket and Kalshi in one table: the question, Yes/No prices as implied probabilities, volume, open interest, close time, status and a link to the market, with optional price history. No login and no API key.

Use it for research, news, dashboards or data science. The smallest run takes a few seconds: pick Polymarket, type election, keep 20 results, click Start.

Prediction Markets Data: Polymarket and Kalshi markets in one table with odds, volume, open interest and price history. No login, no API key.

Table of contents

What it does

The Actor reads the public market data of two prediction markets:

It has two modes:

  1. Find markets. Search by keywords, filter by category and by status (open or closed). You get the most traded markets first.
  2. Look up markets. Paste market IDs, slugs, URLs or tickers. You get each market, and a clear "not found" row for each ID that does not exist.

Both platforms come back in one schema, so you can sort and compare them in one table.

Good fit

  • Track the odds of elections, Fed decisions, crypto prices, sports and other events.
  • Compare the same question on Polymarket and Kalshi.
  • Get daily or hourly Yes-price history for charts and backtests.
  • Check if a market is open, closed or resolved, and which outcome won.

Not a fit / limits

  • No trading, no orders, no account data. This is a read-only data tool.
  • No order book depth and no trade-by-trade history. You get best bid, best ask, last price and a price history.
  • Not real time. You get the values at the moment of the run.
  • Not betting or investment advice.

What data you get

One row per market:

  • Question and event: question, outcomeLabel, eventTitle, category, tags, rules.
  • Prices: outcomes (Yes and No with price and probability), lastTradePrice, bestBid, bestAsk.
  • Activity: volume, volume24h, liquidity, openInterest, volumeUnit.
  • Time and status: openTime, closeTime, status (open, closed, resolved), resolvedOutcome.
  • Links and IDs: url, marketId, marketSlug, conditionId, eventId, seriesTicker.
  • Optional history: priceHistory (timestamp + Yes price) and priceHistoryStatus.
  • Provenance: source, sourceApiUrl, fetchedAt.

Quick start

  1. Open the Input tab.
  2. Keep the prefilled values: Platforms = polymarket, Search = election, Max markets per platform = 20.
  3. Click Start.
  4. Open the Output tab, view Markets. Sort by volume or read outcomes.

Expected result: about 20 election markets with prices and volume, in a few seconds.

To get Kalshi too, add kalshi to Platforms. To look up exact markets, paste IDs or URLs into Market IDs or URLs.

Input

All fields are optional. With an empty input the Actor lists 50 open markets on each platform, the most traded first.

FieldTypeDefault / prefillAllowed valuesWhat it doesRecommendation
platformsarraydefault ["polymarket","kalshi"], prefill ["polymarket"]polymarket, kalshiWhich markets to search.Use both to compare platforms. Ignored in lookup mode.
searchstringnone, prefill electionup to 200 charactersKeywords. Every word must appear in the question, event title, outcome, category or tags.Use 1–3 short words: fed rate, bitcoin, super bowl.
categorystringnoneany category or tag, case-insensitiveKeeps only markets of this category. Polymarket: event tags (Politics, Crypto, Sports, Economy, …). Kalshi: series category (Politics, Elections, Economics, Financials, Crypto, Climate and Weather, Sports, …).Check the category and tags of a first run, then filter.
statusstringopenopen, closedopen: markets that still trade. closed: markets that stopped trading, including resolved ones with the winning outcome.Use closed for results and backtests.
marketIdsarraynoneup to 200 entriesLookup mode. Polymarket market ID (2589812), condition ID (0x…), market or event slug, polymarket.com/event/… URL. Kalshi market, event or series ticker (KXFEDDECISION-26OCT-H0, KXFEDDECISION-26OCT, KXFEDDECISION) or kalshi.com/markets/… URL. Prefix polymarket: or kalshi: if an ID is ambiguous.Use when you already know the markets.
includePriceHistorybooleanfalsetrue, falseAdds the Yes-price history to each market row. One extra request per market, so the run is slower.Turn on for charts.
priceHistoryDaysinteger301–365Days of history, ending now (or at close time for closed markets). 7 days or less = hourly points, more = daily points.30 for trends, 7 for hourly detail.
maxItemsinteger50, prefill 201–1000Maximum market rows per platform. Each row is one paid result.Start small, then raise.

How the settings work together

WhenEffect
marketIds is not emptyLookup mode. search, category, status and platforms are ignored. Each ID names its own platform. maxItems still caps rows per platform: an event or series ID can return many markets.
search + category + statusAll filters apply together. No match → NO_RESULTS, only the start fee is charged.
search is emptyYou get the most traded open markets (or the most recently closed, with status: closed).
Both platforms, large maxItems + historyEach platform gets an equal share of the run time. See Limits.
The same market appears twiceIt is saved and charged once.

Input examples

Find election markets on Polymarket (prefill)

{
"platforms": ["polymarket"],
"search": "election",
"maxItems": 20
}

Expected output: 20 election market rows. Cost: start fee + 20 market rows.

Kalshi economics markets with 30-day history

{
"platforms": ["kalshi"],
"category": "Economics",
"includePriceHistory": true,
"priceHistoryDays": 30,
"maxItems": 50
}

Expected output: up to 50 open Kalshi economics markets, each with about 30 daily Yes prices in priceHistory.

Look up exact markets on both platforms

{
"marketIds": [
"https://polymarket.com/event/fed-decision-in-october-20260617190323537",
"KXFEDDECISION-26OCT",
"kalshi:KXNOPE-99ZZZ"
],
"includePriceHistory": true,
"priceHistoryDays": 90
}

Expected output: all markets of both Fed decision events (one per outcome), with 90 days of history, and one not_found row for kalshi:KXNOPE-99ZZZ.

Resolved markets for a backtest

{
"platforms": ["polymarket", "kalshi"],
"search": "fed",
"status": "closed",
"maxItems": 100
}

Expected output: closed and resolved Fed markets with resolvedOutcome.

Output

The default Dataset has three views. Views choose columns, they do not filter rows: every view lists all rows of the run.

  • Markets — market columns. Lookup-status rows (if any) show here with empty market cells.
  • Price history — market ID, question and the priceHistory list.
  • Not found / invalid IDs — identifier, platform and status columns. Look at rows with recordType: "lookup-status"; market rows show here too. To get only one kind, filter the Dataset by recordType.

Output example (Polymarket market, lookup with history, trimmed)

{
"recordType": "market",
"platform": "polymarket",
"marketId": "2589812",
"marketSlug": "will-there-be-no-change-in-fed-interest-rates-after-the-october-2026-meeting-20260617190324031",
"conditionId": "0xdf9bf27ee5757c55b44b8b9826ddc9ec3a8809aa3278634c45edbb7fc8f1a3e3",
"eventId": "606422",
"eventTitle": "Fed Decision in October?",
"seriesTicker": null,
"question": "Will there be no change in Fed interest rates after the October 2026 meeting?",
"outcomeLabel": "No change",
"category": "Economy",
"tags": ["Fed", "fomc", "Economy", "Fed Rates"],
"outcomes": [
{ "name": "Yes", "price": 0.795, "probability": 0.795 },
{ "name": "No", "price": 0.205, "probability": 0.205 }
],
"lastTradePrice": 0.8,
"bestBid": 0.79,
"bestAsk": 0.8,
"volume": 9190598.64,
"volume24h": 461867.16,
"liquidity": 424329.6,
"openInterest": 3340859.05,
"volumeUnit": "USD",
"openTime": "2026-06-18T00:02:51.727Z",
"closeTime": "2026-10-29T03:59:00.000Z",
"status": "open",
"sourceStatus": "active",
"resolvedOutcome": null,
"rules": "The FED interest rates are defined in this market by the upper bound of the target federal funds range. …",
"url": "https://polymarket.com/event/fed-decision-in-october-20260617190323537/will-there-be-no-change-in-fed-interest-rates-after-the-october-2026-meeting-20260617190324031",
"priceHistoryStatus": "complete",
"priceHistory": [
{ "timestamp": "2026-07-16T00:00:04.000Z", "price": 0.66 },
{ "timestamp": "2026-07-17T00:00:06.000Z", "price": 0.68 }
],
"source": "Polymarket Gamma, CLOB and Data public APIs",
"sourceApiUrl": "https://gamma-api.polymarket.com/events?slug=fed-decision-in-october-20260617190323537",
"fetchedAt": "2026-10-13T18:20:02.515Z"
}

The same run returned this Kalshi row (trimmed):

{
"recordType": "market",
"platform": "kalshi",
"marketId": "KXFEDDECISION-26OCT-H0",
"eventId": "KXFEDDECISION-26OCT",
"eventTitle": "Fed decision in Oct 2026?",
"seriesTicker": "KXFEDDECISION",
"question": "Will the Federal Reserve Hike rates by 0bps at their October 2026 meeting?",
"outcomeLabel": "Fed maintains rate",
"category": "Economics",
"outcomes": [
{ "name": "Yes", "price": 0.81, "probability": 0.81 },
{ "name": "No", "price": 0.19, "probability": 0.19 }
],
"lastTradePrice": 0.81,
"bestBid": 0.81,
"bestAsk": 0.82,
"volume": 4131219.6,
"liquidity": null,
"openInterest": 1571499.2,
"volumeUnit": "contracts",
"status": "open",
"url": "https://kalshi.com/markets/kxfeddecision/kxfeddecision-26oct"
}

A not-found lookup row:

{
"recordType": "lookup-status",
"status": "not_found",
"statusReason": "No Polymarket market or event matches these identifiers",
"errorCode": null,
"queryIds": ["999999999999"],
"fetchedAt": "2026-10-13T18:20:03.528Z"
}

Output fields

FieldTypeCan be null?ExampleMeaning
recordTypestringnomarketmarket or lookup-status.
platformstringno (market rows)kalshipolymarket or kalshi.
marketIdstringno (market rows)KXFEDDECISION-26OCT-H0Polymarket market ID or Kalshi market ticker.
marketSlugstringyeswill-there-be-…Polymarket slug. Null for Kalshi.
conditionIdstringyes0xdf9b…Polymarket condition ID. Null for Kalshi.
eventIdstringyesKXFEDDECISION-26OCTEvent ID (Polymarket) or event ticker (Kalshi).
eventTitlestringyesFed decision in Oct 2026?Title of the event that groups the markets.
seriesTickerstringyesKXFEDDECISIONKalshi series ticker. Null for Polymarket.
questionstringnoWill the Federal Reserve …?The market question.
outcomeLabelstringyesNo changeShort name of this market inside its event.
categorystringyesEconomicsPolymarket: main event category. Kalshi: event category.
tagsarrayno (may be empty)["Fed","Economy"]Polymarket event tags. Empty for Kalshi.
outcomesarrayno[{"name":"Yes","price":0.81,"probability":0.81}, …]Outcome names with price (0–1). probability = price, the crowd-implied chance. price is null when there is no price.
lastTradePricenumberyes0.81Last traded Yes price.
bestBidnumberyes0.79Best Yes bid. Null when there is no bid.
bestAsknumberyes0.8Best Yes ask. Null when there is no ask.
volumenumberyes9190598.64Total traded volume, in volumeUnit.
volume24hnumberyes461867.16Volume in the last 24 hours.
liquiditynumberyes424329.6Polymarket order book liquidity in USD. Null for Kalshi.
openInterestnumberyes1571499.2Open interest. Polymarket: USD. Kalshi: contracts. Null when the source does not return it.
volumeUnitstringnoUSDUSD (Polymarket) or contracts (Kalshi, $1 payout each).
openTimestringyes2026-06-18T00:02:51.727ZWhen trading started (ISO 8601, UTC).
closeTimestringyes2026-10-29T03:59:00.000ZPlanned end of trading. A Polymarket market can resolve early; then this date can still be in the future.
statusstringnoopenopen, closed or resolved.
sourceStatusstringyesactiveThe raw status from the platform.
resolvedOutcomestringyesYesWinning outcome for resolved markets. Null otherwise.
rulesstringyesIf the Federal Reserve …Resolution rules, up to 2,000 characters.
urlstringyes (rare)https://kalshi.com/markets/…Link to the market. Kalshi links go to the event page (Kalshi has no page per market).
priceHistoryStatusstringnocompletecomplete, empty (no trades in the period), unavailable (no history source for this market), error, or not_requested when history is off.
priceHistoryarrayyes[{"timestamp":"…","price":0.66}]Yes price over time. Null when history is off. Days without trades can be missing.
status / statusReason / errorCode / queryIds——not_foundLookup-status rows only: not_found or invalid, a plain reason, and the IDs you sent.
sourcestringnoKalshi public market data APIWhere the row comes from.
sourceApiUrlstringnohttps://api.elections.kalshi.com/…The public API URL used.
fetchedAtstringno2026-10-13T18:20:03.824ZWhen the row was read.

How the Yes price is set. Polymarket: the outcome price that Polymarket itself shows (in most markets the middle of best bid and best ask). Kalshi: the last trade price; the middle of bid and ask when there was no trade. A price is never invented: no data → null, not 0.

Run summary

Each run also saves RUN_SUMMARY in the default Key-value store: status, reason, message, counts per platform, charged rows, warnings and source links. The run status message shows the same short result, for example COMPLETE: 20 market row(s).

statusMeaning
COMPLETERows saved, no problem. Not-found IDs, if any, are listed in the message.
NO_RESULTSThe search ran, but no market matches. Not an error.
NOT_FOUNDLookup mode: none of the IDs exist.
INVALID_INPUTNo ID could be read. Fix the input.
PARTIALSome data is missing. reason is SOURCE_ERROR (a platform failed) or PRICE_HISTORY_ERROR (history failed for some markets).
CAPPEDThe run stopped early: CHARGE_LIMIT (your max charge), DEADLINE (internal time limit) or REQUEST_CAP. Saved rows are kept.
ERRORA platform failed before any row was saved, or a technical error.
CANCELLEDYou stopped the run. Saved rows are kept.

Pricing

Pay per event. You pay only for saved markets, plus a small start fee.

EventPriceWhen
Actor start$0.007Once per run (one event per GB of memory, minimum one; the Actor runs at 256 MB, so one event).
Market row$0.0035 (Free plan), $0.0033 (Bronze), $0.0031 (Silver), $0.003 (Gold and higher)Each saved market row. Price history for that market is included.
Market ID not found$0.0003Each lookup ID the platform does not know.

Invalid IDs (not a Polymarket or Kalshi ID) have no row charge. The Actor start fee is charged on every run, also when all IDs are invalid (INVALID_INPUT). The platform usage (compute) is included in these prices.

Cost examples (Free plan prices)

ScenarioRowsCost
Prefill: 20 election markets20$0.077
10 markets10$0.042
100 markets with 30-day history100$0.357
1,000 markets on one platform1,000$3.507
1,000 + 1,000 markets on both platforms2,000$7.007
Search with no match0$0.007
Lookup of 10 IDs that do not exist0 (10 not found)$0.010

To keep a hard budget, set Max total charge in the run options. The Actor stops before the next paid row and keeps what it saved (CAPPED, CHARGE_LIMIT).

A failed or partial run charges only the start fee and the rows that were really saved.

Use cases

JobInputKey fieldsNext step
Election and policy researchsearch: "election", both platformsquestion, outcomes, volume, closeTimeExport to a sheet, compare platforms
Macro tracking (Fed, CPI, recession)category: "Economics" or search: "fed"outcomes, openInterest, priceHistoryChart odds over time
Newsroom: "what do markets say?"marketIds of the markets you citeoutcomes, url, fetchedAtQuote the price with time and link
Backtest or data sciencestatus: "closed", includePriceHistory: trueresolvedOutcome, priceHistoryLoad the JSON or CSV into Python
Crypto event oddssearch: "bitcoin"outcomes, volume24hJoin with your price data

Scheduling and monitoring

Add a Schedule in Apify Console (for example, every hour) with a marketIds list or a search. Each run saves a fresh snapshot with fetchedAt, so you can build a time series of odds. The Actor does not compare runs; every run returns the current values.

API, export and integrations

  • Export: JSON, CSV, Excel, XML or HTML from the Output tab or the Dataset API.
  • API: start runs and read the Dataset with the Apify API or the JavaScript and Python clients.
  • No-code: connect the Dataset to Make, Zapier, n8n or Google Sheets through Apify integrations.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/prediction-markets-data
  • Smallest useful input: {"platforms": ["polymarket"], "search": "election", "maxItems": 20}
  • Key output fields: question (what the market asks), outcomes[].probability (crowd-implied chance, 0–1), volume (traded amount in volumeUnit), status (open, closed, resolved), url (market page).
  • Typical run: 3–10 seconds and under $0.10 for 20 markets. With history, about 400 markets per platform fit in one run.
  • Market prices are crowd-implied probabilities from public market data, not forecasts or advice.

Limits and partial results

  • Max rows: maxItems is per platform, up to 1,000. Without history, 1,000 markets per platform (2,000 per run) were tested. With history, about 400 markets per platform fit in one run.
  • Memory: 256 MB (default and maximum). More memory does not make the run faster; the time goes to waiting for the platforms.
  • Time limit: source work stops after about 4 minutes. Each platform gets an equal share of the time. If a platform reaches its share, the run ends CAPPED with reason: DEADLINE; rows saved so far are kept, and you pay only for them. Split big jobs into smaller runs.
  • Search: every search word must be in the market text: question, event title, outcome label, category, tags, slug, market/event ID or Kalshi series ticker. Words match as parts of words, so a short word like us also matches bonus; use longer words. The platforms' own search is fuzzy, so the Actor removes loose matches. Very general words can match fewer markets than you expect.
  • Kalshi category: the category filter uses the Kalshi series category, but the row shows the event category. So a Politics filter can return rows with category: "Elections".
  • Kalshi URL: links go to the event page. Kalshi has no page for a single market.
  • Open interest: can be null if the Polymarket Data API does not return it for a market. A warning in RUN_SUMMARY names how many markets are affected.
  • Price history: best effort. If history fails for some markets, the run is PARTIAL with reason: PRICE_HISTORY_ERROR, and those rows have priceHistoryStatus: "error". Days without trades are missing from the list.
  • Platform failure: if one platform fails after some rows were saved, the run is FAILED in Apify, RUN_SUMMARY.status is PARTIAL with reason: SOURCE_ERROR, and the saved rows stay in the Dataset.
  • Terms: data comes from public, read-only APIs. Check the Polymarket terms and Kalshi terms before commercial reuse.

Troubleshooting

The run returned no markets

Symptom: RUN_SUMMARY.status is NO_RESULTS. Likely reason: no market has all your search words, or the category name does not match. Action: use fewer words, remove category, or try status: "closed".

A Kalshi ID was not found

Symptom: a row with status: "not_found". Likely reason: a typo, or a Polymarket-like ID was read as Kalshi. Action: copy the ticker from the Kalshi URL, or add the prefix kalshi: or polymarket:.

The run stopped with CAPPED

Symptom: RUN_SUMMARY.status is CAPPED. Likely reason: your max charge (CHARGE_LIMIT) or the internal time limit (DEADLINE). Action: raise the max charge, lower maxItems, turn off history, or run one platform at a time.

The run FAILED with PARTIAL

Symptom: Apify shows FAILED, RUN_SUMMARY.status is PARTIAL, reason: SOURCE_ERROR. Likely reason: Polymarket or Kalshi was down or limited requests. Action: run again in a few minutes. You paid only for saved rows and the start fee.

FAQ

Do I need a Polymarket or Kalshi account or API key?

No. The Actor uses only public market data. No login, no API key.

Is the data real time?

No. You get the values at the moment of the run (fetchedAt). Prices on both platforms can change every second.

Why is a price null and not 0?

null means the platform has no price (no trade and no quote). The Actor never turns missing data into 0.

Why do Polymarket and Kalshi show different numbers for the same event?

They are different markets with different traders. Volume units also differ: Polymarket uses USD, Kalshi uses contracts.

Is this betting or investment advice?

No. This is a data export tool. Prices are crowd-implied probabilities copied from public data, not forecasts or buy and sell signals.

Support

For bugs, questions or feature requests, use the Issues tab of this Actor. Include the run ID, your input and the error text. Never send API tokens, passwords or account data.