# Prediction Market Odds: Polymarket and Kalshi (`precious_bathmat/prediction-market-odds`) Actor

What Polymarket and Kalshi are pricing right now in one ranked feed: the implied probability of each outcome, how much is trading today, and when it resolves. Ranked by activity now, not lifetime volume. No API key.

- **URL**: https://apify.com/precious\_bathmat/prediction-market-odds.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 market quotes

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

## Prediction Market Odds: Polymarket and Kalshi

What the two biggest prediction markets are pricing **right now**, in one ranked feed: the implied probability of each outcome, how much is actually trading today, and when it resolves.

No API key, no login, no proxy.

### What does this do?

Prediction markets are the closest thing to a live probability on a question nobody can poll — a rate decision, an election, a nomination. But Polymarket and Kalshi each publish their own book, in their own shape, with their own units, and every existing Actor covers one venue.

This reads both, normalises them into one table, and ranks by **what is actually trading today**.

```mermaid
flowchart LR
    A[Polymarket<br/>dollar volume] --> C[One normalised feed]
    B[Kalshi<br/>contract volume] --> C
    C --> D[Implied probability,<br/>activity, time to resolve]
```

### Who is it for?

| You are | You use it to |
|---|---|
| **A trader** | See where the money actually is, across both venues, in one list |
| **A journalist or analyst** | Quote a live market probability instead of a stale poll |
| **Running a dashboard or bot** | Pull a clean odds feed without a data licence |
| **Researching sentiment** | Track how a probability moves as news lands |

### What data do you get?

| Field | What it is |
|---|---|
| `venue`, `question`, `outcome` | Which market, the question, and the specific outcome |
| `probabilityPercent`, `priceUsd` | The implied probability, and the raw price |
| `confidence` | The same number in words: genuinely uncertain, likely, all but ruled out |
| `volume24h`, `volumeTotal`, `liquidity`, `openInterest` | How much is trading now and in total |
| `priceChangeSincePrevious` | Movement, on Kalshi, without this Actor storing any history |
| `priceChangeWeek`, `priceChangeMonth` | Movement, on Polymarket |
| `daysUntilResolution`, `resolvesAt` | When it settles |
| `decided` | Whether the market has effectively answered the question already |
| `category`, `url` | Where it sits, and a link to the market |

### Example: one run, 24 September 2026

**13,037 markets read (1,600 Polymarket outcomes, 11,437 Kalshi markets), run finished in nine seconds**, filtered to the 100 most active, 50 from each venue:

| Venue | Question | Implied | Traded in 24 h |
|---|---|---|---|
| Polymarket | Dota 2: Natus Vincere vs LGD Gaming | **55.5% / 44.5%** | $821,283 |
| Polymarket | Valorant: Team Liquid vs Paper Rex | **3.5% / 96.5%** | $744,336 |
| Kalshi | 2028 U.S. Presidential Election winner: Gavin Newsom | 8.7% | 337,651 contracts |
| Kalshi | 2028 Democratic presidential nominee: Andy Beshear | 3.9% | 90,491 contracts |

Kalshi's busiest markets trade hundreds of thousands of contracts a day, and its election markets hold millions in open interest.

### What it refuses to do

- **It never adds dollars to contracts.** Polymarket reports volume in US dollars; Kalshi reports it in contracts. They are not the same unit, so they are never summed, and every row states its venue.
- **It does not let one venue bury the other.** Sorting both into a single list by "24-hour volume" looks reasonable and is wrong: $821,283 on Polymarket and 337,651 contracts on Kalshi look comparable and are not, so a merged sort ranks by whichever unit happens to run larger. An early run ranked that way returned **sixty Polymarket rows and no Kalshi rows at all**. Each venue is now ranked on its own terms and the list takes turns between them.
- **It ranks on activity now, not lifetime volume.** The single largest market by lifetime volume was **$83M with $134 traded in the last day**, priced at 0.003 — long since decided. Ranking on lifetime volume fills the table with corpses.
- **It will not claim two venues are pricing the same question unless they clearly are.** Cross-venue matching needs several distinctive words in common. A question reduced to one word would otherwise match anything containing it and report a fictional price gap. **In practice the overlap is thin** — the two venues list largely different things — and the Actor says so rather than padding the output.
- **It uses the endpoint that actually works.** Kalshi's market list returns multi-leg parlay rows with unreadable titles and no prices; the event endpoint returns the real question with its markets priced underneath.

