Website Change Intelligence Monitor avatar

Website Change Intelligence Monitor

Pricing

from $20.00 / 1,000 page-checkeds

Go to Apify Store
Website Change Intelligence Monitor

Website Change Intelligence Monitor

Monitor public web pages and detect meaningful text, title, metadata, and link changes between runs.

Pricing

from $20.00 / 1,000 page-checkeds

Rating

0.0

(0)

Developer

sakthi kumar

sakthi kumar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Share

Monitor websites and detect meaningful content, text and price changes between runs.

Unofficial tool. Monitors publicly accessible web pages only. You are responsible for ensuring your use complies with the target sites' terms and applicable law.


What it does

On every run the Actor fetches each page you give it, compares it against the snapshot it saved last time, and returns only what changed:

  • CONTENT_CHANGED — the page title, meta description, visible text, or link set changed
  • ADDED_TEXT — new sentences/segments that appeared
  • REMOVED_TEXT — sentences/segments that disappeared
  • PRICE_CHANGED — a currency-and-number price token on the page changed (only reported when both the old and new page contain detectable prices — no guessing)
  • UNCHANGED — the page is byte-for-byte equivalent after noise normalisation

The first run for a page records a baseline and reports BASELINE, not a change.

All detection is deterministic code — HTTP fetch, HTML parse, hashing, difflib, set comparison, regex price tokens. No AI, no LLM, no paid data APIs.

Who it is for

  • Competitor monitoring — messaging, positioning, feature lists
  • Pricing monitoring — plan prices, discounts on public pricing pages
  • Product-page monitoring — spec, availability, and copy changes
  • Policy / Terms monitoring — track edits to ToS, privacy, SLA pages
  • Sales & market intelligence — watch prospect and market pages for triggers
  • Website QA — catch unintended content or link changes after a deploy

How monitoring works

  1. Provide a list of page URLs and a stable Monitor ID.
  2. The Actor fetches each page (public http/https only), extracts a normalised snapshot, and diffs it against the snapshot stored under your account + monitorId + normalized URL.
  3. It writes one flat row per change and saves the new snapshot.

First run vs. next run

Output
First run for a URLBASELINE row + a SUMMARY row. Baseline stored.
Every later run (same Monitor ID)One row per CONTENT_CHANGED / ADDED_TEXT / REMOVED_TEXT / PRICE_CHANGED, plus a SUMMARY row. Unchanged pages produce only a SUMMARY (or nothing extra).

Run it on a schedule with the same Monitor ID and you get an incremental change log — a change is reported once, then folded into the baseline.

Output

One flat dataset. CSV / JSON / Excel friendly. No large nested blobs.

FieldDescription
urlURL as you supplied it
normalized_urlCanonical form used as the state key (lowercased host, tracking params + fragment removed)
monitor_idYour monitor ID
change_typeBASELINE, UNCHANGED, CONTENT_CHANGED, ADDED_TEXT, REMOVED_TEXT, PRICE_CHANGED, SUMMARY, FAILED
changed_fieldtitle, meta_description, text, links, price, final_url — or the failure reason for FAILED
previous_value / current_valueConcise before/after (or a small JSON blob for SUMMARY)
added_text / removed_textThe changed sentences (when includeTextDiff is on)
previous_hash / current_hashSHA-256 of the normalised page text
http_statusHTTP status of the fetch
detected_atWhen this run observed the change
first_seen_at / last_seen_atWhen the page was first / most recently seen

Output example

{ "url": "https://demo.example/pricing", "normalized_url": "https://demo.example/pricing",
"monitor_id": "competitors", "change_type": "PRICE_CHANGED", "changed_field": "price",
"previous_value": "$19, $49", "current_value": "$19, $59",
"http_status": 200, "detected_at": "2026-08-02T00:00:00+00:00",
"first_seen_at": "2026-08-01T00:00:00+00:00", "last_seen_at": "2026-08-02T00:00:00+00:00" }
{ "url": "https://demo.example/pricing", "change_type": "ADDED_TEXT", "changed_field": "text",
"added_text": "Priority support and SSO are available on the Enterprise plan.",
"current_value": "1 new segment(s)", "detected_at": "2026-08-02T00:00:00+00:00" }

Input

FieldRequiredDescription
urlsUp to 50 public http/https page URLs.
monitorIdStable name for this watch list. Reuse it on every scheduled run. Default "default".
outputModeCHANGES_ONLY (default) or ALL_CHECKS (also emit a row for unchanged pages).
includeTextDiffEmit ADDED_TEXT / REMOVED_TEXT rows (default true).
keywordsOnly report a page's changes when the added/removed text or new title matches one of these.
contentSelectorMonitor only a page section (e.g. #pricing).
ignoreSelectorsRemove elements before comparison (e.g. .cookie-banner). script/style/svg are always ignored.
trackLinksDetect added/removed links (default true; tracking params stripped first).
majorChangeThresholdPctText-change % for the MAJOR_CHANGE summary signal (default 20).
maxTextCharactersCap on compared text (default 200,000).
maxContentBytesAbort a fetch larger than this (default 5 MB).
requestTimeoutPer-page timeout in seconds (default 20).

Scheduling

Works correctly hourly, 6-hourly, daily or weekly. Use the same monitorId each time to preserve comparison state. Once a change is reported and the baseline updates, it is not reported again.

Example: Apify Console → Schedules → cron 0 */6 * * *, input = your urls + monitorId: "competitors".

API example

curl -X POST "https://api.apify.com/v2/acts/woolly_kingcrab~website-change-intelligence-monitor/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls":["https://www.apify.com/pricing"],"monitorId":"pricing-watch","keywords":["price","plan"]}'
curl "https://api.apify.com/v2/acts/woolly_kingcrab~website-change-intelligence-monitor/runs/last/dataset/items?token=$APIFY_TOKEN&format=csv"

Pricing

Pay per event. $0.02 per page successfully checked + $0.00005 per run start. Failed pages (blocked, timeout, 404, oversized, unparseable) are not charged. Example: 20 pages daily ≈ 20 × $0.02$0.40/day (~$12/month).

Security & limitations

  • Public pages only. localhost, 127.0.0.0/8, RFC-1918 private ranges, link-local (169.254.0.0/16, incl. cloud metadata endpoints), reserved/multicast, *.local, file://, ftp:// and any non-http(s) scheme are rejected. Redirects are re-validated at every hop, and a hostname resolving to any private address is blocked (DNS-rebinding guard).
  • 5 MB fetch cap (configurable to 20 MB); text/html, application/xhtml+xml, text/plain only.
  • Text-only comparison — JavaScript-rendered content that never appears in the served HTML is not seen.
  • PRICE_CHANGED is a literal price-token comparison, not a semantic price model; pages that render prices via JS or images won't produce it.
  • Not affiliated with any monitored site.

FAQ

Does it run a browser? No — plain HTTP fetch + HTML parse. Fast and cheap, but no JS rendering.

Will I get the same change twice? No. Reported changes are folded into the baseline.

What counts as one billable unit? One URL that was fetched, parsed and compared successfully in a run. Duplicates in your list and failed fetches are not billed.

Can two monitors share state? State is keyed by account + monitorId + normalized URL; use a distinct monitorId per watch list.


Unofficial tool. Monitors publicly accessible web pages only.