# Prediction Markets Odds API - Kalshi + Polymarket in one schema (`cleandatalabs/prediction-markets-odds`) Actor

Prediction markets API for Kalshi and Polymarket in one schema: live implied probability, bid/ask, spread, 24h change, volume, open interest and rules. Filter by keyword, category and volume. No login or API key, ~$2 per 1,000 rows.

- **URL**: https://apify.com/cleandatalabs/prediction-markets-odds.md
- **Developed by:** [Clean Data Labs](https://apify.com/cleandatalabs) (community)
- **Categories:** News, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 market rows

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

## Prediction Markets API: Kalshi and Polymarket Odds in One Normalized Feed

**Get live prediction market odds from [Kalshi](https://kalshi.com) and [Polymarket](https://polymarket.com) as one clean JSON, CSV or Excel table:** implied probability (0-1), bid/ask, spread, 24h change, volume, open interest, liquidity and resolution rules. Same field names for both venues, so you can compare Fed, election, sports and crypto odds side by side. No login, no API keys, no proxies, about **$2 per 1,000 rows** with no start fee.

*Built and maintained by **[Clean Data Labs](https://apify.com/cleandatalabs)**.*

### Ready-made examples (one click to run)

| Example | What it returns |
|---|---|
| [Fed rate decision odds: Kalshi vs Polymarket](https://apify.com/cleandatalabs/prediction-markets-odds/examples/fed-rate-odds-kalshi-polymarket) | Fed/FOMC rate markets on both venues |
| [Election and politics odds from Kalshi and Polymarket](https://apify.com/cleandatalabs/prediction-markets-odds/examples/election-odds-prediction-markets) | Politics and election markets with volume |
| [Sports odds from Kalshi and Polymarket, most traded](https://apify.com/cleandatalabs/prediction-markets-odds/examples/sports-betting-odds-prediction-markets) | Most traded sports markets |
| [Bitcoin and crypto price odds from prediction markets](https://apify.com/cleandatalabs/prediction-markets-odds/examples/crypto-prediction-market-odds) | Bitcoin and Ethereum price-target markets |
| [Inflation and CPI odds on Kalshi](https://apify.com/cleandatalabs/prediction-markets-odds/examples/inflation-cpi-odds-kalshi) | Kalshi CPI and inflation strikes |

### Who it's for

- **Traders and quants** who want a single feed of Kalshi and Polymarket prices to compare venues side by side.
- **Researchers, journalists and newsletter writers** covering elections, the Fed, sports and crypto odds.
- **Data and BI teams** building dashboards or forecasting models that need clean, scheduled odds snapshots.
- **AI agents and automations** that need prediction-market probabilities as structured JSON.

#### Popular use cases

- Spot price gaps when the same event (for example, a Fed rate decision) is listed on both venues.
- Schedule a run every few minutes or hours to build your own odds history.
- Track the most actively traded markets in a category such as Economics, Politics, Sports or Crypto.
- Feed implied probabilities into a model, spreadsheet, Slack alert or Google Sheet.

### Features

- **Two venues, one schema.** Kalshi and Polymarket rows use the same field names, and prices are expressed as 0–1 probabilities.
- **Official public APIs only.** No login, no API keys and no proxies needed.
- **Keyword filter.** Keep only markets whose question, outcome or event title mentions your terms (for example `fed`, `election`).
- **Category filter.** Matches Kalshi categories and Polymarket tags (Politics, Economics, Sports, Crypto and more).
- **Volume filter.** Skip thin markets with `minVolume24h`.
- **Less noise.** Kalshi's auto-generated multi-leg combo markets are excluded by default (`excludeParlays`).
- **Most active first.** Both venues are scanned from the highest recent volume down.
- **Resolution rules included**, so you know exactly what each contract pays out on.

### Input example

```json
{
  "venues": ["kalshi", "polymarket"],
  "searchTerms": ["fed", "rate", "inflation", "cpi"],
  "minVolume24h": 100,
  "maxResults": 40
}
```

| Input | What it does |
|---|---|
| `venues` | `kalshi`, `polymarket`, or both (default both) |
| `searchTerms` | Keep markets that mention any of these words (case-insensitive) |
| `categories` | Kalshi categories / Polymarket tags, e.g. `Economics`, `Sports` |
| `minVolume24h` | Minimum 24h volume (contracts on Kalshi, USD on Polymarket) |
| `maxResults` | Maximum rows to return; you are charged per row (default 200) |
| `excludeParlays` | Skip Kalshi multi-leg combo markets (default true) |
| `maxPagesPerVenue` | Safety cap on pages scanned per venue (default 15) |

### Output fields

| Field | Description |
|---|---|
| `venue` | `kalshi` or `polymarket` |
| `market_id` / `event_id` | Venue identifiers for the market and its parent event |
| `event_title` | Parent event, e.g. "Fed decision in Dec 2026?" |
| `question` / `outcome` | The tradable question and the outcome this row prices |
| `category` / `tags` | Venue category and tags |
| `yes_price` | Mid of the Yes bid and ask, 0–1 |
| `yes_bid` / `yes_ask` / `spread` | Top-of-book quotes and their spread |
| `last_price` / `price_change_24h` | Last traded price and 24h change |
| `volume_24h` / `volume_total` / `volume_unit` | Trading volume (`contracts` on Kalshi, `usd` on Polymarket) |
| `open_interest` | Open interest (Kalshi) |
| `liquidity` | Liquidity (Polymarket) |
| `close_time` | When the market closes (UTC) |
| `rules` | Resolution rules text |
| `url` | Link to the market on the venue |
| `scraped_at` | Snapshot timestamp (UTC) |

### Sample output

Real rows from a test run on October 31, 2026 (`rules` text shortened for display).

```json
{
  "venue": "kalshi",
  "market_id": "KXNCAAFGAME-26OCT31TXSTBSU-BSU",
  "event_id": "KXNCAAFGAME-26OCT31TXSTBSU",
  "event_title": "Texas St. vs Boise St.",
  "question": "Boise St. wins",
  "outcome": "Boise St.",
  "category": "Sports",
  "tags": ["Sports"],
  "yes_price": 0.585,
  "yes_bid": 0.58,
  "yes_ask": 0.59,
  "spread": 0.01,
  "last_price": 0.59,
  "price_change_24h": -0.2,
  "volume_24h": 4925662.32,
  "volume_total": 5763915.43,
  "volume_unit": "contracts",
  "open_interest": 2643446.01,
  "liquidity": null,
  "close_time": "2026-11-03T02:00:00Z",
  "rules": "If Boise St. wins the Texas St. vs Boise St. college football game originally scheduled for Oct 31, 2026, then the market resolves to Yes.",
  "url": "https://kalshi.com/markets/kxncaafgame",
  "scraped_at": "2026-11-01T05:58:17.161517+00:00"
}
```

```json
{
  "venue": "polymarket",
  "market_id": "0xb9aee520bf51ac5f00b5c43e54ef9245bc9fcdef866ce8a33025f9a441cc651d",
  "event_id": "fed-decision-in-december-20260729232808632",
  "event_title": "Fed Decision in December?",
  "question": "Will the Fed decrease interest rates by 50+ bps after the December 2026 meeting?",
  "outcome": "50+ bps decrease",
  "category": "Fed",
  "tags": ["Fed", "fomc", "Trump", "Economy", "Fed Rates", "Kevin Warsh", "Global Rates", "Economic Policy", "Macro Indicators", "Recurring"],
  "yes_price": 0.0035,
  "yes_bid": 0.003,
  "yes_ask": 0.004,
  "spread": 0.001,
  "last_price": 0.004,
  "price_change_24h": -0.0005,
  "volume_24h": 12702.31,
  "volume_total": 1849150.813975,
  "volume_unit": "usd",
  "open_interest": null,
  "liquidity": 180398.82363,
  "close_time": "2026-12-09T23:59:00Z",
  "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-december-20260729232808632",
  "scraped_at": "2026-11-01T05:58:27.092435+00:00"
}
```

A `RUN_SUMMARY` record in the run's key-value store gives per-venue row counts.

### Pricing

**Pay per result:** you pay only for the market rows saved to your dataset, with no start fee.

| Apify plan | Price per market row | Per 1,000 rows |
|---|---|---|
| Free | $0.002 | $2.00 |
| Bronze | $0.0018 | $1.80 |
| Silver | $0.0016 | $1.60 |
| Gold and above | $0.0014 | $1.40 |

#### Free credit

Apify's free plan includes **$5 of usage credit every month**, no credit card required. At the Free-tier price that covers up to about 2,500 market rows a month. Use `maxResults` to cap what any single run can cost.

### FAQ and troubleshooting

#### Why did my run return fewer rows than `maxResults`?

Your filters may be narrow. Loosen `searchTerms`, `categories` or `minVolume24h`, or raise `maxPagesPerVenue` so more pages are scanned. `maxResults` is split across the venues you select.

#### Why is `open_interest` empty for Polymarket and `liquidity` empty for Kalshi?

Each venue publishes a different depth metric. The field is `null` when the venue does not provide it.

#### Are Kalshi and Polymarket volumes comparable?

Not directly. Kalshi reports volume in contracts and Polymarket in USD; check `volume_unit` on each row.

#### Do I need an account or API key for Kalshi or Polymarket?

No. The actor uses their official public market-data APIs.

#### Is this a Kalshi API or Polymarket API alternative?

It wraps both official public APIs and returns one normalized schema, so you do not have to handle two sets of endpoints, pagination, price formats and field names. If you only need one venue and want raw data, the official APIs are free and a good choice.

#### Can I build an odds history or alerts?

Yes. Schedule the actor (or one of the examples above) in Apify Console every few minutes or hours; each row has `scraped_at`. Connect Google Sheets, Slack, Zapier, Make or n8n on the Integrations tab.

#### Is this financial advice?

No. Prices are snapshots taken at `scraped_at` and can change quickly.

### More from Clean Data Labs

- [SAM.gov Contract Opportunities Scraper](https://apify.com/cleandatalabs/samgov-opportunities): live US federal bids with NAICS, set-asides, deadlines and contracting contacts.
- [Substack Scraper](https://apify.com/cleandatalabs/substack-newsletters): Substack posts with engagement metrics, plus top newsletters in any category.

### Support

Questions, bugs or feature requests? Email **<clean-data-labs@mail.grokbot.com>** or open an issue on the actor's Issues tab.

*Clean Data Labs: clean, structured public data, ready to use.*

# Actor input Schema

## `venues` (type: `array`):

Which exchanges to pull.

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

Keep only markets whose question, outcome or event title contains ANY of these words (case-insensitive). Leave empty for all markets.

## `categories` (type: `array`):

Keep only these categories (matched case-insensitively against Kalshi categories and Polymarket tags), e.g. Politics, Economics, Sports, Crypto, Climate and Weather.

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

Skip markets traded less than this in the last 24h (contracts on Kalshi, USD on Polymarket). 0 = keep all.

## `maxResults` (type: `integer`):

Stop after this many market rows (you are charged per row).

## `excludeParlays` (type: `boolean`):

Kalshi lists thousands of auto-generated multi-leg combo markets (KXMVE...). Skip them by default.

## `maxPagesPerVenue` (type: `integer`):

Safety cap on API pages scanned per venue (50 events per Kalshi search page, 100 events per Polymarket page). Both venues are scanned from highest recent volume down..

## Actor input object example

```json
{
  "venues": [
    "kalshi",
    "polymarket"
  ],
  "searchTerms": [
    "fed",
    "election"
  ],
  "minVolume24h": 0,
  "maxResults": 200,
  "excludeParlays": true,
  "maxPagesPerVenue": 15
}
```

# Actor output Schema

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

One row per market outcome from Kalshi and Polymarket: price, bid/ask, spread, volume, liquidity, close time and URL.

# 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",
        "election"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleandatalabs/prediction-markets-odds").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",
        "election",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cleandatalabs/prediction-markets-odds").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",
    "election"
  ]
}' |
apify call cleandatalabs/prediction-markets-odds --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleandatalabs/prediction-markets-odds"
        }
    }
}
```

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/SPdlEdE7WDVPWmsKz/builds/7DN1eGrEWfYu2pdSC/openapi.json
