Webpage Diff Checker avatar

Webpage Diff Checker

Pricing

from $0.10 / 1,000 page checks

Go to Apify Store
Webpage Diff Checker

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é

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 hours ago

Last modified

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.

📦 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, or changed status
  • 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

  1. Add one or more public HTTP or HTTPS webpage URLs.
  2. Give the monitor a stable name so it keeps its own baselines.
  3. Choose visible text or HTML. You can also pick a CSS section or content scope.
  4. Add watched keywords or rules that remove known page noise if needed.
  5. Choose all page rows or only new and changed pages. Failed checks stay in the run summary.
  6. 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

FieldTypeWhat it does
urlsarray of objectsRequired. Lists the public webpages to check. Add at least one URL.
urls[].urlstringRequired URL for one public HTTP or HTTPS webpage.
monitorNamestringNames the baseline set. It defaults to default; use a different name for each separate monitor.
comparisonTypestringChooses visibleText or html for the content comparison. It defaults to visibleText.
contentScopestringChooses wholePage, mainContent, or articleContent. Main content skips common headers, menus, sidebars, and footers. Article content uses the main article or post.
cssSelectorstringOptionally compares only the first page section that matches a CSS selector. Leave it blank to use contentScope.
watchedKeywordsarray of stringsAdds words or phrases to find in detected changes.
excludedPagePartsarray of stringsLeaves out selected headers, navigation, sidebars, footers, cookie banners, popups, or forms before comparison.
excludedSelectorsarray of stringsLeaves out page elements that match the CSS selectors.
excludedPatternsarray of stringsLeaves out changing text that matches the supplied regular expressions.
resultModestringall 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

FieldTypeWhat it does
requestedUrlstringThe webpage URL submitted in urls.
finalUrlstringThe webpage URL after redirects.
statusstringShows new, unchanged, or changed.
checkedAtstringThe date and time of the check.
httpStatusnumberThe successful HTTP response status.
responseTimeMsnumberHow long the webpage response took, in milliseconds.
contentSizeBytesnumberThe fetched webpage size in bytes.
fingerprintstringA stable fingerprint of the compared content.
changeobjectSummarizes content changes and their importance.
change.summarystringShort plain-text summary of the change.
change.magnitudenumberShare of compared content that changed, from 0 to 1.
change.severitystringPractical importance: none, low, medium, or high.
change.categoriesarray of stringsChange kinds: content, seo, semantic, links, or watchedKeyword.
change.addedTextarray of stringsUseful text added to the compared content.
change.removedTextarray of stringsUseful text removed from the compared content.
change.watchedKeywordsarray of stringsWatched words or phrases found in the changes.
metadataChangesarray of objectsSEO and semantic metadata values that changed.
metadataChanges[].kindstringMetadata group, such as title, description, canonical, hreflang, robots, openGraph, jsonLd, microdata, or rdfa.
metadataChanges[].namestringMetadata field or item name.
metadataChanges[].beforestring or nullPrior value, or null when the metadata was added.
metadataChanges[].afterstring or nullCurrent value, or null when the metadata was removed.
linkChangesobjectInternal and external links added to or removed from the page.
linkChanges.addedInternalarray of stringsInternal links added since the last good baseline.
linkChanges.removedInternalarray of stringsInternal links removed since the last good baseline.
linkChanges.addedExternalarray of stringsExternal links added since the last good baseline.
linkChanges.removedExternalarray of stringsExternal 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.

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 🫡

Made with ❤️ by Maxime Dupré