A typed Python client for the Kalshi prediction markets API with WebSocket streaming, automatic retries, and ergonomic interfaces
Project description
PyKalshi
The Python client for Kalshi prediction markets. WebSocket streaming, automatic retries, pandas integration, and clean interfaces for building trading systems.
from pykalshi import KalshiClient, Action, Side
client = KalshiClient()
# Place a trade
order = client.portfolio.place_order("KXBTC-25MAR15-B100000", Action.BUY, Side.YES, count_fp="10", yes_price_dollars="0.45")
order.wait_until_terminal() # Block until filled/canceled
Features
- WebSocket streaming - Real-time orderbook, ticker, and trade data with typed messages
- Automatic retries - Exponential backoff on rate limits and transient errors
- Domain objects -
Market,Order,Eventwith methods likeorder.cancel(),market.get_orderbook() - pandas integration -
.to_dataframe()on any list of results - Jupyter support - Rich HTML display for markets, orders, and positions
- Local orderbook -
OrderbookManagermaintains state from WebSocket deltas - Type safety - Pydantic models and typed exceptions throughout
Installation
pip install pykalshi
# With pandas support
pip install pykalshi[dataframe]
Get your API credentials from kalshi.com and create a .env file:
KALSHI_API_KEY_ID=your-key-id
KALSHI_PRIVATE_KEY_PATH=/path/to/private-key.key
Quick Start
Interactive demo:
examples/demo.ipynbor
Browse Markets
from pykalshi import MarketStatus, CandlestickPeriod
client = KalshiClient()
# Search markets
markets = client.get_markets(status=MarketStatus.OPEN, limit=100)
btc_markets = client.get_markets(series_ticker="KXBTC")
# Get a specific market
market = client.get_market("KXBTC-25MAR15-B100000")
print(f"{market.title}: ${market.yes_bid_dollars} / ${market.yes_ask_dollars}")
# Market data
orderbook = market.get_orderbook()
trades = market.get_trades(limit=50)
candles = market.get_candlesticks(start_ts, end_ts, period=CandlestickPeriod.ONE_HOUR)
Trading
from pykalshi import Action, Side, OrderStatus
# Check balance
balance = client.portfolio.get_balance()
print(f"${balance.balance / 100:.2f} available")
# Place an order
order = client.portfolio.place_order(market, Action.BUY, Side.YES, count_fp="10", yes_price_dollars="0.50")
# Manage orders
order.wait_until_terminal() # Block until filled/canceled
order.modify(yes_price=45) # Amend price
order.cancel() # Cancel
# View portfolio
positions = client.portfolio.get_positions()
fills = client.portfolio.get_fills(limit=100)
orders = client.portfolio.get_orders(status=OrderStatus.RESTING)
Real-time Streaming
from pykalshi import Feed, TickerMessage, OrderbookSnapshotMessage
async with Feed(client) as feed:
await feed.subscribe_ticker("KXBTC-25MAR15-B100000")
await feed.subscribe_orderbook("KXBTC-25MAR15-B100000")
await feed.subscribe_trades("KXBTC-25MAR15-B100000")
async for msg in feed:
match msg:
case TickerMessage():
print(f"Price: ${msg.price_dollars}")
case OrderbookSnapshotMessage():
print(f"Book: {len(msg.yes)} yes levels, {len(msg.no)} no levels")
Local Orderbook
from pykalshi import Feed, OrderbookManager
manager = OrderbookManager()
async with Feed(client) as feed:
await feed.subscribe_orderbook(ticker)
async for msg in feed:
manager.apply(msg)
book = manager.get(ticker)
best_bid = book["yes_dollars"][0] if book["yes_dollars"] else None
pandas Integration
# Any list result has .to_dataframe()
positions_df = client.portfolio.get_positions().to_dataframe()
markets_df = client.get_markets(limit=500).to_dataframe()
fills_df = client.portfolio.get_fills().to_dataframe()
# Candlesticks and orderbooks too
candles_df = market.get_candlesticks(start, end).to_dataframe()
orderbook_df = market.get_orderbook().to_dataframe()
Error Handling
from pykalshi import InsufficientFundsError, RateLimitError, KalshiAPIError
try:
order = client.portfolio.place_order(...)
except InsufficientFundsError:
print("Not enough balance")
except RateLimitError:
pass # Client auto-retries with backoff
except KalshiAPIError as e:
print(f"{e.status_code}: {e.error_code}")
Examples
See the examples/ directory:
- demo.ipynb - Interactive notebook with rich display examples
- basic_usage.py - Browse markets and check portfolio
- place_order.py - Place and manage orders
- stream_orderbook.py - WebSocket streaming patterns
- momentum_bot.py - Simple trading bot example
Web Dashboard
A real-time web dashboard is included for browsing markets, viewing orderbooks, and monitoring your portfolio. It serves as both a development tool and a reference implementation.
pip install pykalshi[web]
uvicorn web.backend.main:app --reload
See web/ for details.
Why pykalshi?
| pykalshi | kalshi-python (official) | |
|---|---|---|
| WebSocket streaming | ✓ | — |
| Automatic retry/backoff | ✓ | — |
| Rate limit handling | ✓ | — |
| Domain objects | ✓ | — |
| pandas integration | ✓ | — |
| Jupyter display | ✓ | — |
| Local orderbook | ✓ | — |
| Typed exceptions | ✓ | — |
| Pydantic models | ✓ | — |
| Full API coverage | — | ✓ |
The official SDK is auto-generated from the OpenAPI spec. pykalshi adds the infrastructure needed for production trading: real-time data, error recovery, and ergonomic interfaces.
Links
This is an unofficial library and is not affiliated with Kalshi.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pykalshi-1.0.2.tar.gz.
File metadata
- Download URL: pykalshi-1.0.2.tar.gz
- Upload date:
- Size: 89.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8acebfd39903da8794ac2db75155c93231a4124a83a81dca6712d2fbae0f76b4
|
|
| MD5 |
caa04417d27698182988404345a7afd1
|
|
| BLAKE2b-256 |
8a634b731d880c4fc4e9bdbe563887d5406668cd39f1f3a88172bf5dbe8753ea
|
File details
Details for the file pykalshi-1.0.2-py3-none-any.whl.
File metadata
- Download URL: pykalshi-1.0.2-py3-none-any.whl
- Upload date:
- Size: 76.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c5dcaf457d93cb131bda97e2923ae6826c4bf72ded06bf879fdcd6ed6beb13a
|
|
| MD5 |
d92fc2d503d85535f555db33105dc40e
|
|
| BLAKE2b-256 |
2bb5f6a93695696d49e91e4c614d1046c8fa065dce0685f3536e377a53b3fb3a
|