Skip to main content

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

  1. Every poll_interval_sec seconds, fetch each configured market from gamma-api.polymarket.com.
  2. Compare each rule's outcome price to the price seen last tick.
  3. If the change ≥ threshold (and direction matches), build an AlertEvent and dispatch to every enabled channel.
  4. 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)

Source distribution for polywatch 0.1.0
File Size Uploaded
polywatch-0.1.0.tar.gz 15.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for polywatch 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page