Get pinged the second a Kalshi market moves. Tiny Python CLI, multi-channel alerts.
Project description
kalshiwatch
Get pinged the second a Kalshi market moves.
Polymarket-side preview (live, no install): https://creampig666.github.io/prediction-markets-live/
Tiny Python CLI that polls Kalshi's public market API, watches the tickers you care about, and fires alerts to your console / Telegram / Discord the moment a market's implied probability crosses a threshold you set.
No keys, no auth, no signup. Just a YAML file and a wallet for tips.
[kalshiwatch] Elon to Mars in lifetime [UP] 0.080 -> 0.095 (+18.75%)
[kalshiwatch] Mamdani president by 45 [DN] 0.098 -> 0.080 (-18.37%)
Family of tools (same author, same wallet, same UX):
- 🟢 polywatch — same idea, Polymarket-side
- 🟢 kalshiwatch — you're here
- 🟢 manifold-watch — same idea, Manifold-side. Run all three for tri-venue divergence
- 🟢 polywatch-presets — ready-made polywatch configs
- 🟢 prediction-market-mcp — MCP server exposing all 3 venues to Claude/LLMs, with 3-venue arb discovery
- 🟢 prediction-markets-live — read-only browser dashboard
Why
Kalshi is the regulated US-side counterpart to Polymarket. The trading day moves fast — political markets in particular can pop 5-15% within a few minutes after news drops, and the only "alerts" Kalshi gives you are weak email digests. This is one Python file's worth of logic that runs anywhere, MIT, and pings you on whatever channel you're already using.
Built to use alongside polywatch for cross-venue divergence trading.
Install
pip install git+https://github.com/creampig666/kalshiwatch.git
Or clone:
git clone https://github.com/creampig666/kalshiwatch.git
cd kalshiwatch && pip install -e .
60-second start
kalshiwatch init # writes config.yaml
$EDITOR config.yaml # change the tickers to ones you care about
kalshiwatch test-alert # verify your Telegram / Discord wiring
kalshiwatch run # go
Sample config.yaml:
poll_interval_sec: 30
markets:
- ticker: KXELONMARS-99
name: Elon to Mars in lifetime
threshold_pct: 5 # alert when price moves >= 5% from last poll
direction: any # up | down | any
- ticker: KXPERSONPRESMAM-45
name: Mamdani president by 45
threshold_pct: 3
direction: up # only on upward crossings
alerts:
console: true
# telegram:
# bot_token: ${TELEGRAM_BOT_TOKEN} # env vars supported
# chat_id: ${TELEGRAM_CHAT_ID}
# discord:
# webhook: https://discord.com/api/webhooks/.../...
The ticker is the Kalshi market identifier shown on each market page (e.g. KXELONMARS-99, KXNEWPOPE-70-PPAR). You can find it in the Kalshi URL or in the page metadata.
How it works
- Every
poll_interval_secseconds, fetch each configured market fromapi.elections.kalshi.com. - Compare each market's
last_price_dollars(0.0 – 1.0, the implied probability) to the price seen last tick. - If the change ≥ threshold (and direction matches), build an
AlertEventand dispatch to every enabled channel. - Failed channels log the error and don't break the loop.
State is in-memory — restart resets the comparison baseline, no DB.
Kalshi vs Polymarket
If you trade both, you probably want both polywatch and kalshiwatch running side by side — same alert channels, same UX. Divergence between a Polymarket "Yes" price and a Kalshi "Yes" price on the same underlying event is one of the simplest live arb signals.
Run as a service
systemd (Linux):
[Unit]
Description=kalshiwatch
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/you/kalshiwatch
ExecStart=/usr/bin/kalshiwatch run -c /home/you/kalshiwatch/config.yaml
Restart=on-failure
Environment=TELEGRAM_BOT_TOKEN=xxx
Environment=TELEGRAM_CHAT_ID=yyy
[Install]
WantedBy=multi-user.target
cron mode (one-shot):
* * * * * /usr/bin/kalshiwatch run --once -c /home/you/kalshiwatch/config.yaml
Roadmap (PRs welcome)
- Bid/ask alerts once an auth mode is added (orderbook-aware)
- Cross-venue divergence alerts (Polymarket vs Kalshi on matched underlyings)
- State persistence so restarts don't reset baselines
- Per-rule cooldown to avoid noisy markets
If any of these would change your workflow, open an issue.
Tip jar
This is free and stays free. If kalshiwatch saved you a bad fill or a refresh tic, tips are welcome:
0x17Fb06dE9D5945eaFf6FBBf4c264E505D38182A4 # EVM (ETH / USDC / any EVM L2)
License
MIT. See LICENSE.
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 kalshiwatch-0.1.0.tar.gz.
File metadata
- Download URL: kalshiwatch-0.1.0.tar.gz
- Upload date:
- Size: 14.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e02d735a610d470800e21b6a2a0122a68eed1bba1be34139e0ffb69480422311
|
|
| MD5 |
46dea0ada5bf5be11795d2e2aa7abc73
|
|
| BLAKE2b-256 |
e24e5efa068a3d10ac3ef9233c7d3d9ddadc3851c7b6722eaf148f3e456bdb2c
|
File details
Details for the file kalshiwatch-0.1.0-py3-none-any.whl.
File metadata
- Download URL: kalshiwatch-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f030bafc9b72d24d0d53036bf7595d2d342f3061c2ffa77e78a666309e7210c
|
|
| MD5 |
7b7d5684cba4ced75346d0f535a0d0f3
|
|
| BLAKE2b-256 |
002adac411e24ebc4b29757ae1bbb737f83e0d4f353bc0f5137fd58d7453400e
|