Proxy-Cheap
Proxy-Cheap
Integrations
changedetection.io proxy integration: a complete guide

changedetection.io Proxy Integration

Monitor any web page at scale without failed checks or false alerts. Route changedetection.io through Proxy-Cheap proxies to keep success rates stable, see prices and stock exactly as local visitors do, and watch login-gated pages from a consistent IP.
Get Proxies for changedetection.io proxy integration: a complete guide
changedetection.io proxy integration: a complete guide
What is changedetection.io?
changedetection.io is a free, open-source tool that watches web pages and alerts you when their content changes, via Slack, Discord, Telegram, email, and 100+ other services. It’s self-hosted and supports proxies natively, so you can route checks through Proxy-Cheap IPs for stable success rates and accurate geo-specific data.

Key takeaways:

  • changedetection.io is a free, Apache 2.0 self-hosted tool that watches any web page and alerts you the moment its content changes.
  • It ships two fetchers, a fast HTTP fetcher and a full Chrome browser. A proxy has to be set for whichever one your watch uses, and a mismatch here is the cause of most "403 with a proxy attached" reports.
  • You can add a proxy three ways: the Settings, CAPTCHA & Proxies box, the HTTP_PROXY and HTTPS_PROXY environment variables, or a proxies.json file for per-watch selection and rotation.
  • Match the Proxy-Cheap product to the job: rotating residential for geo-specific price and stock checks, static residential or ISP for login-gated dashboards, datacenter for high-volume public pages.

What is changedetection.io?

changedetection.io is an open-source web page change monitor. You give it a URL, it fetches that page on a schedule, and it tells you when the content changes. The project is maintained by dgtlmoon, released under the Apache 2.0 license, and self-hosted through Docker or pip. The current release at the time of writing is 0.55.7.

Under the hood it stores a snapshot of each page, re-fetches on your chosen interval, and runs a diff. When the diff is non-empty, the watch is marked as changed and your notifications fire. You can narrow what counts as a change with CSS selectors, XPath, JSONPath, or a jq filter, so a price ticker or a stock label triggers an alert while the rest of the page is ignored.

Two design choices make it a good fit for proxy integration. First, it fetches the same pages over and over from one server IP, which is exactly the traffic pattern that runs into rate limits. Second, it has native proxy support built into the settings and a per-watch proxy selector, so routing checks through a proxy network is a first-class feature rather than a workaround.

What is changedetection.io used for?

changedetection.io is used wherever a person needs to know that a specific web page changed without checking it by hand. The most common jobs:

  • Price and stock tracking. Watch a product page and get an alert on a price drop or a restock.
  • Competitor monitoring. Track pricing pages, feature pages, and changelogs across a market.
  • Job and listing alerts. Watch a careers page or a marketplace category for new entries.
  • Regulatory and policy pages. Get notified when terms, government notices, or compliance documents are updated.
  • Content and PDF monitoring. Detect edits to articles, documentation, and linked PDF files.
  • API and JSON monitoring. Poll a JSON endpoint and alert on a field change with a JSONPath filter.
  • Uptime and defacement checks. Notice when a page suddenly looks different from its baseline.

The common thread is repeated, scheduled fetching of public web pages. Once you watch more than a handful of pages, or watch pages that serve different content by country, a proxy stops being optional.

Key features of changedetection.io

The features that matter for a production monitoring setup:

  • Two fetch methods. A fast HTTP fetcher for plain pages and a Chrome browser fetcher (via Playwright) for JavaScript-rendered sites.
  • Visual selector and filters. Click an element to watch it, or target it with CSS, XPath, JSONPath, or jq.
  • Browser Steps. Script a login, a cookie dismissal, or a form submission before the snapshot is taken.
  • Native proxy support. A global proxy box, environment-variable proxies, a proxies.json list, and a per-watch proxy dropdown.
  • 100+ notification channels. Discord, Slack, Telegram, email, and webhooks through the Apprise library.
  • RSS and diff history. A built-in RSS feed of changes and a stored history of every snapshot.
  • Optional LLM summaries. Plug in OpenAI, Gemini, or a local Ollama model to summarize what changed in plain language.

