# Kalshi & Polymarket Scraper - Odds, Probability, Volume (`om_kh/kalshi-polymarket-scraper`) Actor

Live prediction-market data from Kalshi and Polymarket in one table: implied probability, yes price, bid/ask, spread, 24h move, volume, liquidity, open interest, close time and rules. Search any topic (elections, Fed, crypto, sports) or get the biggest markets. $1 per 1,000 markets.

- **URL**: https://apify.com/om\_kh/kalshi-polymarket-scraper.md
- **Developed by:** [Khandji Omar](https://apify.com/om_kh) (community)
- **Categories:** News, Developer tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 markets

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Kalshi & Polymarket Scraper — Odds, Probability, Volume

> Live **prediction-market odds** from **Kalshi** and **Polymarket** in one table: implied
> probability, yes price, bid / ask, spread, **24h move**, volume, liquidity, open interest,
> close time and resolution rules. Search any topic — elections, the Fed, crypto, sports,
> AI — or get the biggest markets by volume. **$1 per 1,000 markets.** No login, no API key.

### What does this Kalshi and Polymarket scraper do?

For each topic you type (for example `fed rate`), it searches **both exchanges**, collects
every open market that matches and returns one row per market with the **same fields on
both venues** — so you can compare what Kalshi and Polymarket think about the same event.
Leave the topic empty to get the most-traded markets right now.

It uses the exchanges' own public market-data APIs, so it is fast (about 4 seconds for 40
markets in our test) and does not break when the websites change their design.

### Why use it

1. **Both big exchanges, one schema.** `platform` tells you where each row comes from.
2. **Probabilities ready to use.** `impliedProbabilityPct` (0–100), `yesPrice`, `bestBid`,
   `bestAsk`, `spread` and `change24h` — no cents-vs-dollars conversion.
3. **Real search on Kalshi too.** Topic search on both venues, not only on Polymarket.
4. **Filters that matter.** Category, minimum volume, sort by 24h volume, total volume,
   liquidity or closing date.
5. **Cheap and simple.** $0.001 per market row, no start fee, up to 20 free rows per run (at most half of the run).
6. **Built for automation and AI agents.** JSON / CSV / Excel, API, schedules, n8n, Make,
   Zapier and MCP.

### How to use it in 3 steps

1. Click **Try for free** — `fed rate` and `bitcoin` are prefilled.
2. Add your topics, pick the exchanges, and optionally a category or minimum volume.
3. Click **Start** and download the table, or schedule it every hour to track the odds.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Topics to search (up to 20). Empty = biggest markets by volume. |
| `platforms` | `kalshi`, `polymarket` or both (default). |
| `maxMarkets` | Per topic, 1 to 1,000. Default 100. |
| `category` | Optional: Economics, Politics, Elections, Crypto, Sports... |
| `minVolume` | Optional minimum total traded volume. |
| `sortBy` | `volume24h` (default), `volume`, `liquidity`, `closing`. |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "searchTerms": ["fed rate", "recession", "bitcoin"],
  "platforms": ["kalshi", "polymarket"],
  "minVolume": 10000,
  "sortBy": "volume24h",
  "maxMarkets": 50
}
```

### Output

Real example (Kalshi, rules trimmed):

```json
{
  "platform": "kalshi",
  "marketId": "KXFEDDECISION-26OCT-H0",
  "question": "Will the Federal Reserve Hike rates by 0bps at their October 2026 meeting?",
  "eventTitle": "Fed decision in Oct 2026?",
  "outcome": "Fed maintains rate",
  "yesPrice": 0.54,
  "impliedProbabilityPct": 54.0,
  "bestBid": 0.53,
  "bestAsk": 0.55,
  "spread": 0.02,
  "lastPrice": 0.55,
  "change24h": 0.25,
  "volume": 1815793.85,
  "volume24h": 448507.67,
  "openInterest": 839330.16,
  "category": "Economics",
  "closeTime": "2026-10-28T17:59:00Z",
  "marketStatus": "active",
  "rules": "If the Federal Reserve does a Hike of 0bps on October 28, 2026, then the market resolves to Yes...",
  "url": "https://kalshi.com/markets/kxfeddecision",
  "searchQuery": "fed rate",
  "status": "ok"
}
```

Polymarket rows have the same fields, plus `outcomes` (every outcome with its price) for
multi-outcome markets. `openInterest` is Kalshi-only.

### How much does it cost?

| Event | Price |
|---|---|
| Market row | **$0.001** ($1 per 1,000) |
| Start fee | none |

Example: a daily snapshot of 200 markets for a month = 6,000 rows = **$6**.
Up to 20 rows of every run are free (at most half of the run). Paid Apify plans get lower tier prices.

### Use cases

- **Traders and analysts** — compare Kalshi vs Polymarket odds on the same event.
- **News and research** — "what do markets say?" for elections, Fed decisions, recession,
  AI milestones, with a probability history you build by scheduling runs.
- **Dashboards and alerts** — send big 24h moves to Slack or Google Sheets.
- **AI agents** — let an assistant check live market probabilities before answering.

### Use it from code (API)

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/kalshi-polymarket-scraper").call(run_input={
    "searchTerms": ["fed rate"],
    "minVolume": 10000,
})
for m in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(m["platform"], m["question"], m["impliedProbabilityPct"], m["change24h"])
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~kalshi-polymarket-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["election"], "maxMarkets": 50}'
```

