How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
polymarketin Platforms. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
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.
- Polymarket — public Gamma, CLOB and Data APIs (docs).
- Kalshi — public market data API (docs).
- Find markets. Search by keywords, filter by category and by status (
openorclosed). You get the most traded markets first. - 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.
Good for
- 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 good fit
- 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.
Who uses it
Journalists
Quote what markets say about an event, with time and link.
Researchers
Track odds of elections, Fed decisions and other events.
Data scientists
Load daily or hourly price history into Python for backtests.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.007 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Market row | $0.0035 (from $0.003 on paid Apify plans) | One saved prediction market row (Polymarket or Kalshi) with prices, volume, status and URL. Price history for that market, when requested, is included. |
| Market ID not found | $0.0003 | One requested market ID, URL or ticker that the platform does not know. Covers the lookup requests. |
Examples
- One market: about $0.01.
- 1,000 markets: about $3.51.
- Every day 100 markets, for 30 days: about $10.71 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 1,400 markets.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a Polymarket or Kalshi account?
No. It reads public data without a login or key.
Can I trade with it?
No. It is a read-only data tool. It is not betting or investment advice.
Is the data live?
No. You get the values at the moment of the run.
Why do the two platforms show different odds?
They are separate markets with different traders, so prices can differ.
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.
Details
Step by step on Apify
- Open the Input tab.
- Keep the prefilled values: Platforms =
polymarket, Search =election, Max markets per platform =20. - Click Start.
- Open the Output tab, view Markets. Sort by
volumeor readoutcomes.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Election and policy research | search: "election", both platforms | question, outcomes, volume, closeTime | Export to a sheet, compare platforms |
| Macro tracking (Fed, CPI, recession) | category: "Economics" or search: "fed" | outcomes, openInterest, priceHistory | Chart odds over time |
| Newsroom: "what do markets say?" | marketIds of the markets you cite | outcomes, url, fetchedAt | Quote the price with time and link |
| Backtest or data science | status: "closed", includePriceHistory: true | resolvedOutcome, priceHistory | Load the JSON or CSV into Python |
| Crypto event odds | search: "bitcoin" | outcomes, volume24h | Join with your price data |
Tips for better results
- Use longer search words. Short words like us also match bonus.
- Compare the same question on both platforms side by side.
- With history on, keep runs to about 400 markets per platform.
Limits and good to know
- Max rows:
maxItemsis 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
CAPPEDwithreason: 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
usalso matchesbonus; 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
categoryfilter uses the Kalshi series category, but the row shows the event category. So aPoliticsfilter can return rows withcategory: "Elections" - Kalshi URL: links go to the event page. Kalshi has no page for a single market
- Open interest: can be
nullif the Polymarket Data API does not return it for a market. A warning inRUN_SUMMARYnames how many markets are affected - Price history: best effort. If history fails for some markets, the run is
PARTIALwithreason: PRICE_HISTORY_ERROR, and those rows havepriceHistoryStatus: "error". Days without trades are missing from the list
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Use it from code
Actor ID: cliqtomedia/prediction-markets-data. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/prediction-markets-data").call(run_input={
"platforms": [
"polymarket"
],
"search": "election"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~prediction-markets-data/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"platforms": ["polymarket"], "search": "election"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/prediction-markets-data")
result = tool.invoke({"run_input": {"platforms": ["polymarket"], "search": "election"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (35)
| Field | Type | Meaning |
|---|---|---|
recordType | string | market for market rows; lookup-status for an identifier that was not found, invalid or failed (one row per identifier). |
platform | string | polymarket or kalshi; null on lookup-status rows for identifiers that match neither platform. |
marketId | string | Polymarket market ID or Kalshi market ticker. Lookup-status rows: the identifier exactly as you entered it. |
marketSlug | string | Polymarket market slug (null on Kalshi). |
conditionId | string | Polymarket condition ID (0x…); null on Kalshi. |
eventId | string | Parent event: Polymarket event ID or Kalshi event ticker. |
eventTitle | string | Title of the parent event, e.g. Fed decision in Oct 2026? |
seriesTicker | string | Kalshi series ticker (null on Polymarket). |
question | string | Market question as shown by the platform. |
outcomeLabel | string | Short label of this market inside a multi-outcome event, e.g. a candidate name or a range. |
category | string | Category: Kalshi event category or the main Polymarket tag. |
tags | array | Polymarket event tags (empty on Kalshi). |
outcomes | array | Outcomes with name, price (USD per $1 payout, 0–1) and probability (the same price read as an implied probability). |
lastTradePrice | number | Last traded price of the first outcome (Yes), 0–1. |
bestBid | number | Best bid for Yes, 0–1. |
bestAsk | number | Best ask for Yes, 0–1. |
volume | number | Lifetime traded volume; unit in volumeUnit. |
volume24h | number | Volume over the last 24 hours; unit in volumeUnit. |
liquidity | number | Order book liquidity in USD (Polymarket; Kalshi does not publish it, so null). |
openInterest | number | Open interest: USD on Polymarket, contracts on Kalshi. |
volumeUnit | string | USD (Polymarket) or contracts (Kalshi, $1 payout each). |
openTime | string | When trading opened (ISO 8601). |
closeTime | string | Scheduled or actual close time (ISO 8601). |
status | string | Market rows: open, closed or resolved. Lookup-status rows: not_found, invalid or error. |
sourceStatus | string | Raw status from the platform, e.g. active, finalized. |
resolvedOutcome | string | Winning outcome for resolved markets, otherwise null. |
rules | string | Resolution rules as published by the platform (Polymarket market description; Kalshi primary and secondary rules), trimmed to 2,000 characters. |
url | string | Market page on polymarket.com or kalshi.com. |
priceHistoryStatus | string | not_requested, complete, empty, unavailable or error. |
priceHistory | array | List of {timestamp, price} for the Yes price; null unless requested. |
statusReason | string | Lookup-status rows: why the IDs were not returned. |
errorCode | string | Lookup-status rows: INVALID_IDENTIFIER or a source error code. |
source | string | Which public API the row came from. |
sourceApiUrl | string | API request that produced the row. |
fetchedAt | string | When the row was fetched (ISO 8601). |
Input settings (8)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Platforms | platforms | array | ["polymarket"] |
| Search keywords | search | string | "election" |
| Category | category | string | |
| Market status | status | string | "open" |
| Market IDs or URLs | marketIds | array | |
| Include price history | includePriceHistory | boolean | false |
| Price history days | priceHistoryDays | integer | 30 |
| Max markets per platform | maxItems | integer | 20 |



