# Prediction Markets: Polymarket + Kalshi Odds (`ensorcelling_melilot/prediction-markets`) Actor

Live odds, volume and close dates for prediction markets on Polymarket and Kalshi in one flat table. Search by keyword, filter by volume, probability and close date, then export or schedule. $2 per 1,000 markets, charged per market saved.

- **URL**: https://apify.com/ensorcelling_melilot/prediction-markets.md
- **Developed by:** [ensorcelling \_melilot](https://apify.com/ensorcelling_melilot) (community)
- **Categories:** News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 market saveds

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 Markets: Polymarket + Kalshi Odds

Live odds, volume and close dates for prediction markets from Polymarket and Kalshi, in one flat table. Search by keyword, filter by volume, probability and close date, and export to CSV, Excel, JSON or Google Sheets. Uses each platform's official public read API. No scraping, no proxies, no login.

### What you get

One row per market:

| platform | question | impliedProbabilityPct | volume24hUsd | volumeUsd | closeTime | status | url |
|---|---|---|---|---|---|---|---|
| polymarket | Will Bitcoin hit $150k in 2026? | 12.5 | 84,210 | 3,100,000 | 2026-12-31 | open | https://polymarket.com/event/... |
| kalshi | Fed cuts rates in December? | 61 | 22,400 | 410,000 | 2026-12-10 | open | https://kalshi.com/markets/... |

Every row also has `marketId`, `eventTitle`, `category`, `yesPrice`, `noPrice`, every outcome with its price, `lastTradePrice`, `bestBid`, `bestAsk`, `liquidityUsd` (Polymarket), `openInterest` (Kalshi), `updatedAt` and `scrapedAt`. Turn on *Include resolution rules text* for the full rules of each market.

### Use cases

- Daily odds tracker for a topic: schedule a run with `searchTerms` (for example `fed, inflation`) and send the dataset to Google Sheets, Slack or email with an integration.
- Compare the same question on both platforms and spot gaps.
- Feed an AI agent or dashboard with current market-implied probabilities.
- Find markets about to close (`closesWithinDays`) or with big volume (`minVolume24hUsd`).

### Pricing

Pay per market saved. Set *Maximum markets* or the run's *Maximum cost per run* and the run stops there. A platform that cannot be read is skipped and reported in the run summary; if neither can be read the run fails and nothing is charged.

### Good to know

- **Prices are probabilities, not advice.** A Yes price of 0.62 means the market currently implies about 62%. This is data from public markets, not financial or betting advice. Check each platform's rules before trading, and note that access to trading differs by country.
- **Always credit the source.** Each row carries `platform` and a `url` to the market page. Please link back when you republish.
- **Yes/no markets only have a probability.** Multi-outcome markets (for example team names) list every outcome under `outcomes`; `yesPrice` and `impliedProbabilityPct` are empty for them.
- **Kalshi lists many sports legs as separate markets.** Use `excludeTerms` or `minVolume24hUsd` to focus.
- Kalshi prices are in dollars (0.62 = 62 cents) and volume is in contracts, which settle at $1. Polymarket volume is in USD.
- Closed markets are recent ones the platforms still return; this is not a full history archive.

# Actor input Schema

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

Which prediction markets to read. Leave empty for both.

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

Keep only markets whose question, event title or category contains at least one of these words, e.g. bitcoin, fed, election. Leave empty for all markets.

## `excludeTerms` (type: `array`):

Drop markets whose question or event title contains any of these words, e.g. spread, nba.

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

Open markets can still be traded. Closed markets have ended or settled (recent ones only).

## `minVolume24hUsd` (type: `integer`):

Skip thinly traded markets. Leave empty for no minimum.

## `minVolumeUsd` (type: `integer`):

Skip markets with less lifetime volume than this. Leave empty for no minimum.

## `minProbabilityPct` (type: `number`):

Keep markets where the Yes price is at least this many percent. Only yes/no markets have a probability.

## `maxProbabilityPct` (type: `number`):

Keep markets where the Yes price is at most this many percent.

## `closesWithinDays` (type: `integer`):

Keep only markets that close within this many days from now. Leave empty for any close date.

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

Order of the results before the maximum is applied.

## `includeRules` (type: `boolean`):

Adds the full rules for how each market resolves. Makes rows larger.

## `maxItems` (type: `integer`):

Stop after this many markets. Each market saved is charged once.

## Actor input object example

```json
{
  "platforms": [
    "polymarket",
    "kalshi"
  ],
  "searchTerms": [
    "bitcoin"
  ],
  "status": "open",
  "sortBy": "volume24h",
  "includeRules": false,
  "maxItems": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per market: question, Yes probability, volume, close time and link.

## `allFields` (type: `string`):

Every market with all fields, including every outcome price.

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

Markets read and matched per platform, and any platform that could not be read.

# 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("ensorcelling_melilot/prediction-markets").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("ensorcelling_melilot/prediction-markets").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 ensorcelling_melilot/prediction-markets --silent --output-dataset

```

## MCP server setup

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

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/F0acRPNwyhxyNflWP/builds/R7h5mZyj5ECqMHLRE/openapi.json
