# Polymarket & Kalshi Scraper - Odds, Volume, Price History (`alex9080/prediction-markets-scraper`) Actor

Polymarket and Kalshi prediction markets in one clean schema: question, outcome prices (implied probability), bid/ask, volume, 24h volume, liquidity, open interest, end date, tags and optional price history. Search by keyword or category, filter by volume. No API key.

- **URL**: https://apify.com/alex9080/prediction-markets-scraper.md
- **Developed by:** [Alex](https://apify.com/alex9080) (community)
- **Categories:** News, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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

### Polymarket & Kalshi Scraper

**Prediction market data from Polymarket and Kalshi in one clean schema.** For every market you get the question, all outcomes with prices (the implied probability), best bid and ask, last trade, 24-hour change, total and 24-hour volume, liquidity, open interest, end date, tags and the resolution rules. Optionally add **price history** for charts and backtests.

Built for traders, quants, journalists and researchers: compare odds across the two platforms, track how probabilities move, find the most active markets, or feed live odds into a model, a dashboard or an AI agent.

#### Features

- **Two platforms, one format**: Polymarket and Kalshi rows share the same fields, so you can compare and join them directly.
- **Find markets** by keyword (`bitcoin`, `election`, `fed rate`), category or tag, or paste specific Polymarket links and Kalshi tickers.
- **Top markets** by 24h volume, total volume, liquidity, ending soon or newest.
- **Filters**: open or settled, minimum 24h volume.
- **Price history** with 1-hour, 6-hour or daily steps, up to a year back.
- **No API keys, no accounts.** Uses the platforms' public market data.

#### Output

```json
{
  "platform": "polymarket",
  "eventTitle": "Brazil Presidential Election",
  "question": "Will Tarcisio de Freitas win the 2026 Brazilian presidential election?",
  "outcomeLabel": "Tarcisio de Freitas",
  "outcomes": [{"name": "Yes", "price": 0.0005, "tokenId": "5263..."}, {"name": "No", "price": 0.9995, "tokenId": "1063..."}],
  "yesPrice": 0.0005,
  "noPrice": 0.9995,
  "bestBid": null,
  "bestAsk": 0.001,
  "lastPrice": 0.001,
  "volume": 14628663.14,
  "volume24h": 139000,
  "liquidity": 1296237.53,
  "openInterest": 9269771.78,
  "endDate": "2026-10-05T03:59:00Z",
  "status": "open",
  "tags": ["Politics", "Brazil", "World Elections"],
  "url": "https://polymarket.com/event/...",
  "priceHistory": [{"time": "2026-09-26T00:00:00+00:00", "price": 0.012}]
}
```

Prices are in dollars per share (0 to 1), which equals the market's implied probability. Kalshi prices are converted from cents to the same 0 to 1 scale.

#### Input example

```json
{
  "platforms": ["polymarket", "kalshi"],
  "searchTerms": ["bitcoin"],
  "status": "open",
  "sortBy": "volume24h",
  "maxMarkets": 50,
  "includePriceHistory": true,
  "historyInterval": "1h",
  "historyDays": 7
}
```

#### Ideas

- **Odds monitor**: schedule a run every 15 minutes and send big moves to Slack or Telegram.
- **Cross-platform comparison**: same event on Polymarket and Kalshi, different prices.
- **Research datasets**: settled markets with their full price history.

#### Pricing

**$0.001 per market** and **$0.001 per market with price history**. 1,000 markets cost $1. No subscription.

#### Use from code

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("alex9080/prediction-markets-scraper").call(run_input={
    "searchTerms": ["fed"], "maxMarkets": 20,
})
for m in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(m["platform"], m["question"], m["yesPrice"])
```

#### Notes

This Actor reads public market data only. It does not place trades and is not affiliated with Polymarket or Kalshi. Prediction markets may be restricted in your country; check local rules before trading.

# Actor input Schema

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

Which markets to scrape.

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

Find markets by keyword, e.g. bitcoin, election, fed, nba. Leave empty for the top markets.

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

Optional: Politics, Crypto, Sports, Economics, Weather... (Polymarket tag or Kalshi category).

## `markets` (type: `array`):

Polymarket event links (https://polymarket.com/event/...) or slugs, Kalshi market or event tickers.

## `status` (type: `string`):

Open markets, already closed/settled ones, or both.

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

Order of the results before the limit is applied.

## `minVolume24h` (type: `integer`):

Skip quiet markets.

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

Upper limit of markets per platform.

## `includePriceHistory` (type: `boolean`):

Adds a priceHistory array (time, Yes price) to each market.

## `historyInterval` (type: `string`):

Spacing of price history points.

## `historyDays` (type: `integer`):

How many days of price history.

## Actor input object example

```json
{
  "platforms": [
    "polymarket",
    "kalshi"
  ],
  "searchTerms": [
    "bitcoin"
  ],
  "status": "open",
  "sortBy": "volume24h",
  "maxMarkets": 100,
  "includePriceHistory": false,
  "historyInterval": "1h",
  "historyDays": 7
}
```

# Actor output Schema

## `markets` (type: `string`):

No description

## `all` (type: `string`):

No description

# 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": [
        "bitcoin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alex9080/prediction-markets-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": ["bitcoin"] }

# Run the Actor and wait for it to finish
run = client.actor("alex9080/prediction-markets-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": [
    "bitcoin"
  ]
}' |
apify call alex9080/prediction-markets-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alex9080/prediction-markets-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/wnkWs1jRw0orvPquW/builds/jRTwfIae49SZeHegk/openapi.json
