# Polymarket and Kalshi Prediction Market Data in One Table

> Polymarket API data and Kalshi markets in one table: outcome prices as odds, volume, liquidity, close time and status, with price history. No login.

URL: https://cliqtomedia.com/actors/prediction-markets-data/

Category: Finance, markets & sports · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/prediction-markets-data?fpr=cliqto

Search or look up markets on Polymarket and Kalshi. You get the question, Yes and No prices as odds, volume and status. You can add price history too.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify 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.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `polymarket` in Platforms. Each start is one run.
3. **Download the results.** When 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.

## 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 (`open` or `closed`). 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.

## Price

Pay per event. Apify bills you, not us.

| 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. |

- 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.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/prediction-markets-data?fpr=cliqto

## 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.

## Data fields

- `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

- `platforms` (array): Which prediction markets to search: polymarket, kalshi or both. Default: both. Ignored when Market IDs or URLs are given (each identifier names its own platform).
- `search` (string): Keywords such as election, fed rate, bitcoin or super bowl. Every word must appear in the market question, event title, outcome or tags. Leave empty to list the most traded markets. Up to 200 characters.
- `category` (string): Optional category or tag, e.g. Politics, Economics, Crypto, Sports, Elections. Polymarket matches event tags; Kalshi matches its series category (Politics, Elections, Economics, Financials, Crypto, Climate and Weather, Sports, ...). Case-insensitive.
- `status` (string): open (default): markets that still trade. closed: markets that stopped trading, including resolved ones with their outcome.
- `marketIds` (array): Look up specific markets instead of searching. Up to 200 entries: Polymarket market ID (561229), condition ID (0x…), market or event slug, or polymarket.com/event/… URL; Kalshi market, event or series ticker (KXFEDDECISION-26OCT-H0, KXFEDDECISION-26OCT, KXFEDDECISION) or kalshi.com/markets/… URL. Prefix with polymarket: or kalshi: if unsure. An event or series returns all its markets (up to Max markets per platform). Unknown IDs are reported in one not-found row.
- `includePriceHistory` (boolean): Add the Yes-price history of each market (hourly for 7 days or less, otherwise daily). One extra request per market, so runs are slower. Default false.
- `priceHistoryDays` (integer): How many days of history, ending now (or at the close time for closed markets). 1–365, default 30.
- `maxItems` (integer): Maximum market rows per platform, 1–1000. Default 50. Each market row is one paid result.

## Step by step on Apify

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`.

## 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

- 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



- 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.

## Sample result

```json
{
  "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`

```python
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)
```

```bash
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"}'
```

```python
# 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)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [SEC Form D Filing Monitor](https://cliqtomedia.com/actors/sec-edgar-form-d-funding-monitor/)
- [Crypto Prices & OHLC History Export - No Login](https://cliqtomedia.com/actors/crypto-market-data/)
- [Historical Exchange Rates & Currency Converter](https://cliqtomedia.com/actors/historical-fx-rates-converter/)
- [Tennis Scraper: ATP & WTA Matches, Players & Rankings](https://cliqtomedia.com/actors/tennis-stats-scraper/)