### Popular prediction market reports

Ready-made runs you can open and start, or copy as a starting point:

- [Prediction Market Odds Today](https://apify.com/precious_bathmat/prediction-market-odds/examples/prediction-market-odds-today)
- [Election Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/election-odds)
- [Presidential Election Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/presidential-election-odds)
- [Politics Prediction Markets](https://apify.com/precious_bathmat/prediction-market-odds/examples/politics-prediction-markets)
- [Fed Interest Rate Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/fed-interest-rate-odds)
- [Economics Prediction Markets](https://apify.com/precious_bathmat/prediction-market-odds/examples/economics-prediction-markets)
- [Bitcoin Price Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/bitcoin-price-odds)
- [Ethereum Price Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/ethereum-price-odds)
- [Sports Prediction Markets](https://apify.com/precious_bathmat/prediction-market-odds/examples/sports-prediction-markets)
- [NFL Prediction Markets](https://apify.com/precious_bathmat/prediction-market-odds/examples/nfl-prediction-markets)
- [Entertainment Prediction Markets](https://apify.com/precious_bathmat/prediction-market-odds/examples/entertainment-prediction-markets)
- [Oscars and Awards Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/oscars-and-awards-odds)
- [Polymarket Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/polymarket-odds)
- [Kalshi Odds](https://apify.com/precious_bathmat/prediction-market-odds/examples/kalshi-odds)
- [Polymarket vs Kalshi Price Differences](https://apify.com/precious_bathmat/prediction-market-odds/examples/polymarket-vs-kalshi-price-differences)
- [Markets Resolving This Week](https://apify.com/precious_bathmat/prediction-market-odds/examples/markets-resolving-this-week)

### Pricing

**$0.002 per market returned.** The hundred most active markets across both venues costs **$0.20**.

### Input

| Setting | What it does |
|---|---|
| **Venues** | Both by default, or one on its own |
| **Only questions mentioning** | Filter to a topic, for example "fed", "election" or "bitcoin" |
| **Only this category** | Kalshi labels events Politics, Economics, World and so on |
| **Minimum activity in the last 24 hours** | Skip quiet markets. Remember the units differ per venue |
| **Hide markets that are already decided** | Drops anything beyond 97% or 3% |
| **Resolving within this many days** | Optional, for near-term questions only |
| **Look for the same question on both venues** | Reports price gaps where genuine overlap exists |
| **Maximum markets** | How many to return, most active first |

### Integrations

Runs on a schedule and connects to Google Sheets, Slack, Zapier, Make or your own code through the Apify API. Run it hourly against a search term and you have a probability time series for whatever question you care about.

# Actor input Schema

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

Which prediction markets to read. Both by default.

## `search` (type: `string`):

Optional. Keep only markets whose question or outcome contains this text, for example "election", "fed" or "bitcoin".

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

Optional. Kalshi labels events with categories such as Politics, Economics or World. Polymarket uses its event name.

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

Skip quiet markets. Polymarket counts this in US dollars and Kalshi in contracts, so the same number means different things on each.

## `excludeDecided` (type: `boolean`):

Drops anything priced at or beyond 97% and 3%, where the question is effectively settled.

## `maxDaysToResolve` (type: `integer`):

Optional. Keep only markets that settle within this many days. Leave empty for all of them.

## `compareVenues` (type: `boolean`):

Reports where Polymarket and Kalshi price the same question differently. Genuine overlap is thin, because the two list largely different things.

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

How many to return, most active first. Each costs $0.002.

## Actor input object example

```json
{
  "venues": [
    "Polymarket",
    "Kalshi"
  ],
  "search": "",
  "category": "",
  "minVolume24h": 0,
  "excludeDecided": false,
  "compareVenues": true,
  "maxMarkets": 100
}
```

# Actor output Schema

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

Every outcome returned, most active first.

## `summary` (type: `string`):

What each venue returned and any question priced on both.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/prediction-market-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/prediction-market-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 '{}' |
apify call precious_bathmat/prediction-market-odds --silent --output-dataset

```

## MCP server setup

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