polywatch
Get pinged the second a Polymarket market moves.
No install? Try the live dashboard first: https://creampig666.github.io/prediction-markets-live/
Tiny Python CLI that polls Polymarket's public gamma API, watches the outcomes you care about, and fires alerts to your console / Telegram / Discord the moment a price crosses a threshold you set.
No keys, no auth, no signup. Just a YAML file and a wallet for tips.
Family of tools (same author, same wallet, same UX):
- 🟢 polywatch — you're here
- 🟢 kalshiwatch — same idea, Kalshi-side
- 🟢 manifold-watch — same idea, Manifold-side. Run all three for tri-venue divergence
- 🟢 polywatch-presets — ready-made polywatch configs (politics / crypto / sports / geopolitics / tech-AI)
- 🟢 prediction-market-mcp — MCP server exposing all 3 venues to Claude/LLMs, with 3-venue arb discovery
- 🟢 prediction-markets-live — read-only browser dashboard
Writeup on the whole family + what I'd skip if I did it again: Six prediction-market tools in a day
[polywatch] Newsom 2028 D nomination :: Yes [UP] 0.420 -> 0.461 (+9.76%)
[polywatch] Netherlands 2026 WC :: Yes [DN] 0.180 -> 0.155 (-13.89%)
Why
If you trade prediction markets, you already know: the move happens in the 30 seconds you weren't looking. Manual refresh tabs don't cut it. Most "Polymarket alert bots" are SaaS lock-ins or pay-walled Discord servers. This is one Python file's worth of logic, MIT, and it runs on your laptop / cheap VPS / Raspberry Pi.
Built because I wanted it for my own poly trading and it didn't exist in a form I'd actually trust.
Install
pip install git+https://github.com/creampig666/polywatch.git
Or clone:
git clone https://github.com/creampig666/polywatch.git
cd polywatch && pip install -e .
60-second start
polywatch init # writes config.yaml
$EDITOR config.yaml # change the slugs to ones you actually care about
polywatch test-alert # verify your Telegram / Discord wiring
polywatch run # go
Sample config.yaml:
poll_interval_sec: 30
markets:
- slug: will-gavin-newsom-win-the-2028-democratic-presidential-nomination-568
name: Newsom 2028 D nomination
watch:
- outcome: "Yes"
threshold_pct: 3 # alert when price moves >= 3% from last poll
direction: any # up | down | any
- slug: will-netherlands-win-the-2026-fifa-world-cup-739
name: Netherlands 2026 WC
watch:
- outcome: "Yes"
threshold_pct: 5
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 slug is whatever's in the Polymarket URL after /event/. Multiple watch rules per market are fine.
How it works
- Every
poll_interval_secseconds, fetch each configured market fromgamma-api.polymarket.com. - Compare each rule's outcome price 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.
Run as a service
systemd (Linux):
[Unit]
Description=polywatch
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/you/polywatch
ExecStart=/usr/bin/polywatch run -c /home/you/polywatch/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/polywatch run --once -c /home/you/polywatch/config.yaml
Roadmap (PRs welcome)
- Whale-trade alerts (volume spike, not just price)
- Cross-venue divergence (Polymarket vs Kalshi vs Manifold)
- 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 polywatch saved you a bad trade or a refresh tic, tips are welcome:
0x17Fb06dE9D5945eaFf6FBBf4c264E505D38182A4 # EVM (ETH / USDC / any EVM L2)
License
MIT. See LICENSE.
Release files for polywatch 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| polywatch-0.1.0.tar.gz | 15.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| polywatch-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.7 kB
Release files / polywatch-0.1.0.tar.gz
| Download URL | polywatch-0.1.0.tar.gz |
|---|---|
| Size | 15.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a615c84cdf447b310d16101a63a9ebebe99f2abc97acb68c8a497fe1c43ca40d
|
|
BLAKE2b-256 checksum How to use checksums |
d385e8c7f551dca49c74b0be8b5e448725bb96f3b82b76a22be5a5693dcc2aaa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / polywatch-0.1.0-py3-none-any.whl
| Download URL | polywatch-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
12f866747e2f4c5e81ac182cd93f36430a67151052469d10dc30af3e0350df51
|
|
BLAKE2b-256 checksum How to use checksums |
c5430a71c68cac5ccc9126950e7d3d6aa04188ad2b2d81e1f070c035ab0f08b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|