Website Change Detector
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
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
- Fetch — every URL in
startUrlsis downloaded concurrently (browser User-Agent, redirects followed, 30 s timeout, 2 retries). - Extract — in
textmode the main readable content is extracted (via trafilatura, with a BeautifulSoup fallback); inhtmlmode the raw markup is normalized (scripts, styles, comments, and whitespace stripped). An optionalcssSelectornarrows monitoring to one element (e.g. a price tag). - Clean — every regex in
ignorePatternsis removed from both the old and new content, so volatile fragments like clocks and counters never trigger false positives. - Diff — the Actor computes a unified diff and a change percentage (
1 − SequenceMatcher.ratio()). A page counts aschangedonly when the change percentage is at leastminChangePercent. - 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. - 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:
| Field | Type | Description |
|---|---|---|
url | string | The monitored URL. |
status | string | baseline (first snapshot), changed, unchanged, or error. |
change_percent | number | null | Percentage of content that changed (0–100). null on fetch errors. |
diff | string | null | Unified diff of the change (truncated to 5 000 characters). Only set for changed rows. |
summary | string | null | 2–3 sentence AI summary of the change. Only set when an LLM key is provided. |
checked_at | string | ISO 8601 UTC timestamp of the check. |
error | string | null | Error 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)
- Open the Actor → Schedules → create a schedule (e.g.
@hourlyor0 9 * * *for 9:00 daily). - Save your input (URLs, ignore patterns, webhook) with the schedule.
- 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
webhookUrlto 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 wherestatus == "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:
| Noise | Pattern |
|---|---|
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.