# Website Change Monitor with Page & Price Change Alerts (`fayoussef/website-change-monitor`) Actor

Monitor any web page for changes: competitor pricing, products, terms of service, job boards. Get a clean diff of what was added and removed, severity scoring, keyword watching, and instant alerts to Slack, Discord, Telegram or any webhook. Schedule it and never refresh a page manually again.

- **URL**: https://apify.com/fayoussef/website-change-monitor.md
- **Developed by:** [youssef farhan](https://apify.com/fayoussef) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Website Change Monitor do?

**Website Change Monitor** watches any web page and tells you **exactly what changed**: competitor **pricing pages**, product listings, **terms of service**, job boards, documentation, news pages. The first run saves a baseline snapshot; every following run produces a clean **line-by-line diff** of what was added and removed, a **severity score**, and instant **alerts to Slack, Discord, Telegram or any webhook** (Make, Zapier, n8n).

Pair it with Apify **scheduling** to check pages hourly or daily, use the **API** to pipe changes into your own tools, and rely on platform monitoring so you never refresh a page manually again.

### Why monitor website changes?

- **Competitor price tracking**: know the moment a competitor changes plans, prices or feature lists, and react the same day.
- **Terms of service & compliance**: legal and policy pages change silently; get a diff instead of re-reading the whole page.
- **Product & inventory watching**: track "sold out", "back in stock", new SKUs or spec changes with keyword flags.
- **SEO & content monitoring**: see when competitors update landing pages, titles or messaging.
- **Cheaper than SaaS monitors**: pay only per page checked, instead of $10–50/month subscriptions for tools like Visualping or Distill.

### How to use Website Change Monitor

1. Click **Try for free** and open the Actor in Apify Console.
2. Paste one or more **URLs to monitor**.
3. Optionally add **watch keywords** (e.g. `price`, `discount`) and a **notification channel** (Slack/Discord/Telegram webhook).
4. Click **Start**. The first run saves baselines (`NEW_BASELINE`).
5. Create a **Schedule** (e.g. every hour) for the Actor with the same input.
6. From then on, every change appears in the dataset with a full diff, and in your Slack/Discord/Telegram if configured.

### Input

Only the URL list is required. See the Input tab for all options.

```json
{
    "urls": ["https://competitor.com/pricing"],
    "watchKeywords": ["price", "plan"],
    "slackWebhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
```

Advanced options: **CSS selector** (watch only part of a page), comparison mode (visible text vs raw HTML), **ignore patterns** (regex for timestamps/counters), minimum change %, independent **monitor names** so the same URLs can run on multiple schedules, and **proxy configuration** (Apify datacenter/residential proxy or your own) for sites that block direct traffic.

### Output

One dataset row per URL per run. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. A JSON run summary is stored in the key-value store for easy integration.

```json
{
    "url": "https://competitor.com/pricing",
    "status": "CHANGED",
    "severity": "MAJOR",
    "changePercent": 4.8,
    "addedLines": 2,
    "removedLines": 2,
    "keywordsMatched": ["price"],
    "diff": "--- previous\n+++ current\n-Pro plan $29/mo\n+Pro plan $39/mo",
    "checkedAt": "2026-07-23T09:00:08Z"
}
```

### Data fields

| Field | Description |
|-------|-------------|
| `url` | Monitored page |
| `status` | `CHANGED`, `UNCHANGED`, `NEW_BASELINE`, or `ERROR` |
| `severity` | `MAJOR` (watched keyword hit or ≥10% change), `MODERATE`, `MINOR` |
| `changePercent` | Approximate % of content changed |
| `addedLines` / `removedLines` | Lines added / removed since last check |
| `keywordsMatched` | Watched keywords found in the change |
| `diff` | Unified diff of the change |
| `checkedAt` / `previousCheckedAt` | Timestamps of this and the previous check |

### How much does it cost to monitor a website?

You pay a small fee **per page checked**. Monitoring 10 pages hourly for a month costs a few dollars, far less than SaaS page monitors. **Free plan users can monitor up to 5 URLs per run.** Subscribe to an [Apify plan](https://apify.com/pricing?fpr=youssef) to unlock up to 500 URLs per run, scheduling and full API access.

### Tips and advanced options

- **Baselines persist across runs** in a named key-value store, so schedules just work. Use **Reset baseline** to start over.
- Use a **CSS selector** like `.pricing-table` to ignore everything else on the page and eliminate false alarms.
- Add **ignore patterns** (regex) for dates, view counters or session tokens that change on every load.
- Set **Minimum change %** to skip cosmetic edits on noisy pages.
- The **generic webhook** posts the full JSON item, so you can plug it straight into Make, Zapier or n8n scenarios.
- If a site blocks or rate-limits checks, enable **Apify Proxy** in the input (residential works best on strict sites).

### FAQ

#### How do I get notified when a website changes?

Add a Slack, Discord or Telegram webhook (or any HTTPS endpoint) in the input, schedule the Actor, and alerts arrive automatically whenever a monitored page changes.

#### Can I monitor pages behind JavaScript?

The Actor fetches server-rendered HTML, which covers most pricing, legal and content pages. Heavily client-rendered apps may need a browser-based setup. Reach out for a custom solution.

#### Can I track price changes on any store?

Yes. Point it at any product or pricing URL and add keywords like `price` or `$`. For structured multi-retailer price comparison, see the dedicated price-tracking Actors on my profile.

#### Can AI agents use this Actor?

Yes. Call it via the **Apify MCP server** or the Apify API; the dataset and the `SUMMARY` record are structured JSON designed for agent consumption.

#### Is monitoring public web pages legal?

Reading publicly accessible pages is generally lawful; you are responsible for complying with the target site's terms and applicable law. The Actor stores only page text needed for comparison.

### Support and custom solutions

Found a bug or need a feature? Open an issue in the **Issues** tab.

💼 Need a custom scraper or automation? Reach out at **youssefarhan24@gmail.com**
🌐 Got a site in mind? [Suggest it here](https://automationbyexperts.com/apify)
⚡ Unlock full limits with an [Apify plan](https://apify.com/pricing?fpr=youssef)

# Actor input Schema

## `urls` (type: `array`):

The web pages to watch for changes — competitor pricing pages, product pages, terms of service, job boards, anything. The first run saves a baseline; every following run reports exactly what changed.

⚡ Unlock full pages and higher limits by subscribing to an [Apify plan](https://apify.com/pricing?fpr=youssef).
💼 Need a custom solution? Reach out at youssefarhan24@gmail.com
🌐 Got a site in mind? [Suggest it here](https://automationbyexperts.com/apify)

## `cssSelector` (type: `string`):

Watch only part of the page, e.g. `.pricing-table` or `#content`. Leave empty to monitor the whole page text. Ignores menus/scripts automatically.

## `watchKeywords` (type: `array`):

Changes containing any of these words (e.g. `price`, `discount`, `sold out`) are always flagged as MAJOR severity.

## `notifyOnFirstRun` (type: `boolean`):

Send a notification even on the first run, when the baseline snapshot is created.

## `slackWebhookUrl` (type: `string`):

Incoming-webhook URL of your Slack channel. Change alerts are posted there.

## `discordWebhookUrl` (type: `string`):

Webhook URL of your Discord channel.

## `telegramBotToken` (type: `string`):

Your own Telegram bot token (from @BotFather). Used together with the chat ID below.

## `telegramChatId` (type: `string`):

The chat that receives Telegram alerts.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint — receives the full change item as JSON POST (works with Make, Zapier, n8n).

## `monitorMode` (type: `string`):

`text` compares the visible text (recommended — ignores markup noise); `html` compares the raw HTML.

## `minChangePercent` (type: `integer`):

Ignore changes smaller than this percentage of the page (0 = report every change). Useful for pages with rotating minor content.

## `ignorePatterns` (type: `array`):

Regular expressions removed from the content before comparing — great for timestamps, view counters or session IDs. Example: `\d{2}:\d{2}:\d{2}`

## `monitorName` (type: `string`):

Baselines are stored under this name. Use different names to run independent monitors of the same URLs (e.g. one hourly, one daily).

## `resetBaseline` (type: `boolean`):

Discard saved baselines and start fresh — every URL becomes NEW\_BASELINE on this run.

## `concurrency` (type: `integer`):

How many pages to check in parallel.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy (datacenter or residential) or your own proxies for sites that block direct traffic. Leave disabled for a direct connection.

## Actor input object example

```json
{
  "urls": [
    "https://books.toscrape.com"
  ],
  "notifyOnFirstRun": false,
  "monitorMode": "text",
  "minChangePercent": 0,
  "monitorName": "default",
  "resetBaseline": false,
  "concurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `changes` (type: `string`):

One row per monitored URL: status, change percentage, severity, and the diff of added/removed lines.

## `summary` (type: `string`):

Aggregate JSON summary of the run: how many pages changed, were new, unchanged or failed.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://books.toscrape.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fayoussef/website-change-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://books.toscrape.com"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("fayoussef/website-change-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://books.toscrape.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call fayoussef/website-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fayoussef/website-change-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BWtoqmVMQrZA1l1d8/builds/m3uikLiGySkGBhZod/openapi.json
