Webpage Diff Checker
Pricing
from $0.10 / 1,000 page checks
Webpage Diff Checker
Check public webpages against saved baselines. Find text, HTML, SEO metadata, semantic data, and link changes, with clear details for each change.
Pricing
from $0.10 / 1,000 page checks
Rating
0.0
(0)
Developer
Maxime Dupré
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 hours ago
Last modified
Categories
Share
🔎 Find webpage changes without checking by hand
Webpage Diff Checker is for SEO teams, developers, and site owners who track public pages. It compares each page with its last good baseline and returns added or removed text, metadata and link changes, severity, and key page facts.
- Website change monitoring checks public pages again and shows what changed.
- Webpage diff checking compares visible text or HTML with the page's last good baseline.
- Competitor page monitoring watches public product, feature, and news pages for changes.
- SEO metadata change tracking finds changes to titles, descriptions, canonical links, hreflang, and robots rules.
- Structured data change monitoring tracks JSON-LD, microdata, RDFa, and Open Graph changes.
- Website link change tracking finds internal and external links that were added or removed.
- Pricing page change monitoring tracks price-page changes with watched words or a selected CSS section.
- Policy page change monitoring keeps separate named baselines for terms and policy pages.
📦 Webpage checks and change details
Each saved dataset row is one page that was fetched and checked. It includes:
- requested and final URL, check time, HTTP status, response time, redirect state, page size, and content fingerprint
new,unchanged, orchangedstatus- a short summary, change magnitude, severity, and categories
- added and removed text, plus watched keywords found in the changes
- SEO and semantic metadata changes with before and after values
- internal and external links added or removed
The run summary also gives totals for checked, changed, new, unchanged, and failed pages. Failed pages include error details there. A failed fetch does not replace the last good baseline.
🚀 Compare pages across runs
- Add one or more public HTTP or HTTPS webpage URLs.
- Give the monitor a stable name so it keeps its own baselines.
- Choose visible text or HTML. You can also pick a CSS section or content scope.
- Add watched keywords or rules that remove known page noise if needed.
- Choose all page rows or only new and changed pages. Failed checks stay in the run summary.
- Run the Actor. Run the same setup again to compare with the saved baseline.
The first successful check for a page creates its baseline. Later successful checks compare with it and then save the new good baseline.
🧾 Input
urls is required. Add one or more public HTTP or HTTPS webpages. The schema sets no fixed maximum for this list. Use a different monitorName for each separate set of baselines.
Input fields
| Field | Type | What it does |
|---|---|---|
urls | array of objects | Required. Lists the public webpages to check. Add at least one URL. |
urls[].url | string | Required URL for one public HTTP or HTTPS webpage. |
monitorName | string | Names the baseline set. It defaults to default; use a different name for each separate monitor. |
comparisonType | string | Chooses visibleText or html for the content comparison. It defaults to visibleText. |
contentScope | string | Chooses wholePage, mainContent, or articleContent. Main content skips common headers, menus, sidebars, and footers. Article content uses the main article or post. |
cssSelector | string | Optionally compares only the first page section that matches a CSS selector. Leave it blank to use contentScope. |
watchedKeywords | array of strings | Adds words or phrases to find in detected changes. |
excludedPageParts | array of strings | Leaves out selected headers, navigation, sidebars, footers, cookie banners, popups, or forms before comparison. |
excludedSelectors | array of strings | Leaves out page elements that match the CSS selectors. |
excludedPatterns | array of strings | Leaves out changing text that matches the supplied regular expressions. |
resultMode | string | all saves every successful page check. changedOnly saves only new or changed pages. Failed checks stay in the run summary. It defaults to all. |
This is the public default input used in a successful current-beta run:
{"urls": [{"url": "https://example.com/"}],"monitorName": "default","comparisonType": "visibleText","contentScope": "wholePage","resultMode": "all"}
The Actor checks public pages only. It does not log in to private pages or make screenshot or pixel diffs.
📤 Output
Each successful webpage check is saved as one dataset row. All rows use the same shape. status is new for the first successful check, unchanged when the comparison finds no change, or changed when it finds a difference. metadataChanges and linkChanges can be empty when no such changes are found.
Page check fields
| Field | Type | What it does |
|---|---|---|
requestedUrl | string | The webpage URL submitted in urls. |
finalUrl | string | The webpage URL after redirects. |
status | string | Shows new, unchanged, or changed. |
checkedAt | string | The date and time of the check. |
httpStatus | number | The successful HTTP response status. |
responseTimeMs | number | How long the webpage response took, in milliseconds. |
contentSizeBytes | number | The fetched webpage size in bytes. |
fingerprint | string | A stable fingerprint of the compared content. |
change | object | Summarizes content changes and their importance. |
change.summary | string | Short plain-text summary of the change. |
change.magnitude | number | Share of compared content that changed, from 0 to 1. |
change.severity | string | Practical importance: none, low, medium, or high. |
change.categories | array of strings | Change kinds: content, seo, semantic, links, or watchedKeyword. |
change.addedText | array of strings | Useful text added to the compared content. |
change.removedText | array of strings | Useful text removed from the compared content. |
change.watchedKeywords | array of strings | Watched words or phrases found in the changes. |
metadataChanges | array of objects | SEO and semantic metadata values that changed. |
metadataChanges[].kind | string | Metadata group, such as title, description, canonical, hreflang, robots, openGraph, jsonLd, microdata, or rdfa. |
metadataChanges[].name | string | Metadata field or item name. |
metadataChanges[].before | string or null | Prior value, or null when the metadata was added. |
metadataChanges[].after | string or null | Current value, or null when the metadata was removed. |
linkChanges | object | Internal and external links added to or removed from the page. |
linkChanges.addedInternal | array of strings | Internal links added since the last good baseline. |
linkChanges.removedInternal | array of strings | Internal links removed since the last good baseline. |
linkChanges.addedExternal | array of strings | External links added since the last good baseline. |
linkChanges.removedExternal | array of strings | External links removed since the last good baseline. |
Example changed row
This row is copied from a successful current-beta run:
{"requestedUrl": "https://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new","finalUrl": "https://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new","status": "changed","checkedAt": "2026-09-10T12:47:37.201Z","httpStatus": 200,"responseTimeMs": 1345,"contentSizeBytes": 12249,"fingerprint": "sha256:1f390f1dc94b3479145a6ade0598eb08662c33eec4b8ca99be69e6aeab56d24c","change": {"summary": "Found 1 added and 1 removed text parts.","magnitude": 0.024096385542168676,"severity": "medium","categories": ["content","watchedKeyword"],"addedText": ["qenp1r3thOdb"],"removedText": ["lJghszJ7hElt"],"watchedKeywords": ["lJghszJ7hElt"]},"metadataChanges": [],"linkChanges": {"addedInternal": [],"removedInternal": [],"addedExternal": [],"removedExternal": []}}
Open the dataset for page rows. Open the output key-value store record for run totals and failure details.
💳 Pricing
This Actor uses pay-per-event pricing. One Page check event is charged for each webpage that is successfully fetched and checked for changes. Failed fetches and failure details do not create this event. Check the Pricing tab for current tier prices.
🔌 Integrations
Use Apify datasets, the API, schedules, webhooks, and platform integrations to run repeat checks and send the output to your workflow.
❓ FAQ
What happens on the first run?
The first successful check creates a new baseline. There is no older page content to compare yet.
What happens if a page fails to load?
The run summary lists the failure and its details. The Actor keeps the last good baseline, so a failed page does not become the next comparison source.
How can I avoid cookie banners and changing counters?
Common changing noise is cleaned on its own. You can also leave out common page parts, CSS selectors, or text matched by regex patterns.
Can I watch only one part of a page?
Yes. Add a cssSelector, or choose main content or article content as the content scope.
Can it check private pages or compare screenshots?
No. It checks public HTTP and HTTPS pages without a login. It compares visible text or HTML, not pixels or screenshots.
Can it find old versions from the Internet Archive?
No. It compares repeat checks made with this Actor. Use Wayback Machine Search when you need saved Internet Archive history.
Should I use one monitor name for every task?
Use one stable name for each monitor. Give separate tasks different names so their baselines do not replace one another.
📝 Changelog
v0.0
- Initial release.
🆘 Support
For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡
🔗 Related Actors
- Webpage Text Extractor extracts clean text or Markdown from public pages.
- Website URL Crawler & Link Extractor builds the URL list for a site before you monitor chosen pages.
- Wayback Machine Search finds older page snapshots from the Internet Archive.
- Seobility SEO Checker runs a current on-page SEO audit alongside change tracking.
- Sitemap Sniffer finds public sitemap files and page URLs to check.
Made with ❤️ by Maxime Dupré