Skip to main content
skill CX Codex

kalshi — Claude Code skill: Kalshi prediction markets

This skill gives your agent Kalshi prediction market data: events, series, contracts, trades and candlesticks on sports outcomes. Useful when you want implied probabilities, not match results.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add machina-sports/sports-skills --skill kalshi -a claude-code
Open on GitHub

What kalshi does

The skill wraps the public Kalshi exchange API, regulated by the CFTC. Reads need no auth and no API key. Commands include search_markets, get_todays_events, get_markets, get_event, get_market, get_trades, get_market_candlesticks and get_sports_config, plus get_esports_odds for cs2, lol and dota2. There is a CLI (sports-skills kalshi) and a Python SDK (from sports_skills import kalshi).

Prices are probabilities on a 0-100 integer scale: a last_price of 20 means 20% implied. Do not read them as American odds. Coverage spans football (EPL, UCL, La Liga, Bundesliga, Serie A, Ligue 1, MLS, World Cup), basketball, baseball, tennis, NFL, hockey, F1 and esports. On Kalshi, "Football" means the NFL, so European soccer needs codes like epl, ucl or laliga.

The skill tells you to check references/api-reference.md first for sport codes, series tickers and command parameters. The sport parameter is required on search_markets and get_todays_events — without it a search returns only high-volume futures and misses single-game markets. Pass status="open" when listing markets, or settled contracts show up in the results. Tickers are not always <event_ticker>-<suffix>, so group markets by the event_ticker field instead of parsing the ticker string.

What it helps with

  • find open Kalshi markets for a given sport
  • check implied probabilities for an EPL or NBA game
  • pull OHLC price history for a market ticker
  • rank tournament futures by last price
  • list recent trades on a contract

Example prompts for the agent

  • What NBA markets are open on Kalshi?
  • Show me Leeds odds on Kalshi for the EPL
  • Who is the favourite to win the Champions League on Kalshi?

How to install kalshi

1Skills CLI (Vercel)

npx skills add machina-sports/sports-skills --skill kalshi -a claude-code

2Manually: put the files in place

~/.claude/skills/kalshi/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/kalshi/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about kalshi

How do I install kalshi in Claude?

Run npx skills add machina-sports/sports-skills --skill kalshi -a claude-code. The skill lands in ~/.claude/skills/kalshi/SKILL.md.

What does the kalshi skill do?

It pulls Kalshi prediction market data: events, series, markets, trades and candlesticks. Prices come back as probabilities on a 0-100 scale, and reads need no authentication.

How is kalshi different from polymarket?

They share an interface: search_markets(sport=...), get_todays_events(sport=...) and get_sports_config() behave the same on both. Kalshi uses a 0-100 price scale, Polymarket uses 0-1, and Polymarket covers more sports.

Source text

SKILL.md · MIT
---
name: kalshi
description: |
  Kalshi prediction markets — events, series, markets, trades, and candlestick data. Public API, no auth required for reads. US-regulated exchange (CFTC). Covers football (EPL, UCL, La Liga), basketball, baseball, tennis, NFL, hockey event contracts.

  Use when: user asks about Kalshi-specific markets, event contracts, CFTC-regulated prediction markets, or candlestick/OHLC price history on sports outcomes.
  Don't use when: user asks about actual match results, scores, or statistics — use the sport-specific skill: football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-data (NHL), mlb-data (MLB), tennis-data (tennis), golf-data (golf), cricket-data (cricket), cfb-data (college football), cbb-data (college basketball), or fastf1 (F1). Don't use for general "who will win" questions unless Kalshi is specifically mentioned — try polymarket first (broader sports coverage). Don't use for news — use sports-news instead.
license: MIT
metadata:
  author: machina-sports
  version: "0.2.0"
---

# Kalshi — Prediction Markets

Before writing queries, consult `references/api-reference.md` for sport codes, series tickers, and command parameters.

## Quick Start

Prefer the CLI — it avoids Python import path issues:
```bash
sports-skills kalshi search_markets --sport=nba
sports-skills kalshi get_todays_events --sport=nba
sports-skills kalshi get_sports_config
sports-skills kalshi get_markets --series_ticker=KXNBA --status=open
```

Python SDK (alternative):
```python
from sports_skills import kalshi

kalshi.search_markets(sport='nba')
kalshi.search_markets(sport='nba', query='Lakers')
kalshi.get_todays_events(sport='nba')
kalshi.get_sports_config()
kalshi.get_markets(series_ticker="KXNBA", status="open")
```

## CRITICAL: Before Any Query

CRITICAL: Before calling any market endpoint, verify:
- The `sport` parameter is always passed to `search_markets` and `get_todays_events` for single-game markets.
- Prices are on a 0-100 integer scale (20 = 20% implied probability) — do not treat as American odds.
- `status="open"` is used when querying markets to exclude settled/closed markets.

Without the `sport` parameter:
```
WRONG: search_markets(query="Leeds")           → 0 results
RIGHT: search_markets(sport='epl', query='Leeds') → returns all Leeds markets
```

## Important Notes

