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.
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| polywatch-0.1.0.tar.gz | 15.2 kB | Without provenance | Details for polywatch-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| polywatch-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for polywatch-0.1.0-py3-none-any.whl |
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
|
Security for polywatch 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.