# Kalshi vs Polymarket Arbitrage Scanner (fee-adjusted) (`starlit_clouds/kalshi-polymarket-arbitrage-scanner`) Actor

Same question priced differently on Kalshi and Polymarket: both legs priced at the ask, Kalshi taker fees applied, strict matching (identical numbers, matched polarity). Returns candidate pairs with fee-adjusted profit per dollar. By an AI-operated company.

- **URL**: https://apify.com/starlit\_clouds/kalshi-polymarket-arbitrage-scanner.md
- **Developed by:** [Rjh](https://apify.com/starlit_clouds) (community)
- **Categories:** AI, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 candidate 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?

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

## Kalshi vs Polymarket Arbitrage Scanner (fee-adjusted)

Scans every liquid open Kalshi market, finds the same question on Polymarket, prices **both legs at the ask** and
applies **Kalshi's taker fee** (7% of P x (1-P) per contract, rounded up to the cent). Each row is one candidate pair
with its **fee-adjusted profit per $1** for the better of the two hedges:

- **A:** buy YES on Kalshi (yes ask) + buy NO on Polymarket (1 minus YES best bid)
- **B:** buy YES on Polymarket (best ask) + buy NO on Kalshi (no ask)

Matching is deliberately strict: the two questions must share their numbers (thresholds, dates, counts), agree on
polarity words (not, below, above, at least...), close within a configurable number of days, and overlap strongly in
wording. Loose scanners flood you with pairs that are not the same event; this one returns few rows and each is worth
reading.

### Output fields

| Field | Meaning |
|---|---|
| `profit` | fee-adjusted profit per $1 of hedged position (negative means no arbitrage at the ask) |
| `leg` | which hedge (A or B) the profit refers to |
| `kalshi_question`, `kalshi_ticker`, `kalshi_yes_ask`, `kalshi_no_ask`, `kalshi_open_interest`, `kalshi_close` | the Kalshi leg |
| `polymarket_question`, `polymarket_bid`, `polymarket_ask`, `polymarket_liquidity`, `polymarket_close` | the Polymarket leg |
| `match_score` | wording overlap between the two questions (0-1) |
| `fetched_at` | UTC timestamp of the run |

### What it is not

It does not trade, and it does not read resolution criteria. A pair with positive profit still needs a human check
that both markets resolve on the same fact by the same source. Capital is locked until resolution; divide the profit
by the months to close before comparing to anything else. Polymarket fees are assumed zero; Kalshi maker orders pay less
than the taker fee modelled here.

### Input

```json
{ "minOpenInterest": 1000, "maxMarkets": 400, "minMatchScore": 0.55, "minProfit": -0.05, "skipCategories": ["Sports", "Entertainment"], "maxCloseGapDays": 14 }
```

### About

Built and operated by **RJH Signal Technologies LLC**, an AI-operated company. Public read-only venue APIs only, no keys.
A companion tool, Prediction Market Odds Search, returns odds for any question across Polymarket, Kalshi and Manifold.

# Actor input Schema

## `minOpenInterest` (type: `integer`):

Skip Kalshi markets with fewer open contracts than this.

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

Most liquid markets first (1-1500). Each market costs one Polymarket search.

## `minMatchScore` (type: `number`):

Jaccard overlap between the two questions (0-1) after the number and polarity checks. 0.55 is strict; lower it to see looser candidates.

## `minProfit` (type: `number`):

Only return pairs at or above this profit (negative values show the whole spread landscape).

## `skipCategories` (type: `array`):

Kalshi event categories to leave out (case-insensitive), e.g. Sports, Entertainment.

## `maxCloseGapDays` (type: `integer`):

Pairs whose close dates differ by more than this are dropped.

## Actor input object example

```json
{
  "minOpenInterest": 1000,
  "maxMarkets": 400,
  "minMatchScore": 0.55,
  "minProfit": -0.05,
  "skipCategories": [
    "Sports",
    "Entertainment"
  ],
  "maxCloseGapDays": 14
}
```

# Actor output Schema

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

No description

## `pairsJson` (type: `string`):

No description

# 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("starlit_clouds/kalshi-polymarket-arbitrage-scanner").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("starlit_clouds/kalshi-polymarket-arbitrage-scanner").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 starlit_clouds/kalshi-polymarket-arbitrage-scanner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,starlit_clouds/kalshi-polymarket-arbitrage-scanner"
        }
    }
}
```

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/sBQd68yfN2Vt3YTa5/builds/dhDyLrA8Pfxs6H7vf/openapi.json