- **On Kalshi, "Football" = NFL.** For football/soccer (EPL, La Liga, etc.), use sport codes: `epl`, `ucl`, `laliga`, `bundesliga`, `seriea`, `ligue1`, `mls`, `worldcup`.
- **Formula 1** uses sport code `f1` (drivers'/constructors' champion plus per-Grand-Prix race, podium, pole, fastest-lap, head-to-head and sprint series).
- **Market tickers are not always `<event_ticker>-<suffix>`.** Kalshi mints some with a different stem, e.g. `KXATP-26-SHA` sits inside event `KXATP-26USO` (2026 US Open men's singles) next to `KXATP-26USO-SIN`. That is Kalshi's real ticker: pass it verbatim to `get_market`, and group markets by their `event_ticker` field, never by parsing the ticker.
- **Prices are probabilities.** A `last_price` of 20 means 20% implied probability. Scale is 0-100 (not 0-1 like Polymarket).
- **Always use `status="open"`** when querying markets, otherwise results include settled/closed markets.
- **Shared interface with Polymarket:** `search_markets(sport=...)`, `get_todays_events(sport=...)`, and `get_sports_config()` work the same way on both platforms.

## Workflows

### Sport Market Search (Recommended)
1. `search_markets --sport=nba` — finds all open NBA markets.
2. Optionally add `--query="Lakers"` to filter by keyword.
3. Results include yes_bid, no_bid, volume for each market.

### Today's Events
1. `get_todays_events --sport=nba` — open events with nested markets.
2. Present events with prices (price = implied probability, 0-100 scale).

### Futures Market Check
1. `get_markets --series_ticker=<ticker> --status=open`
2. Sort by `last_price` descending.
3. Present top contenders with probability and volume.

### Market Price History
1. Get market ticker from `search_markets --sport=nba`.
2. `get_market_candlesticks --series_ticker=<s> --ticker=<t> --start_ts=<start> --end_ts=<end> --period_interval=60`
3. Present OHLC with volume.

## Commands

See `references/api-reference.md` for the full command list with parameters.

| Command | Description |
|---|---|
| `get_sports_config` | Available sport codes and series tickers |
| `get_todays_events` | Today's events for a sport with nested markets |
| `search_markets` | Find markets by sport and/or keyword |
| `get_esports_odds` | Esports markets (cs2/lol/dota2): prices in cents (0-100) plus `implied_probability` (0-1) and `decimal_odds` |
| `get_markets` | Market listing (raw API) |
| `get_event` | Event details |
| `get_market` | Market details |
| `get_trades` | Recent trades |
| `get_market_candlesticks` | OHLC price history |

## Examples

Example 1: NBA market search
User says: "What NBA markets are on Kalshi?"
Actions:
1. Call `search_markets(sport='nba')`
Result: All open NBA markets with yes/no prices and volume

Example 2: EPL game markets
User says: "Show me Leeds vs Man City odds on Kalshi"
Actions:
1. Call `search_markets(sport='epl', query='Leeds')`
Result: Leeds EPL markets across all EPL series with prices and volume

Example 3: Today's EPL events
User says: "What EPL games are available on Kalshi?"
Actions:
1. Call `get_todays_events(sport='epl')`
Result: Today's EPL events with nested markets

Example 4: Champions League futures
User says: "Who will win the Champions League?"
Actions:
1. Call `search_markets(sport='ucl')` or `get_markets(series_ticker="KXUCL", status="open")`
2. Sort by `last_price` descending (price = implied probability)
Result: Top UCL contenders with `yes_sub_title`, `last_price` (%), and volume

Example 5: Market price history
User says: "Show me the price history for this NBA game"
Actions:
1. Get market ticker from `search_markets(sport='nba')`
2. Call `get_market_candlesticks(series_ticker="KXNBA", ticker="...", start_ts=..., end_ts=..., period_interval=60)`
Result: OHLC price data with volume

## Commands that DO NOT exist — never call these

- ~~`get_odds`~~ — does not exist. Use `search_markets` or `get_markets` to find market prices.
- ~~`get_team_schedule`~~ — does not exist. Kalshi has markets, not schedules. Use the sport-specific skill for schedules.
- ~~`get_scores`~~ / ~~`get_results`~~ — does not exist. Kalshi is a prediction market. Use the sport-specific skill.

If a command is not listed in `references/api-reference.md`, it does not exist.

## Troubleshooting

Error: `search_markets` returns 0 results
Cause: The `sport` parameter is missing — without it, search only returns high-volume futures and misses single-game markets
Solution: Always pass `sport='<code>'` to `search_markets`. Check `references/api-reference.md` for valid sport codes

Error: Markets returned include settled/expired contracts
Cause: `status` parameter is not set
Solution: Always pass `status="open"` to filter to open markets only

Error: Series ticker returns no results
Cause: The series ticker may be incorrect or have no open markets
Solution: Call `get_series_list()` to discover available tickers, or check `references/series-tickers.md`

Error: Football/soccer markets not found when searching "Football"
Cause: On Kalshi, "Football" refers to NFL — soccer uses league-specific codes
Solution: Use `sport='epl'`, `sport='ucl'`, `sport='laliga'`, etc. for soccer leagues

© machina-sports · MIT · machina-sports/sports-skills

Similar skills

Everything for Finance and business →

From the same set22

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor