Website Change Intelligence Monitor
Pricing
from $20.00 / 1,000 page-checkeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
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
- Provide a list of page URLs and a stable Monitor ID.
- 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. - It writes one flat row per change and saves the new snapshot.
First run vs. next run
| Output | |
|---|---|
| First run for a URL | BASELINE 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.
| Field | Description |
|---|---|
url | URL as you supplied it |
normalized_url | Canonical form used as the state key (lowercased host, tracking params + fragment removed) |
monitor_id | Your monitor ID |
change_type | BASELINE, UNCHANGED, CONTENT_CHANGED, ADDED_TEXT, REMOVED_TEXT, PRICE_CHANGED, SUMMARY, FAILED |
changed_field | title, meta_description, text, links, price, final_url — or the failure reason for FAILED |
previous_value / current_value | Concise before/after (or a small JSON blob for SUMMARY) |
added_text / removed_text | The changed sentences (when includeTextDiff is on) |
previous_hash / current_hash | SHA-256 of the normalised page text |
http_status | HTTP status of the fetch |
detected_at | When this run observed the change |
first_seen_at / last_seen_at | When 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
| Field | Required | Description |
|---|---|---|
urls | ✅ | Up to 50 public http/https page URLs. |
monitorId | Stable name for this watch list. Reuse it on every scheduled run. Default "default". | |
outputMode | CHANGES_ONLY (default) or ALL_CHECKS (also emit a row for unchanged pages). | |
includeTextDiff | Emit ADDED_TEXT / REMOVED_TEXT rows (default true). | |
keywords | Only report a page's changes when the added/removed text or new title matches one of these. | |
contentSelector | Monitor only a page section (e.g. #pricing). | |
ignoreSelectors | Remove elements before comparison (e.g. .cookie-banner). script/style/svg are always ignored. | |
trackLinks | Detect added/removed links (default true; tracking params stripped first). | |
majorChangeThresholdPct | Text-change % for the MAJOR_CHANGE summary signal (default 20). | |
maxTextCharacters | Cap on compared text (default 200,000). | |
maxContentBytes | Abort a fetch larger than this (default 5 MB). | |
requestTimeout | Per-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/plainonly. - Text-only comparison — JavaScript-rendered content that never appears in the served HTML is not seen.
PRICE_CHANGEDis 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.