Monitor Rightmove for new properties and price reductions. Get Telegram notifications when something changes.
- How it works
- Setup
- Reliability
- What's public vs private
- Optional: limit to recent listings
- Local development
- Project structure
- Runs every hour via GitHub Actions cron (but see reliability note below)
- Scrapes your Rightmove search URL for all matching properties
- Compares against previous state (stored in Supabase — private)
- Sends a Telegram notification for:
- New properties appearing on the market
- Price reductions on existing listings
Click the Fork button at the top of this page.
- Open Telegram and search for @BotFather
- Send
/newbotand follow the prompts - Save the token it gives you
- Start a chat with your new bot (send any message)
- Visit
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates - Find your chat ID in the response (
"id":field)
- Go to rightmove.co.uk and search for properties
- Apply your filters (location, radius, bedrooms, price range, property type)
- Copy the full URL from your browser
This URL contains your search criteria (postcode, prices, etc.) and must be kept private.
- Create a free account at supabase.com
- Create a new project
- Go to the SQL Editor and run the migration in
supabase/migrations/001_create_property_state.sql - Go to Project Settings → API and copy your Project URL and
service_rolekey
In your forked repo, go to Settings → Secrets and variables → Actions and add:
| Secret | Value |
|---|---|
SEARCH_URL |
Your full Rightmove search URL |
TELEGRAM_TOKEN |
Your Telegram bot token |
TELEGRAM_CHAT_ID |
Your Telegram chat ID |
SUPABASE_URL |
Your Supabase project URL (e.g. https://abc123.supabase.co) |
SUPABASE_SERVICE_KEY |
Your Supabase service_role key |
Go to Actions in your repo and enable the workflow. It runs every hour on the hour. You can also trigger it manually from the Actions tab with the Run workflow button.
GitHub Actions scheduled workflows are not guaranteed to run on time — runs can be delayed, skipped during peak load, or auto-disabled after 60 days of repo inactivity.
As a backup, the workflow also listens for repository_dispatch and workflow_dispatch events, so you can trigger it from an external cron service:
- Create a fine-grained PAT with
Actions: Writepermission for this repo - Set up a free account on cron-job.org
- Create a job with:
- URL:
https://api.github.com/repos/sdysch/rightmove_scraper/dispatches - Method:
POST - Headers:
Authorization: Bearer <your-pat>andContent-Type: application/json - Body:
{"event_type": "trigger-scrape"} - Schedule: every 60 minutes
- URL:
This runs alongside the built-in GitHub cron — if GitHub misses a run, the external trigger catches it on the next cycle. No duplicate runs because the scraper is idempotent.
Public (in the repo):
- The scraper code
- The workflow configuration
Private (never in the repo):
- Your Rightmove search URL (GitHub Secret)
- Your Telegram credentials (GitHub Secrets)
- Your Supabase credentials (GitHub Secrets)
- The property state database (Supabase, accessible only via service_role key)
Add &added=24 to the end of your SEARCH_URL to only fetch listings added or updated in the last 24 hours. This reduces requests but means you'll miss price drops on older listings that haven't been re-bumped. Remove the _includeSSTC=on parameter if you don't want to include Sold Subject to Contract.
# 1. Install dependencies
uv sync
# 2. Copy the example env and fill in your values
cp .env.example .env
# Then edit .env with your Rightmove URL, Telegram creds, and Supabase creds
# 3. Run the tracker
uv run python rightmove_tracker.pyOn the first run the script captures a baseline (no notifications sent). Subsequent runs compare against Supabase and send Telegram notifications for new properties and price drops.
.
├── .env.example # Template for local config (copy to .env)
├── .github/workflows/ # GitHub Actions hourly cron
├── pyproject.toml # Python deps managed by uv
├── rightmove_tracker.py # Main scraper + notifier
├── supabase/migrations/ # Database schema
└── tests/ # Pytest suite (32 tests)