### Integrations: n8n, Make, Zapier, Google Sheets

Schedule the Actor (every hour or every day) and push rows to Google Sheets, Airtable or a
Slack channel with the Apify app in n8n, Make or Zapier to keep a probability history.

### Use it from an AI agent (MCP)

Connect Claude, Cursor or any MCP client to `https://mcp.apify.com` and add
`om_kh/kalshi-polymarket-scraper` as a tool: "what is the market probability of a Fed cut
in October on Kalshi and Polymarket?".

### Tips and limits

- Prices are between 0 and 1; `impliedProbabilityPct` = price × 100. On Kalshi it is the
  mid of bid and ask (last trade when there is no ask).
- Kalshi volume is counted in contracts, Polymarket volume in USD.
- Market data is informational only. This Actor does not place trades and is not financial advice.

### FAQ

**Do I need a Kalshi or Polymarket account?**
No. Both exchanges publish market data publicly.

**How often is the data updated?**
Every run reads live data. Schedule the Actor as often as you need.

**Can I get only one exchange?**
Yes, set `platforms` to `["kalshi"]` or `["polymarket"]`.

**Is it legal?**
It reads public market data that the exchanges publish through their own APIs.

### Related Actors

- [Google Trends Scraper - Interest, Regions, Rising Queries](https://apify.com/om_kh/google-trends-scraper) — is public interest in the topic growing?
- [Google News API - Headlines, Source, Date, No Login](https://apify.com/om_kh/google-news-scraper) — the news moving the odds.
- [X (Twitter) Search Scraper - Posts, Likes, Replies](https://apify.com/om_kh/twitter-x-search-scraper) — what people say about the event.

# Actor input Schema

## `searchTerms` (type: `array`):

Topics to search on both exchanges, one per line (up to 20), e.g. 'fed rate', 'bitcoin', 'election'. Leave empty to get the biggest markets by volume.

## `platforms` (type: `array`):

Kalshi, Polymarket or both (default).

## `maxMarkets` (type: `integer`):

1 to 1,000. Default 100.

## `category` (type: `string`):

Optional, e.g. Economics, Politics, Elections, Crypto, Sports (Kalshi category / Polymarket tag).

## `minVolume` (type: `number`):

Optional: skip markets with less total traded volume (Kalshi contracts / Polymarket USD).

## `sortBy` (type: `string`):

24h volume (default), total volume, liquidity or closing soonest.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cost cap for this run.

## Actor input object example

```json
{
  "searchTerms": [
    "fed rate",
    "bitcoin"
  ],
  "platforms": [
    "kalshi",
    "polymarket"
  ],
  "maxMarkets": 20,
  "minVolume": 1000,
  "sortBy": "volume24h"
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

## `results` (type: `string`):

Markets in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "fed rate",
        "bitcoin"
    ],
    "maxMarkets": 20,
    "minVolume": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/kalshi-polymarket-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": [
        "fed rate",
        "bitcoin",
    ],
    "maxMarkets": 20,
    "minVolume": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/kalshi-polymarket-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "fed rate",
    "bitcoin"
  ],
  "maxMarkets": 20,
  "minVolume": 1000
}' |
apify call om_kh/kalshi-polymarket-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,om_kh/kalshi-polymarket-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wJWxpeQqkBBYPtsBT/builds/9Q0EA8b6tmbahE6H8/openapi.json
