# Website Change Monitor - Page Diff & Alerts (`logiover/website-change-monitor`) Actor

Monitor any website for content changes automatically.

- **URL**: https://apify.com/logiover/website-change-monitor.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Developer tools
- **Stats:** 1 total users, 1 monthly users, 69.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Website Change Monitor — Page Diff, Content Change Detection & Alerts (No API Key)

![Website Change Monitor — Page Diff & Content Alerts](https://img.shields.io/badge/Website-Change%20Monitor-1F6FEB)

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00A67E?logo=apify\&logoColor=white) ![No API key](https://img.shields.io/badge/No%20API%20key-required-2ea44f) ![Pay per result](https://img.shields.io/badge/Pricing-Pay%20per%20result-1C7ED6) ![Monitoring](https://img.shields.io/badge/Category-Monitoring%20%26%20Alerts-8B5CF6) ![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel-F59E0B)

Monitor any number of web pages for changes automatically and get detailed **line-by-line diff reports** showing exactly what was added, removed or modified since your last check. Run it on a daily or weekly schedule and receive actionable change alerts without refreshing pages by hand. It's the **text-content counterpart to visual screenshot monitoring** — faster, cheaper and easy to parse programmatically. **No API key, no login.**

> ### 🏆 Why this Website Change Monitor?
>
> **SHA-256 baseline + line-level diff** (added/removed lines + % change) · CSS-selector targeting and ignore-lists to cut noise · `stripNumbers` to skip counter churn · machine-readable JSON diff (no computer vision needed) · schedule + Slack/email/webhook alerts · export to JSON / CSV / Excel. The lightweight **website change-detection API alternative** for price, regulation, stock and job-page monitoring.

***

### ✨ What this Actor does / Key features

- 🔔 **Automatic change detection** — fetches each URL, extracts the monitored content, hashes it (SHA-256) and compares against the stored baseline.
- 📝 **Line-by-line diff** — when content differs, reports added/removed lines, an approximate % change and a human-readable diff summary.
- 🎯 **CSS-selector targeting** — use `cssSelectors` to monitor only the sections that matter (price, stock status, job listings) and skip nav, ads and footers.
- 🧹 **Ignore noisy elements** — use `ignoreSelectors` to strip timestamps, ad containers, session IDs and rotating widgets before comparison.
- 🔢 **Strip numbers** — enable `stripNumbers` to ignore changes that only involve numbers (view counts, timers, dates).
- ♻️ **Self-updating baselines** — after each detected change the baseline is refreshed, so the next run compares against the latest version.
- ⏱️ **Schedule-friendly** — each run produces a structured dataset you can pipe to email, Slack or any webhook via Apify Integrations.
- ⚡ **Lightweight** — HTTP fetch only (~1–5 KB per URL), far cheaper than pixel-diff screenshot monitoring.

### 🚀 Quick start (3 steps)

1. **Configure (baseline)** — add your target URLs, optionally set `cssSelectors` / `ignoreSelectors`, and run once. Every URL returns "baseline saved".
2. **Schedule (diff)** — set a recurring run (daily, hourly, weekly) in Apify Console. Each subsequent run diffs against the baseline and flags `hasChanged: true` with the details.
3. **Alert & export** — connect the dataset to Make/Zapier/n8n to send Slack/email alerts on changes, or export to **JSON, CSV or Excel**.

### 📥 Input

Give the Actor a list of URLs to monitor. Selectors and toggles are optional.

#### Example — competitor pricing pages, price section only

```json
{
  "urls": [
    "https://competitor-a.com/pricing",
    "https://competitor-b.com/pricing"
  ],
  "cssSelectors": ["h1", ".price-value", ".plan-name"],
  "ignoreSelectors": [".timestamp", "#dynamic-ad"]
}
```

#### Example — job board, ignoring counters & timestamps

```json
{
  "urls": ["https://company.com/careers"],
  "cssSelectors": ["#job-listings"],
  "stripNumbers": true
}
```

#### Example — regulation page, whole-page monitoring

```json
{
  "urls": ["https://regulator.gov/updates"],
  "ignoreSelectors": [".recommendations-carousel", ".live-counter"]
}
```

| Field | Type | Description |
|-------|------|-------------|
| `urls` | array | Web-page URLs to monitor for content changes. **Required.** |
| `cssSelectors` | array | Only monitor content inside these selectors (e.g. `.price-value`, `#job-listings`). Empty = whole page. |
| `ignoreSelectors` | array | Strip these elements before comparison (e.g. `.timestamp`, `#dynamic-ad`). |
| `stripNumbers` | boolean | Ignore changes that only involve numbers (counters, dates, view counts). |
| `proxyConfiguration` | object | Optional Apify Proxy settings for the HTTP fetch. |

> **Baselines** are stored in Apify's key-value store under the Actor's namespace; they persist across runs and refresh automatically after each detected change. Reset them by deleting the KV-store records in the Storage tab.

### 📤 Output

One row per URL per check — exportable to JSON, CSV, Excel or XML. Here is a trimmed sample record (a diff run):

```json
{
  "url": "https://competitor-a.com/pricing",
  "hasChanged": true,
  "changePercent": 8,
  "addedLines": 3,
  "removedLines": 1,
  "currentContentHash": "9f2b1c4e…",
  "previousContentHash": "3a7d0e51…",
  "diffSummary": "+ Pro plan now $49/mo\n+ New: unlimited seats\n- Team plan $39/mo",
  "checkedAt": "2026-07-06T09:00:00.000Z"
}
```

<details>
<summary><b>📋 Full field reference (click to expand)</b></summary>

| Field | Description |
|-------|-------------|
| `url` | the monitored URL |
| `hasChanged` | `true` if content differs from the previous run |
| `changePercent` | approximate percentage of lines changed (0–100) |
| `addedLines` | number of new lines detected |
| `removedLines` | number of lines no longer present |
| `currentContentHash` | SHA-256 hash of current content |
| `previousContentHash` | SHA-256 hash of the previous baseline |
| `diffSummary` | human-readable summary of added/removed lines (first few each) |
| `checkedAt` | ISO 8601 timestamp of the check |

</details>

### 🆚 Screenshot monitoring vs. change monitoring

| Feature | Screenshot Capture | Change Monitor |
|---------|-------------------|----------------|
| Detection method | Visual (pixel comparison) | Text (content diff) |
| File size | ~1–5 MB per URL | ~1–5 KB per URL |
| Cost per check | Higher (rendering overhead) | Lower (HTTP fetch only) |
| Best for | Visual regression, design QA | Text content, pricing, availability |
| Machine-readable diff | ❌ | ✅ (added/removed lines, %) |
| Parse with scripts | Hard (requires CV) | Easy (JSON diff report) |

**Use both together** — screenshots for visual changes, this monitor for content changes.

### 💡 Use cases

- **Competitor price tracking** — monitor `/pricing` pages and get alerted when tiers, features or plan names change.
- **Regulation & legal compliance** — track government/regulatory pages that publish updates without RSS and get diffs of exactly what changed.
- **Job board monitoring** — watch company career pages for new postings by targeting the listings selector.
- **E-commerce stock & price alerts** — detect "Out of Stock" → "In Stock" transitions on product pages.
- **News & blog monitoring** — see when competitors publish new articles and what their headlines are.
- **Content-integrity checks** — catch unexpected edits or defacement on pages you own.

### 👥 Who uses it

Competitive-intelligence & pricing teams · compliance & legal analysts · recruiters tracking career pages · e-commerce & availability watchers · growth & marketing teams · site owners running content-integrity checks.

### 💰 Pricing

This Actor runs on a **pay-per-result** model — you pay only for the checks performed during each monitoring run, with no monthly subscription and no minimum usage. Each URL check is lightweight (HTTP fetch only), so large monitoring lists stay cheap and scale linearly. Try it on the **free tier** first. See the **Pricing** tab on this page for the current rate.

### ❓ Frequently Asked Questions

**How is "change" detected?**
The Actor computes a SHA-256 hash of the extracted text content. If the hash differs from the stored baseline, a change is detected; it then does a line-by-line comparison to produce the diff summary.

**Where are baselines stored?**
In Apify's key-value store under the Actor's namespace. They persist across runs and are automatically updated after each detected change.

**Can I reset baselines?**
Yes — delete the key-value store records via Apify Console's Storage tab, or run once with different input fields to create fresh baselines.

**Does it handle JavaScript-rendered pages?**
This Actor uses HTTP fetch (got-scraping), which handles server-rendered content. For JavaScript-heavy SPAs, use a screenshot-capture Actor or a Playwright-based monitor.

#### How do I get alerted when a competitor changes their pricing page?

Add the pricing-page URLs and target the price section with `cssSelectors`. On each scheduled run the monitor diffs the text and flags exactly what changed, so you can alert via Slack or email.

#### How do I monitor a page while ignoring ads and timestamps?

Use `ignoreSelectors` to strip ad, nav and timestamp elements before comparison, or enable `stripNumbers` to skip numeric-only changes, so you only get alerts on meaningful content edits.

#### Is this a website change-detection API alternative?

Yes. It replaces paid change-detection services with a schedulable Actor that returns a machine-readable JSON diff — added/removed lines and % change — that you can wire straight into your own alerts and workflows.

#### How do I export change reports to CSV or JSON?

Every run writes to an Apify dataset you can export to CSV, JSON, Excel or XML, or pull via the Apify API and webhooks.

### 🔗 More website & monitoring tools by logiover

Building a full site-monitoring and web-data stack? Pair the Change Monitor with the rest of the suite:

| Actor | What it does |
|---|---|
| [Bulk Website Screenshot Capture](https://apify.com/logiover/bulk-website-screenshot-capture) | Visual snapshots of many URLs |
| [Bulk URL Status Checker](https://apify.com/logiover/bulk-url-status-checker) | HTTP status & uptime checks in bulk |
| [Broken Link Checker](https://apify.com/logiover/broken-link-checker) | Find dead links across a site |
| [Website SEO Audit Crawler](https://apify.com/logiover/website-seo-audit-crawler) | On-page SEO issues at scale |
| [Bulk SSL Certificate Checker](https://apify.com/logiover/bulk-ssl-certificate-checker) | SSL expiry & chain validation |
| [Bulk HTTP Security Headers](https://apify.com/logiover/bulk-http-security-headers) | Audit security headers across URLs |
| [URL to Markdown](https://apify.com/logiover/url-to-markdown) | Clean Markdown from any page |
| [Website Text & Markdown Crawler](https://apify.com/logiover/website-text-markdown-crawler) | Full-site text extraction |
| [Sitemap to URL Crawler](https://apify.com/logiover/sitemap-to-url-crawler) | Expand sitemaps into URL lists |
| [Certificate Transparency Monitor](https://apify.com/logiover/certificate-transparency-monitor) | New-certificate & subdomain alerts |
| [Website Contact Scraper](https://apify.com/logiover/website-contact-scraper) | Emails, phones & socials from any site |

👉 Browse all **[logiover scrapers on Apify Store](https://apify.com/logiover)** — 180+ actors across real estate, jobs, crypto, social media & B2B data.

### ⏰ Scheduling & integration

Run once to establish baselines, then set a recurring schedule (daily at 9 AM, hourly, etc.) in Apify Console. Connect the dataset to **Make, Zapier or n8n** to send email/Slack alerts whenever `hasChanged: true`, or pull results via the Apify API and webhooks.

### ⭐ Support & feedback

Found a bug or need an extra field? Open an issue on the **Issues** tab — response is usually fast. If this Actor saves you time, a **★★★★★ review** on the Store page genuinely helps and is hugely appreciated. 🙏

### ⚖️ Legal

This Actor fetches only publicly accessible page content and is intended for legitimate monitoring, competitive-intelligence and compliance use. You are responsible for complying with the target sites' terms and any applicable laws.

***

**Keywords:** website change monitor, page change detection, website diff tool, content change alert, web page monitoring, competitor price tracker, regulation change monitor, automated website monitoring, page diff api, url change detection, website change alert api, recurring website checker.

***

### 📝 Changelog

#### 2026-08-01

- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.

#### 2026-07-06

- ✨ README overhaul: shields badge row, green highlight callout, trimmed diff output sample, collapsible full field reference, ready-to-run example scenarios, website/monitoring suite cross-links and clearer quick-start.

#### 2026-07-01

- Maintenance pass: re-verified end-to-end on live data and confirmed successful runs within the 5-minute quality window on the default input.
- Sharpened Store metadata (SEO title & description) and expanded the FAQ with high-intent, long-tail questions for easier discovery in Google and Apify Store search.
- Added ready-to-run example tasks that cover common real-world use cases.

# Actor input Schema

## `startUrls` (type: `array`):

List of URLs to monitor for content changes. On first run a baseline snapshot is saved. Subsequent runs compare against previous snapshots. Leave empty to monitor a sensible default page.

## `cssSelectors` (type: `array`):

CSS selectors to target specific page sections for monitoring. Leave empty to monitor the full page text content.

## `stripNumbers` (type: `boolean`):

Ignore numeric-only changes. Useful for pages with dynamic counters, IDs, or timestamps that change every load but are not meaningful changes.

## `ignoreSelectors` (type: `array`):

CSS selectors for elements to remove before comparison. Useful for stripping ads, nav bars, timestamps, and recommendation widgets.

## `maxResults` (type: `integer`):

Maximum number of URLs to check in this run. Bounds an empty-input default run so it stays fast and cheap. Raise it to monitor large URL lists.

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

Proxy settings. Use residential proxies if target sites block datacenter IPs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.com/"
    }
  ],
  "cssSelectors": [],
  "stripNumbers": false,
  "ignoreSelectors": [],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "startUrls": [
        {
            "url": "https://example.com/"
        }
    ],
    "cssSelectors": [],
    "ignoreSelectors": [],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "startUrls": [{ "url": "https://example.com/" }],
    "cssSelectors": [],
    "ignoreSelectors": [],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "startUrls": [
    {
      "url": "https://example.com/"
    }
  ],
  "cssSelectors": [],
  "ignoreSelectors": [],
  "maxResults": 10
}' |
apify call logiover/website-change-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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