# Kalshi Markets Scraper (`vashiiq/kalshi-markets`) Actor

Kalshi prediction-market prices, bid/ask, volume and open interest by series, event or market, plus daily/hourly price history.

- **URL**: https://apify.com/vashiiq/kalshi-markets.md
- **Developed by:** [anthony leblanc](https://apify.com/vashiiq) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 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

## Kalshi Markets Scraper

Get Kalshi prediction-market prices as clean rows: yes/no bid and ask, last price, volume, open interest, close time and the official rules, by series, event or market. Switch to history mode for daily, hourly or minute price history.

### What it does

- Reads Kalshi’s public market data (no login, no API key).
- Filters by series (e.g. KXFED), event, market ticker, status and keyword.
- Returns prices in dollars as real numbers and dates in ISO format.
- Links the official contract terms PDF for every market.
- History mode returns one row per market per minute, hour or day.

**Why this one:** Snapshot and price-history modes in one Actor, prices as real numbers, the official contract terms link on every market, and combo markets filtered out unless you want them.

In our last check, 20 runs over varied inputs succeeded 100% of the time.

### Use cases

- Tracking odds on economics, weather, politics or sports events
- Building charts and dashboards of market-implied probabilities
- Comparing Kalshi prices with polls, forecasts or other markets

### Input example

```json
{
  "seriesTickers": [
    "KXFED"
  ],
  "maxItems": 5
}
```

- mode: snapshot (current prices) or history (candlesticks)
- seriesTickers / eventTickers / marketTickers: what to fetch
- status: open, closed, settled, unopened or any
- keyword: filter by title
- includeCombos: include multi-leg combo markets
- interval + historyDays: history mode

### Output sample

Real results from a run of this Actor:

```json
[
  {
    "ticker": "KXFED-26DEC-T3.00",
    "eventTicker": "KXFED-26DEC",
    "title": "Will the upper bound of the federal funds rate be above 3.00% following the Fed's Dec 9, 2026 meeting?",
    "interval": "hour",
    "periodEnd": "2026-10-24T21:00:00.000Z",
    "yesBidClose": 0.98,
    "yesAskClose": 0.99,
    "priceClose": null,
    "priceHigh": null,
    "priceLow": null,
    "volume": 0,
    "openInterest": 2802.17,
    "sourceUrl": "https://api.elections.kalshi.com/trade-api/v2/series/KXFED/markets/KXFED-26DEC-T3.00/candlesticks",
    "scrapedAt": "2026-10-27T19:55:51.516Z"
  },
  {
    "ticker": "KXFED-26DEC-T3.00",
    "eventTicker": "KXFED-26DEC",
    "title": "Will the upper bound of the federal funds rate be above 3.00% following the Fed's Dec 9, 2026 meeting?",
    "interval": "hour",
    "periodEnd": "2026-10-24T22:00:00.000Z",
    "yesBidClose": 0.98,
    "yesAskClose": 0.99,
    "priceClose": null,
    "priceHigh": null,
    "priceLow": null,
    "volume": 0,
    "openInterest": 2802.17,
    "sourceUrl": "https://api.elections.kalshi.com/trade-api/v2/series/KXFED/markets/KXFED-26DEC-T3.00/candlesticks",
    "scrapedAt": "2026-10-27T19:55:51.516Z"
  }
]
```

**Fields:**

- ticker, eventTicker, seriesTicker, eventTitle, title, outcome, category, status
- yesBid, yesAsk, noBid, noAsk, lastPrice, previousPrice (dollars, as numbers)
- volume, volume24h, openInterest
- openTime, closeTime, expirationTime (ISO), result, rules, contractTermsUrl, url
- History rows: periodEnd, priceClose/High/Low, yesBidClose, yesAskClose, volume, openInterest

### Pricing

Pay per result: **$1.50 per 1,000 results**. You pay only for results you get; Apify platform costs are included. Set a maximum charge for a run and the Actor stops cleanly when it's reached, keeping everything collected so far.

### Tips

- Start with a series ticker (it’s in the Kalshi URL) to keep runs small and fast.
- Combo markets (KXMVE…) are skipped by default because there are thousands; turn them on if you need them.
- Schedule a snapshot run to build your own price history over time.

### FAQ

**Do I need an account on Kalshi?** No. It only reads public pages and data.

**Are prices probabilities?** Kalshi contracts pay $1 if the outcome happens, so a price of 0.62 roughly means the market puts it at 62%.
**Something broke or a field is missing?** Open an issue on the Issues tab and include your run link. We fix scrapers quickly when sites change.

### Legal

This Actor collects publicly available data only. You're responsible for using it lawfully and in line with Kalshi's terms.

# Actor input Schema

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

Snapshot: current prices for each market. History: price history per market.

## `seriesTickers` (type: `array`):

Kalshi series, e.g. KXHIGHNY (NYC high temperature) or KXFED (Fed rate). Leave empty to scan all events.

## `eventTickers` (type: `array`):

Specific events, e.g. KXFED-26DEC. Overrides series.

## `marketTickers` (type: `array`):

Specific markets, e.g. KXFED-26DEC-T4.00. Overrides series and events.

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

Which markets to include when scanning series or all events.

## `keyword` (type: `string`):

Keep only markets whose event or market title contains this text.

## `includeCombos` (type: `boolean`):

Include multi-leg combo markets (event tickers starting KXMVE). Off by default because there are thousands.

## `interval` (type: `string`):

History mode only: one row per minute, hour or day.

## `historyDays` (type: `integer`):

History mode only: how many days back.

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

Stop after this many rows. You're only charged for rows you get.

## `proxyConfiguration` (type: `object`):

Not usually needed; Kalshi's market-data API is public.

## Actor input object example

```json
{
  "mode": "snapshot",
  "seriesTickers": [
    "KXFED"
  ],
  "status": "open",
  "includeCombos": false,
  "interval": "day",
  "historyDays": 30,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per market (or per period in history mode).

# 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 = {
    "seriesTickers": [
        "KXFED"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("vashiiq/kalshi-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 = {
    "seriesTickers": ["KXFED"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("vashiiq/kalshi-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 '{
  "seriesTickers": [
    "KXFED"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call vashiiq/kalshi-markets --silent --output-dataset

```

## MCP server setup

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