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

Live odds, bid/ask, spread, 24h change, volume and open interest from Kalshi and Polymarket in one normalized table. Filter by keyword, category and volume. Official public APIs, no login, no proxies.

- **URL**: https://apify.com/bigdatadan/prediction-markets-odds.md
- **Developed by:** [Alexander Meggitt](https://apify.com/bigdatadan) (community)
- **Categories:** News, Business, 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 Odds API: Kalshi + Polymarket in one schema

Get live odds, bid/ask, spread, 24h price change, volume, open interest and resolution rules from **Kalshi** and **Polymarket** as one clean, normalized table. Every row is a single tradable outcome, priced in 0–1 probability terms, so you can compare venues side by side, feed a model, or build a dashboard.

- **Official public APIs only.** No login, no API keys, no proxies, no browser. That makes runs fast (≈4 s for 40 rows) and cheap.
- **One schema for both venues.** The same field names are used whether the row came from Kalshi or Polymarket.
- **Filters:** keywords, categories (Kalshi categories / Polymarket tags), minimum 24h volume, venue.
- **Skips noise:** Kalshi's thousands of auto-generated multi-leg parlay markets (KXMVE…) are excluded by default.
- **Ranked by activity:** the most-traded markets come first.

### Use cases

- Cross-venue arbitrage and price-gap scans (e.g. the same Fed decision priced on both venues)
- Feeding forecasts or trading bots with consistent odds snapshots (schedule it every 5–15 minutes)
- Newsletters, dashboards and research on election, macro, sports and crypto odds

### Input

| Field | Description |
|---|---|
| `venues` | `kalshi`, `polymarket` or both (default both) |
| `searchTerms` | Keep markets whose question/outcome/event contains any of these words |
| `categories` | e.g. `economics`, `politics`, `sports`, `crypto` |
| `minVolume24h` | Skip thin markets (contracts on Kalshi, USD on Polymarket) |
| `maxResults` | Total rows; split evenly across venues |
| `excludeParlays` | Skip Kalshi multi-leg combos (default true) |
| `maxPagesPerVenue` | Safety cap on pages scanned |

Example:

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

### Output (real rows from a test run on Oct 31, 2026)

```json
{
  "venue": "kalshi",
  "market_id": "KXFEDDECISION-26DEC-C26",
  "event_id": "KXFEDDECISION-26DEC",
  "event_title": "Fed decision in Dec 2026?",
  "question": "Will the Federal Reserve Cut rates by >25bps at their December 2026 meeting?",
  "outcome": "Cut >25bps",
  "category": "Economics",
  "tags": [
    "Economics"
  ],
  "yes_price": 0.005,
  "yes_bid": 0.0,
  "yes_ask": 0.01,
  "spread": 0.01,
  "last_price": 0.01,
  "price_change_24h": 0.0,
  "volume_24h": 654.0,
  "volume_total": 166753.61,
  "volume_unit": "contracts",
  "open_interest": 158415.31,
  "liquidity": null,
  "close_time": "2026-12-09T18:59:00Z",
  "rules": "If the Federal Reserve does a Cut of   25bps on December 09, 2026, then the market resolves to Yes.",
  "url": "https://kalshi.com/markets/kxfeddecision",
  "scraped_at": "2026-11-01T05:58:27.092435+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. The decisions on the target federal funds range are made by the Federal Open Market Committee (FOMC) meetings.\n\nThis…",
  "url": "https://polymarket.com/event/fed-decision-in-december-20260729232808632",
  "scraped_at": "2026-11-01T05:58:27.092435+00:00"
}
```

Fields: `venue, market_id, event_id, event_title, question, outcome, category, tags, yes_price (bid/ask mid), yes_bid, yes_ask, spread, last_price, price_change_24h, volume_24h, volume_total, volume_unit, open_interest, liquidity, close_time, rules, url, scraped_at`. A `RUN_SUMMARY` record in the key-value store gives per-venue counts.

### Pricing (suggested)

Pay per event: **`market-row` at $0.002 ($2.00 per 1,000 rows)**, with store tiers Bronze $1.80 / Silver $1.60 / Gold $1.40 per 1,000.
Benchmarks in Apify Store on Oct 31, 2026: single-venue Kalshi actors charge about $1.50/1K rows (lergassy), $1.50/1K (scrapebench), and $4/1K rows plus $10/1K trades (scrapemint). We charge a small premium because this actor covers both venues in one normalized schema. Platform compute is negligible because the actor makes only HTTP JSON calls.

### Notes

Data comes from Kalshi's public market data API and Polymarket's public Gamma API. This is not financial advice. Prices are snapshots at `scraped_at`.

# 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("bigdatadan/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("bigdatadan/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 bigdatadan/prediction-markets-odds --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bigdatadan/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/TvFrdfdizVGSP0pHI/openapi.json
