Website Change Detector avatar

Website Change Detector

Pricing

Pay per event

Go to Apify Store
Website Change Detector

Website Change Detector

Monitor websites for content changes on a schedule. Diffs main content between runs, ignores noise via regex patterns, optionally summarizes changes with an LLM, and alerts via webhook (n8n, Make, Slack).

Pricing

Pay per event

Rating

0.0

(0)

Developer

kyle herman

kyle herman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

4 days ago

Last modified

Share

Website Change Detector — Website Change Monitoring API

Monitor website changes on a schedule and get alerted the moment a page's content actually changes. This Actor is a website change detection API you can call from Apify Schedules, n8n, Make, Zapier, or plain cron: it fetches your URLs, extracts the main content, diffs it against the snapshot from the previous run, filters out noise (timestamps, view counters), optionally writes an AI summary of each change, and POSTs changed pages to your webhook.

No API keys required for the core functionality — bring your own OpenAI-compatible key only if you want AI summaries.

How it works

  1. Fetch — every URL in startUrls is downloaded concurrently (browser User-Agent, redirects followed, 30 s timeout, 2 retries).
  2. Extract — in text mode the main readable content is extracted (via trafilatura, with a BeautifulSoup fallback); in html mode the raw markup is normalized (scripts, styles, comments, and whitespace stripped). An optional cssSelector narrows monitoring to one element (e.g. a price tag).
  3. Clean — every regex in ignorePatterns is removed from both the old and new content, so volatile fragments like clocks and counters never trigger false positives.
  4. Diff — the Actor computes a unified diff and a change percentage (1 − SequenceMatcher.ratio()). A page counts as changed only when the change percentage is at least minChangePercent.
  5. Remember — the latest snapshot of each URL is stored in a named key-value store (website-change-detector-state), so state survives between scheduled runs.
  6. Alert — changed rows are optionally summarized by an LLM and POSTed as a JSON array to your webhookUrl.

The first run of a URL stores a baseline and is not reported as a change (set notifyOnFirstRun: true to change that).

Output schema

One dataset row per monitored URL per run — a full audit trail, not just the changes:

FieldTypeDescription
urlstringThe monitored URL.
statusstringbaseline (first snapshot), changed, unchanged, or error.
change_percentnumber | nullPercentage of content that changed (0–100). null on fetch errors.
diffstring | nullUnified diff of the change (truncated to 5 000 characters). Only set for changed rows.
summarystring | null2–3 sentence AI summary of the change. Only set when an LLM key is provided.
checked_atstringISO 8601 UTC timestamp of the check.
errorstring | nullError message when status is error (the run still succeeds).

Example changed row:

{
"url": "https://example.com/pricing",
"status": "changed",
"change_percent": 4.2,
"diff": "--- previous\n+++ current\n@@ -3,1 +3,1 @@\n-Pro plan: $29/mo\n+Pro plan: $39/mo",
"summary": "The Pro plan price increased from $29 to $39 per month.",
"checked_at": "2026-07-21T09:00:12.345678+00:00",
"error": null
}

Scheduling guide — monitor website changes automatically

Apify Schedules (simplest)

  1. Open the Actor → Schedules → create a schedule (e.g. @hourly or 0 9 * * * for 9:00 daily).
  2. Save your input (URLs, ignore patterns, webhook) with the schedule.
  3. Each scheduled run compares against the previous run's snapshots automatically — state lives in the named key-value store website-change-detector-state.

Website change monitor for n8n

Two integration options:

  • Push (recommended): set webhookUrl to an n8n Webhook node URL. Only changed pages are POSTed as a JSON array, so your workflow triggers exactly when something changes. Combine with an Apify Schedule.
  • Pull: use the Apify node (or an HTTP Request node against https://api.apify.com/v2/acts/<actor>/run-sync-get-dataset-items) on an n8n Schedule Trigger, then filter rows where status == "changed".

Make (Integromat)

Create a Custom webhook module, paste its URL into webhookUrl, and add a schedule for the Actor in Apify Console. Each changed page arrives as an item in the webhook payload array.

Slack / Discord

Point webhookUrl at a small n8n/Make flow that formats the summary + url fields into a chat message, or POST directly to a service that accepts arbitrary JSON.

Ignore-patterns cookbook

ignorePatterns are Python regexes stripped from both sides before diffing. Common recipes:

NoisePattern
Clock times (14:03:59)\d{2}:\d{2}(:\d{2})?
ISO dates (2026-07-21)\d{4}-\d{2}-\d{2}
Human dates (July 21, 2026)`(January
View / like counters`[\d,.]+\s*(views?
"x minutes ago"`\d+\s*(seconds?
Session / cache-buster IDs`[?&](sid
Prices you don't care about\$[\d,.]+
Copyright year©\s*\d{4}

Tip: also raise minChangePercent (e.g. to 2) to ignore tiny cosmetic edits site-wide.

AI change summaries (optional LLM setup)

Provide llmApiKey and the Actor writes a 2–3 sentence summary of every detected change using an OpenAI-compatible chat-completions API:

{
"llmApiKey": "sk-...",
"llmModel": "gpt-4o-mini",
"llmApiBase": "https://api.openai.com/v1"
}

Works with any OpenAI-compatible provider — OpenAI, Groq, Together, OpenRouter, or a self-hosted server — just change llmApiBase and llmModel. If the key is absent the Actor silently skips summaries; if an LLM call fails, the change is still reported (with summary: null). Your key is only ever sent to the API base you configure and is stored as a secret input field.

FAQ

Does the default run need any API keys? No. Change detection, diffing, and webhooks work with zero external keys. Keys are only needed for optional AI summaries.

How is this different from a simple HTTP-hash checker? Hash checkers fire on every rotating ad, timestamp, or CSRF token. This Actor extracts main content, lets you strip volatile fragments with regexes, and applies a minimum-change threshold — so alerts mean something actually changed.

Where is the previous snapshot stored? In a named key-value store website-change-detector-state (key = SHA-256 of the URL). Delete a key (or the store) to reset the baseline for a URL.

Can I monitor JavaScript-rendered pages? The Actor fetches raw HTML over HTTP. Pages that render all content client-side may need a pre-rendering proxy; most news sites, docs, pricing pages, blogs, and government sites work out of the box.

What happens when a site is down? The row gets status: "error" with the error message, other URLs are unaffected, and the run still finishes successfully — no broken schedules, no false "changed" alerts.

How am I charged? Pay-per-event: a small fee per URL checked and a fee per change detected. Unreachable URLs are not charged.

Can I track only part of a page? Yes — set cssSelector (e.g. #pricing-table, article.main, .stock-status) and only that element's content is compared.