Is changedetection.io free to use?

Yes. changedetection.io is free and open source under the Apache License 2.0. You can run it on your own hardware with no license fee, no API key, and no cap on the number of pages you watch. Commercial use is permitted.

The project also offers a paid hosted plan for people who would rather not self-host. The hosted version and the self-hosted version share the same feature set, including proxy support, so everything in this guide applies either way. Your only real costs when self-hosting are the machine that runs the container and, once you watch pages at scale, a proxy plan.

How to install changedetection.io

The fastest path is Docker. Create a docker-compose.yml file and start the service:

# docker-compose.yml
services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io
    container_name: changedetection
    hostname: changedetection
    volumes:
      - changedetection-data:/datastore
    ports:
      - "5000:5000"
    restart: unless-stopped
 
volumes:
  changedetection-data:
# Start it in the background, then open http://localhost:5000
docker compose up -d

If you prefer to run it without Docker, install from PyPI on Python 3.10 or newer:

pip3 install changedetection.io
changedetection.io -d ./datastore -p 5000
# Open http://localhost:5000

The -d flag sets the data directory (where snapshots and your proxies.json live) and -p sets the port. Confirm the version you actually installed before copying any configuration from a tutorial, because the proxy file format settled in the 0.39.20 series:

pip3 show changedetection.io | grep Version

Quickstart: your first website watch

Open the dashboard at http://localhost:5000. Paste a URL into the "Add a new web page to monitor" field and click Watch. changedetection.io fetches the page, stores the first snapshot, and starts checking on the default schedule.

A few things to set on the watch before you walk away:

  • Check frequency. Open the watch, set how often it re-fetches (minutes, hours, or a weekly schedule). Shorter intervals mean more requests, which is the first reason proxies come into play.
  • Fetch method. The default is "Basic fast Plaintext/HTTP". Switch to "Chrome/Javascript" for pages that render content with JavaScript.
  • What to watch. Use the Visual Selector to click the exact element (a price, a stock label, a headline) so unrelated edits do not trigger noise.

Diagram of the two changedetection.io fetch methods, the fast HTTP fetcher and the Chrome browser fetcher, each routing through a Proxy-Cheap proxy to the target page.

changedetection.io has two fetchers. The proxy you choose has to apply to whichever one the watch uses, which is the single most important thing to get right.

The fetcher choice matters for the rest of this guide. The fast HTTP fetcher uses a Python requests engine and reads the raw HTML. The Chrome fetcher launches a real browser to render JavaScript first. Each takes a proxy, but you configure them in slightly different places, and getting that wrong is the most common proxy problem people hit.

How changedetection.io reports changes

When a re-fetch produces a different snapshot, the watch turns to a "changed" state and changedetection.io surfaces it three ways:

  • The diff view. Open the watch to see added text highlighted in green and removed text in red, word by word. You can step back through the full snapshot history.
  • Notifications. changedetection.io uses the Apprise library, so one watch can alert Discord, Slack, Telegram, email, a webhook, or any of 100+ services. You write a short notification template with tokens like the page URL and the diff.
  • An RSS feed. Every change is published to a built-in RSS feed, handy for piping changes into another tool.

This is why proxies belong in the picture early. If a scheduled fetch returns a 403 response or a rate-limit page instead of the real content, changedetection.io faithfully reports that junk as a "change", and you get a false alert. A stable proxy keeps the fetched content clean, so the diffs you see are real ones.

Why you need a proxy with changedetection.io

A direct connection from one server IP is fine for watching a few pages a few times a day. It stops being fine the moment you scale up the number of watches or the check frequency, which is why a serious monitoring setup runs through a residential proxy network. For a broader view of how to pick a provider, the best proxies for web scraping guide covers the selection criteria. Three concrete reasons to put a proxy in front of changedetection.io:

  1. Reliable connectivity and stable success rates. Monitoring hits the same page on a fixed schedule, which is precisely the pattern many sites rate-limit. Routing checks through a pool of IPs keeps response success rates high across long-running watches, so a temporary 429 or 403 does not become a false "change" alert.
  2. Accurate geo-specific data. Prices, stock, search results, and ads vary by country and even city. To monitor what a visitor in a given market actually sees, the check has to run through an IP in that market. This is the whole point of monitoring travel fares, regional pricing, or localized catalogs.
  3. Compliance with site terms and rate limits. Public-web monitoring at scale should respect each site's rate limits and regional requirements. A proxy network with country and city targeting lets you stay within those boundaries while still collecting the data you need.

Proxy-Cheap offers four product lines that map cleanly onto changedetection.io workloads:

Four Proxy-Cheap product types matched to changedetection.io monitoring jobs, from account-bound dashboards to geo-specific price tracking.

Each product line fits a different shape of monitoring job. The links below match the cards above.

  • Static Residential (ISP) proxies for watches behind a login: account dashboards, session-aware pages, anything that needs the same trusted IP held for hours or days.
  • ISP proxies for long-lived monitoring sessions with flexible authentication. Static and rotating ISP options, HTTP and SOCKS5, multiple auth methods.
  • Datacenter proxies for high-volume checks of public pages: documentation, status pages, public catalogs, and JSON endpoints where raw throughput matters more than residential trust.
  • Rotating Residential proxies for geo-specific price and stock tracking at scale, with 155M+ IPs across 180+ countries and automatic IP refresh per request.

For most monitoring projects the right answer is one of these four, picked by the shape of the target page rather than the size of your budget.

How to set up a proxy in changedetection.io

Diagram of a changedetection.io watch routing a fetch through the Proxy-Cheap gateway to a target page and returning a detected change and a notification.

A scheduled changedetection.io check routes through the Proxy-Cheap gateway, fetches the target page through a residential IP, and returns a clean diff plus a notification.

There are two everyday ways to attach a proxy, plus a file-based method covered in the next section. Both use the same Proxy-Cheap credential format, so a quick note on endpoints first:

  • Rotating residential uses a single shared hub: thehub.proxy-cheap.com:8080. You choose the country in the dashboard credential generator, so there is no separate US or EU gateway. Every request through the hub gets a fresh exit IP automatically.
  • Static residential, ISP, and datacenter assign a unique IP and port to each proxy you order. You copy the exact host and port from the dashboard's Setup Credentials panel.

Method 1: the settings UI

This is the quickest start for a single proxy.

  1. Click Settings in the top menu, then open the CAPTCHA & Proxies tab.
  2. In the proxy field, paste your Proxy-Cheap proxy in the format http://username:password@host:port, shown in full below.
  3. Click Save.
  4. Open any watch, go to its Request tab, and pick the proxy you just added from the proxy dropdown.
http://<your-proxycheap-username>:<your-proxycheap-password>@thehub.proxy-cheap.com:8080

Unlike some scraping libraries, changedetection.io expects the username and password inside the proxy URL, not in separate fields. That is the format its fetchers understand. Generate the credentials in the Proxy-Cheap dashboard's Setup Credentials panel, and for a fuller walkthrough of residential setup, see the step-by-step guide to using residential proxies.

Method 2: environment variables

To route every check (and notifications) through a proxy without touching the UI, add an environment: section to the changedetection service in your compose file. This is the cleanest option for a Docker deployment:

# docker-compose.yml (add to the changedetection service)
    environment:
      - HTTP_PROXY=http://<your-proxycheap-username>:<your-proxycheap-password>@thehub.proxy-cheap.com:8080
      - HTTPS_PROXY=http://<your-proxycheap-username>:<your-proxycheap-password>@thehub.proxy-cheap.com:8080
      - NO_PROXY=localhost,127.0.0.1

Before you trust a watch to it, confirm the credentials and the gateway from a terminal. A real exit IP in the response means the proxy works end to end:

curl --max-time 6 -x "http://<your-proxycheap-username>:<your-proxycheap-password>@thehub.proxy-cheap.com:8080" https://ipinfo.io/ip

If you get back an IP, you are set. If you see 407 Proxy Authentication Required, the host and port are reachable but the username or password is wrong, so fix the credentials and try again. HTTP is the most compatible scheme here. Proxy-Cheap also supports SOCKS5 across its products: use the socks5h:// scheme and copy the host and port from your dashboard. Note that SOCKS5 support in the requests engine needs the PySocks extra, which the official Docker image already includes.

Rotating proxies with changedetection.io

You get rotation two different ways, depending on the product line.

Rotating residential rotates at the gateway. Point a watch at thehub.proxy-cheap.com:8080 or thehub.proxy-cheap.com:8080 and every check gets a new exit IP with no extra configuration. One entry covers a whole pool, which is ideal for high-frequency geo-specific monitoring.

Static proxies rotate from a list you maintain. For static residential, ISP, or datacenter IPs, add each one to a proxies.json file in your data directory. From version 0.39.20 onward changedetection.io reads this file and shows every entry in the per-watch proxy dropdown:

{
"proxy-cheap-hub": { "label": "Proxy-Cheap rotating residential", "url": "http://<user>:<pass>@thehub.proxy-cheap.com:8080", "reuse_time_minimum": 180 }
}

The label is what you see in the dropdown, url is the proxy itself, and reuse_time_minimum is the minimum number of seconds before changedetection.io calls that proxy again, which helps you pace requests and control spend. Assign a different entry to different watches to spread load across IPs and regions.

Which type to choose depends on the watch. Rotating residential is the default for high-volume, geo-sensitive monitoring where a fresh IP per check keeps success rates stable. Static residential or ISP is the right call when a watch needs the same IP to persist, such as a page behind a login. For a deeper comparison, read static vs rotating proxies: which type works better and, if you script your own rotation around the API, how to rotate proxies in Python with Requests and AIOHTTP.

Advanced: monitoring JavaScript pages through a proxy

Plenty of the pages worth watching (single-page apps, pages behind a JavaScript check such as Cloudflare's, infinite-scroll catalogs) return almost nothing to the fast HTTP fetcher. For those, switch the watch to the Chrome fetcher and pair it with a residential IP.

First, add a browser container alongside changedetection.io so it has a real Chrome to drive:

# docker-compose.yml (add the browser service)
services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io
    container_name: changedetection
    volumes:
      - changedetection-data:/datastore
    environment:
      - PLAYWRIGHT_DRIVER_URL=ws://sockpuppetbrowser:3000
    ports:
      - "5000:5000"
    restart: unless-stopped
 
  sockpuppetbrowser:
    image: dgtlmoon/sockpuppetbrowser:latest
    container_name: sockpuppetbrowser
    cap_add:
      - SYS_ADMIN
    restart: unless-stopped
 
volumes:
  changedetection-data:

Then, on the watch, set Fetch method to "Chrome/Javascript" and pick your Proxy-Cheap proxy from the same proxy dropdown. The proxy you selected now routes the browser's traffic, not just the fast fetcher's. For pages that need a login or a cookie click first, open Browser Steps and record the actions; they run inside the proxied browser session before the snapshot is taken. A residential IP is the better choice for these pages because they tend to serve different content based on how trusted the visitor looks.

Common errors and how to fix them

Most changedetection.io proxy issues fall into a handful of buckets. Each has a clear fix.

1. A watch returns 403 Access denied even though a proxy is set. This almost always means the proxy is configured for one fetcher but the watch uses the other. If the watch uses "Chrome/Javascript", make sure the browser container is running and the proxy is selected on that watch, not only in the global box. The maintainer's own fix for this is to set a non-empty proxy value under Settings, Fetching for the Chrome requests path rather than leaving it on default.

2. The proxy works in "Basic fast" but not in Chrome (or the reverse). The two fetchers read proxy settings independently. Re-select the proxy on the watch's Request tab after switching the fetch method, and confirm the PLAYWRIGHT_DRIVER_URL browser service is up.

3. 407 Proxy Authentication Required. The host and port are reachable but the credentials are wrong or missing. Recheck the username:password in the proxy URL, and for the rotating residential hub use port 8080. Test it in isolation with the curl -x command from the setup section.

4. Connection refused or timeouts on every check. The host or port is wrong, or a firewall is in the way. Verify the exact host and port against the dashboard's Setup Credentials panel, then re-run the curl test before blaming changedetection.io.

5. SOCKS5 proxy does nothing. Use the socks5h:// scheme (not socks5://) so DNS resolves through the proxy, and confirm the PySocks extra is present. The official Docker image includes it; a bare pip install may not.

6. Every check shows the same IP and you still get rate-limited. You are on a single static IP. Switch the watch to the rotating residential gateway, or add several entries to proxies.json and assign them across your watches with a sensible reuse_time_minimum.

7. Notifications stop arriving after adding a proxy. Environment-variable proxies route notification traffic too. Add internal hosts to NO_PROXY, and make sure your notification service is reachable through the proxy or excluded from it.

Is changedetection.io good? Pros and cons

For self-hosted web page monitoring, changedetection.io is the strongest open-source option available today. It is free under Apache 2.0, the proxy support is genuinely native rather than bolted on, and the maintainer ships updates at a steady pace. A few honest tradeoffs to weigh.

Pros

  • Free and open source under Apache 2.0, with no cap on the number of watches.
  • Self-hosted, so your monitoring data and proxy credentials stay on your own server.
  • Two fetchers cover both plain HTML and JavaScript-heavy pages.
  • Native proxy support: global box, environment variables, proxies.json, and per-watch selection.
  • 100+ notification integrations plus an RSS feed of every change.
  • Visual selector and Browser Steps make precise, login-gated watches easy.

Cons

  • You run the infrastructure: the container, and a second browser container for JavaScript pages.
  • The Chrome fetcher uses more memory and CPU than the fast HTTP fetcher.
  • Pages with strong anti-bot defenses still need a quality residential IP in front to return clean content.
  • Proxy configuration differs slightly between the two fetchers, which trips up first-time setups.

The practical setup for most teams: run changedetection.io yourself, start with the fast fetcher and the rotating residential gateway, and add the Chrome container plus static residential IPs only for the watches that need a login or render with JavaScript. That covers the large majority of monitoring jobs without enterprise-tier overhead.

FAQs

Yes. It runs entirely on your own server through Docker or pip, and your snapshots, notification settings, and proxy credentials never leave that machine. Keep the dashboard behind a password or a private network, since anyone who can reach port 5000 can read your watches.

As often as you set per watch, from every few seconds to a weekly schedule. Shorter intervals catch changes faster but send more requests, which is the main reason to route frequent watches through a rotating proxy so success rates stay stable.

Yes. Use the socks5h:// scheme in the proxy URL so DNS resolves through the proxy, and make sure the PySocks extra is installed (the official Docker image includes it). Proxy-Cheap supports SOCKS5 across its product lines; copy the host and port from your dashboard.

Yes. Add your proxies to the proxies.json file or the settings UI, then open each watch's Request tab and select which proxy it should use from the dropdown. This lets you point geo-specific watches at IPs in the matching country.

Usually the proxy is set for one fetcher and the watch uses the other. Confirm the proxy is selected on the watch itself, and if the watch uses the Chrome fetcher, make sure the browser container is running and has the proxy applied, not just the global HTTP box.

Rotating residential, in the country whose prices you want to track. Pricing and stock often vary by location, so a residential IP in the target market returns what a local shopper actually sees, and rotation keeps frequent checks reliable.

Pages that run a JavaScript check render with the Chrome fetcher rather than the fast HTTP fetcher. Pair the Chrome fetcher with a residential IP, since those pages serve different content based on how trusted the visitor looks. Browser Steps can handle an interstitial click if one appears.

Use Browser Steps to record the login (type username, type password, click submit), then watch the page that loads afterward. Pair it with a static residential or ISP proxy so the session keeps the same IP across checks.

Yes. It uses the Apprise notification library, which supports Discord, Slack, Telegram, email, webhooks, and more than 100 other services. You set the notification URL and a short template per watch or globally.