Semantic Change Detector avatar

Semantic Change Detector

Pricing

from $5.00 / 1,000 url checkeds

Go to Apify Store
Semantic Change Detector

Semantic Change Detector

Monitor web pages for meaningful content changes, ignoring noisy timestamps and counters. Optional webhook alerts on change. $0.005/URL + $0.02 start.

Pricing

from $5.00 / 1,000 url checkeds

Rating

0.0

(0)

Developer

ando

ando

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Monitor any set of web pages for meaningful content changes — not just noisy re-renders. This Actor extracts readable text (optionally scoped to a CSS selector), strips heuristic "noise" like timestamps, relative dates, clock times, and engagement counters, and compares the result against the last stored snapshot. When a page changes, it reports a human-readable summary, a diff excerpt, and can fire a webhook.

Features

  • Two sensitivity modesmeaningful (ignores timestamps/counters) or any (raw text diff)
  • CSS selector scoping — check only the part of the page you care about (e.g. a pricing table or article body)
  • Persistent snapshots — stores the last-seen state per URL in a named key-value store (semantic-change-snapshots), so subsequent runs detect real drift over time
  • Diff excerpts — see exactly which lines were added/removed on change
  • Webhook alerts — optional fire-and-forget JSON POST when a change is detected
  • Resilient per-URL errors — a failed fetch on one URL never stops the batch

Input

FieldTypeRequiredDefaultDescription
urlsarrayYesWeb pages to check
selectorstringNoCSS selector to scope extraction (defaults to <body>)
sensitivity"any" | "meaningful"No"meaningful"Change detection strictness
webhookUrlstringNoURL to POST a JSON payload to when a change is detected

Input Example

{
"urls": ["https://example.com/pricing"],
"selector": ".pricing-table",
"sensitivity": "meaningful",
"webhookUrl": "https://your-app.com/webhooks/change-alert"
}

Output

{
"url": "https://example.com/pricing",
"changed": true,
"change_summary": "Content changed: 2 line(s) added, 1 line(s) removed.",
"diff_excerpt": "- Starter plan: $9/mo\n+ Starter plan: $12/mo\n+ New Enterprise tier available",
"checked_at": "2026-07-23T16:00:00.000Z"
}
FieldDescription
urlThe input URL, as provided
changedtrue if the content differs from the last stored snapshot
change_summaryHuman-readable summary of the change (or lack thereof)
diff_excerptUp to 8 removed + 8 added lines (-/+ prefixed), truncated to ~2000 characters. null if unchanged
checked_atISO timestamp of this check
errorPresent only if the fetch/extraction failed for this URL

On the first check for a URL there is no baseline yet, so changed is false and the snapshot is simply stored for future comparisons.

How "meaningful" filtering works

Before hashing/diffing, each extracted line has the following heuristics applied to strip volatile noise:

  • ISO 8601 timestamps, numeric dates, month-name dates
  • Clock times (10:30, 10:30:00 AM)
  • Relative timestamps (5 minutes ago, yesterday, just now)
  • Engagement counters (1,234 views, 12 comments, 3.4k likes)

These are regex-based heuristics, not a guarantee: some volatile content may occasionally slip through, and rarely meaningful text containing dates/numbers may be stripped along with them. Use sensitivity: "any" if you want a literal raw-text diff instead.

Pricing

EventCost
Actor start$0.02
URL Checked$0.005

Typical run cost: 100 URLs ≈ $0.02 + 100 × $0.005 = $0.52.

Limitations

  • Static HTML only — this Actor fetches raw HTML via fetch + Cheerio; it does not execute JavaScript. Pages that render their content client-side (SPAs) may show no extractable text. Use a URL that serves server-rendered HTML, or point at an API/RSS endpoint instead.
  • Snapshots are capped at 4,000 lines per URL to keep key-value store items small; extremely long pages may be truncated.
  • Webhook delivery is fire-and-forget with a 10s timeout and no retries — failures are logged but never fail the run.
  • The named key-value store (semantic-change-snapshots) persists across runs of the same Actor on the same account, so re-running with the same URLs will correctly detect drift since the last run.

Use Cases

  • Track competitor pricing pages for changes
  • Monitor legal/ToS pages for updates
  • Watch documentation pages for silent edits
  • Alert on job posting or status page changes