# Polymarket vs Kalshi Matched Markets & Price Gaps (`literate_universe/polymarket-kalshi-matched-markets`) Actor

Finds the same question listed on both Polymarket and Kalshi - election odds, politics, crypto, sports - and reports both prices side by side with the gap and the cross-venue edge each way. Public APIs, no login. Matches are heuristic and carry a similarity score.

- **URL**: https://apify.com/literate\_universe/polymarket-kalshi-matched-markets.md
- **Developed by:** [John Rutherford](https://apify.com/literate_universe) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 matched pairs

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Polymarket vs Kalshi Matched Markets & Price Gaps

Finds the **same real-world question listed on both Polymarket and Kalshi** and puts the two prices side by side, with the gap and the gross cross-venue edge in each direction. Public APIs only. No login, no wallet, no API key.

For traders comparing venues, researchers studying price discovery across prediction markets, and anyone building an alert on "these two markets disagree".

### What you get

One row per matched pair:

| Field | Meaning |
|---|---|
| `polymarket_question`, `polymarket_url`, `polymarket_event` | The Polymarket market |
| `kalshi_title`, `kalshi_subtitle`, `kalshi_ticker`, `kalshi_category` | The Kalshi event and the specific leg |
| `poly_yes_mid`, `poly_best_bid`, `poly_best_ask` | Polymarket YES price (0 to 1) |
| `kalshi_yes_mid`, `kalshi_yes_bid`, `kalshi_yes_ask`, `kalshi_last` | Kalshi YES price (0 to 1) |
| `price_gap` | `poly_yes_mid - kalshi_yes_mid` |
| `edge_buy_kalshi_yes_sell_poly` | `poly_best_bid - kalshi_yes_ask` |
| `edge_buy_poly_yes_sell_kalshi` | `kalshi_yes_bid - poly_best_ask` |
| `best_edge` | The larger of the two, gross of fees |
| `similarity` | 0 to 1 confidence that the two questions are the same |
| `days_apart` | Difference between the two resolution dates |
| `poly_volume_24h`, `poly_liquidity`, `kalshi_volume_24h`, `kalshi_open_interest` | Activity on each side |

Sample rows (real, September 2026):

| Polymarket | Kalshi | Poly YES | Kalshi YES | Sim |
|---|---|---|---|---|
| Will Josh Shapiro win the 2028 Democratic nomination? | 2028 Democratic presidential nominee :: Josh Shapiro | 0.065 | 0.048 | 1.00 |
| Will the price of Bitcoin be above $76,000 on September 11? | BTC price on Sep 11, 2026 at 5pm EDT? :: $76,000 or above | 0.887 | 0.870 | 0.59 |
| Will 1 Fed rate cut happen in 2026? | Number of rate cuts in 2026? :: Exactly 1 cut | 0.057 | 0.080 | 0.55 |

### How matching works

1. Pull the top N active Polymarket **Yes/No** markets by 24h volume, and every open Kalshi market (parlay combinations excluded).
2. Tokenise both questions (synonyms folded: BTC = Bitcoin, GOP = Republican, and so on) and score token overlap. Matching numbers (strikes, years) add confidence; conflicting numbers halve it.
3. Reject pairs whose market *type* differs (a spread is not a moneyline, an exact score is not an over/under), whose Kalshi leg is not named in the Polymarket question, whose negation differs, or whose resolution dates are more than **Max days apart**.
4. Keep the best Kalshi match per Polymarket market above **Min similarity**.

Rows are sorted by similarity, then edge. **A large edge on a low-similarity row is almost always a different question, not free money.** Similarity 1.0 means the same wording; 0.55 to 0.7 means read both rule sets before you act.

### Input

| Option | Default | What it does |
|---|---|---|
| **Polymarket markets to scan** | 300 | Top N by 24h volume |
| **Min Polymarket 24h volume** | 1000 | Ignore thin markets |
| **Min similarity** | 0.5 | Raise to 0.7 for strict matches only |
| **Max days between end dates** | 7 | Different windows are different markets |
| **Kalshi category** | any | Restrict to Politics, Economics, Crypto, Sports, and so on |
| **Only pairs with positive edge** | off | Output only rows where `best_edge > 0` |
| **Max pairs** | 500 | Cap output and spend |

### Pricing

Pay per event: one small charge per matched pair. Scanning is free; you pay only for rows returned. A typical run with defaults returns 20 to 60 pairs in about 30 seconds.

### Notes and limits

- Edges are **gross**: they ignore Polymarket and Kalshi fees, spread crossing, slippage and the capital lock-up until resolution. Treat them as a screen, not a signal.
- Both venues can word the "same" question with different resolution sources or deadlines. `days_apart` and the `note` field are reminders; the rule text is on each venue's page.
- Polymarket multi-outcome markets (two teams, several candidates) are skipped; only Yes/No markets are compared.
- This Actor never places orders.

### Related

- Kalshi Markets Scraper: every Kalshi market with prices, volume and order books.

# Actor input Schema

## `maxPolymarketMarkets` (type: `integer`):

Top N active Polymarket markets by 24h volume to try to match.

## `minPolymarketVolume24h` (type: `number`):

Ignore Polymarket markets with less than this much 24-hour volume in USD.

## `minSimilarity` (type: `number`):

Token-overlap threshold for a pair to count as a match. 0.5 is balanced, 0.7 is strict.

## `maxDaysApart` (type: `integer`):

Pairs whose Polymarket end date and Kalshi close time differ by more than this are dropped. Different resolution windows are not the same market.

## `kalshiCategory` (type: `string`):

Optional: only consider Kalshi markets in this category (Politics, Economics, Crypto, Sports, Financials, World, Entertainment, Climate and Weather).

## `onlyWithEdge` (type: `boolean`):

Output only pairs where buying YES on one venue and selling on the other has a positive gross edge before fees.

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

Stop after this many matched pairs.

## Actor input object example

```json
{
  "maxPolymarketMarkets": 300,
  "minPolymarketVolume24h": 1000,
  "minSimilarity": 0.5,
  "maxDaysApart": 7,
  "onlyWithEdge": false,
  "maxItems": 500
}
```

# Actor output Schema

## `pairs` (type: `string`):

All matched pairs as JSON, sorted by similarity then edge. Append ?format=csv for CSV.

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

Counts of Polymarket and Kalshi markets loaded and pairs found.

# 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("literate_universe/polymarket-kalshi-matched-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("literate_universe/polymarket-kalshi-matched-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 '{}' |
apify call literate_universe/polymarket-kalshi-matched-markets --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,literate_universe/polymarket-kalshi-matched-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/CHzRRxH41XHKphFu3/builds/JRykKvJ0FrKzTgejM/openapi.json
