# Prediction Market Movers: Kalshi & Polymarket Odds Alerts (`mytho-labs/prediction-market-movers`) Actor

Kalshi and Polymarket odds in one feed. Get only the markets that moved since your last run, newly opened markets, and resolved outcomes, each with a ready-to-send headline. Filter by keyword or category: elections, Iran, Fed, crypto and more.

- **URL**: https://apify.com/mytho-labs/prediction-market-movers.md
- **Developed by:** [Josh Ungheanu](https://apify.com/mytho-labs) (community)
- **Categories:** News, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 market results

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 Movers: Kalshi & Polymarket Odds Alerts

Find out what the world just changed its mind about. This Actor scans **Kalshi** and **Polymarket** and returns only the markets whose odds **moved** since your last run, along with **newly opened** markets and markets that **resolved**. Each result comes with a ready-to-send headline like:

> US-Iran ceasefire continues through November 30? 62% → 41% (−21.0 pts since last run)

Schedule it every hour and connect it to Slack, email, a spreadsheet or your own app, and you have a live alert feed for elections, geopolitics, the Fed, crypto, or anything else traded on prediction markets.

### Why use it

- **Signals, not data dumps.** Other tools hand you thousands of markets. This one remembers the odds from your previous run and returns only the markets that changed, so you can act on the move rather than search for it.
- **Kalshi and Polymarket in one format.** Odds are always the "Yes" probability in percent, and changes are always in percentage points, whichever platform the market is on.
- **New and resolved markets.** It catches markets that just opened, and reports the outcome of markets that settled since the last run, along with what the odds were before.
- **Noise filters built in.** Thinly traded markets and markets about to close (which swing to 0% or 100% as they settle) are skipped by default.
- **Official public APIs.** It reads the platforms' public market data endpoints, with no login or browser. A full scan of both platforms takes about 20 seconds.

### Use cases

- **Newsrooms and analysts:** get alerted when the market's view of an election, a ceasefire or a rate decision shifts sharply.
- **Traders:** watch odds moves across both platforms from one feed.
- **Research and dashboards:** build a time series of odds by running the Actor on a schedule.
- **AI agents:** give your agent a compact, current picture of what markets expect to happen.

### Input

| Field | What it does |
|---|---|
| **Search terms** | Only include markets whose title, outcome or tags contain one of these words (`iran`, `election`, `fed`, `bitcoin`). Empty means all markets. |
| **Categories** | Only include markets in these categories or tags (`Politics`, `Elections`, `Economics`, `Crypto`). |
| **Exclude terms** | Skip markets containing any of these words. |
| **Mode** | `movers` returns movers, new and resolved markets. `snapshot` returns every matching market. |
| **Measure moves over** | `sinceLastRun` (default), `1h`, `24h` or `7d`. The 1h and 7d windows are Polymarket only. |
| **Minimum change** | Percentage points needed to count as a mover (default 5). |
| **Include new / resolved markets** | Both on by default. |
| **Minimum 24h volume** | Skip thinly traded markets (default $1,000). |
| **Skip markets closing within** | Hours (default 24). Set to 0 to include them. |
| **Platforms** | Polymarket, Kalshi, or both. |

#### How "since last run" works

The Actor saves the odds of every matching market after each run, separately for each combination of platforms and filters. The next run with the same filters compares against them. **The first run has no history yet, so it reports 24-hour movers instead.** Schedule the Actor hourly or daily to get a continuous feed.

#### Example input

```json
{
  "searchTerms": ["iran", "ceasefire", "hormuz"],
  "mode": "movers",
  "moverWindow": "sinceLastRun",
  "minChangePoints": 5
}
```

### Output

```json
{
  "signal": "moved",
  "headline": "US-Iran ceasefire continues through...? — November 30: 62% → 41% (−21.0 pts since last run)",
  "platform": "polymarket",
  "eventTitle": "US-Iran ceasefire continues through...?",
  "question": "US-Iran ceasefire continues through November 30?",
  "outcomeLabel": "November 30",
  "probabilityPct": 41,
  "previousProbabilityPct": 62,
  "changeSinceLastRun": -21,
  "change1h": -3.5,
  "change24h": -20.5,
  "change7d": 4,
  "yesBidPct": 40.5,
  "yesAskPct": 41.5,
  "volume24h": 250000,
  "volume": 37930696,
  "closesAt": "2026-11-30T00:00:00Z",
  "status": "open",
  "result": null,
  "category": "Politics",
  "tags": ["Politics", "Iran"],
  "url": "https://polymarket.com/event/us-iran-ceasefire-continues-through",
  "previousRunAt": "2026-11-03T06:00:00.000Z",
  "scrapedAt": "2026-11-03T12:00:00.000Z"
}
```

`signal` is one of `moved`, `new`, `resolved` or `snapshot`. Resolved markets include `result` (e.g. `YES`, `NO`, or the winning outcome name). Results are sorted with resolved first, then the biggest moves.

A `SUMMARY` record in the run's key-value store shows how many markets were scanned on each platform, the counts of each signal, and the window used.

### Pricing

You pay per result returned. Scanning is free, so a run where nothing moved costs almost nothing. Set a maximum cost per run in the run options and the Actor stops cleanly when it's reached.

### FAQ

**Why did my first run return so many results?** With no earlier run to compare against, the first run reports 24-hour moves. From the second run on, you'll only see what changed since the previous run.

**Can I track two different topics?** Yes. Each combination of search terms, categories and platforms keeps its own history, so an "iran" task and a "fed" task won't interfere with each other.

**Is this financial advice?** No. This is market data, shown as it appears on each platform.

# Actor input Schema

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

Only include markets whose title, outcome or tags contain one of these words (e.g. iran, election, fed, bitcoin). Leave empty to scan every market.

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

Only include markets in these categories or tags (e.g. Politics, Elections, Economics, Crypto, Geopolitics, Sports).

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

Skip markets whose title, outcome or tags contain any of these words (e.g. temperature, NBA).

## `mode` (type: `string`):

Movers returns only markets that moved by at least the minimum change, plus new and resolved markets. Snapshot returns every matching market with its current odds.

## `moverWindow` (type: `string`):

Since last run compares with the odds saved on your previous run with the same filters; schedule the Actor (e.g. hourly) to get a stream of alerts. The first run falls back to 24 hours. The 1 hour and 7 day windows are available for Polymarket only.

## `minChangePoints` (type: `integer`):

How far the odds must move to count as a mover. 5 means e.g. 40% → 45%.

## `includeNewMarkets` (type: `boolean`):

Also return markets that appeared since the last run.

## `includeResolved` (type: `boolean`):

Also return markets that resolved since the last run, with the outcome.

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

Skip thinly traded markets whose odds move on tiny trades.

## `skipMarketsClosingWithinHours` (type: `integer`):

Markets about to close swing to 0% or 100% as they settle, which drowns out real news. Set to 0 to include them.

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

Which prediction markets to scan.

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

Stop after this many results, biggest moves first.

## Actor input object example

```json
{
  "searchTerms": [
    "iran",
    "ceasefire",
    "election"
  ],
  "mode": "movers",
  "moverWindow": "sinceLastRun",
  "minChangePoints": 5,
  "includeNewMarkets": true,
  "includeResolved": true,
  "minVolume24h": 1000,
  "skipMarketsClosingWithinHours": 24,
  "platforms": [
    "polymarket",
    "kalshi"
  ],
  "maxResults": 500
}
```

# Actor output Schema

## `alerts` (type: `string`):

Movers, new and resolved markets from this run, biggest moves first.

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

Markets scanned per platform, signal counts and the comparison window used.

# 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": [
        "iran",
        "ceasefire",
        "election"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mytho-labs/prediction-market-movers").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": [
        "iran",
        "ceasefire",
        "election",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mytho-labs/prediction-market-movers").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": [
    "iran",
    "ceasefire",
    "election"
  ]
}' |
apify call mytho-labs/prediction-market-movers --silent --output-dataset

```

## MCP server setup

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

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/EQFGp1FEhI8iLcxZg/builds/lQgMEPyjavBHX2lGm/openapi.json
