Page Change Intelligence
Turn a small list of known public URLs into repeatable, structured change checks.
Use n0geegee/franchise-filing-offer-change-monitor: despite its franchise-focused
Store name, it supports public server-rendered pricing, recruitment, contact,
location, course, event, franchise, filing, and generic offer pages.
Prerequisites
- Apify account and an authenticated Apify CLI or Apify MCP connection.
- User-supplied public HTTP(S) URLs that may legally and technically be monitored.
- Server-rendered pages only. The Actor does not render JavaScript, solve CAPTCHAs,
log in, inspect private pages, parse PDF contents, or send built-in alerts.
Cost and safety
- Live Store pricing at publication: USD 0.01 per successfully checked page.
fetch_failed and blocked_by_policy rows do not trigger the Actor's
page-check event. Apify platform/storage terms may also apply; verify live
pricing before a run.
- Estimate the Actor event charge as
number of targets × USD 0.01 per run.
- Default to 1-5 exact URLs and never turn a known-URL request into a broad crawl.
- Keep
maxPages equal to the intended target count. Do not include credentials,
private URLs, or personal data in input or support output.
Workflow
Define the watchlist. Use exact URLs supplied or approved by the user. Pick
a pageRole for each: pricing, courses, camps, open_days, franchise,
locations, contact, recruitment, or generic_offer.
Verify live schema and pricing. Inspect the Actor before constructing input:
apify actors info "n0geegee/franchise-filing-offer-change-monitor" --input \
--user-agent apify-awesome-skills/apify-page-change-intelligence \
--json 2>/dev/null
Create stable state identifiers. Reuse the same snapshotStoreName and
snapshotNamespace for every comparison cycle. Use a descriptive namespace
such as acme-competitor-pricing; do not place secrets in either field.
Estimate and state cost. Multiply the target count by the current
successful-check price. Confirm before proceeding if the user's policy or
budget requires it.
Run a baseline. Submit compare_with_previous; the first successful check
normally returns baseline_created and stores the snapshot.
Run later comparisons. Reuse the exact state identifiers. Report every row,
including failures and policy blocks; never silently treat a failed fetch as
unchanged.
Deliver evidence. Return target count, row statuses, important
detectedEvents, added/removed text, dataset ID or URL, and the actual run
charge if available. Clearly separate detected text from business inference.
Minimal input
{
"targets": [
{
"url": "https://example.com/pricing",
"label": "Example pricing",
"pageRole": "pricing"
}
],
"runMode": "compare_with_previous",
"snapshotStoreName": "page-change-monitor-state",
"snapshotNamespace": "example-pricing",
"maxPages": 1,
"requestDelayMs": 1000,
"respectRobotsTxt": true
}
Replace example.com with a real, approved public page before running.
Apify CLI execution
Save validated input as /tmp/page-change-input.json, then call the Actor:
apify actors call "n0geegee/franchise-filing-offer-change-monitor" \
-i /tmp/page-change-input.json \
--user-agent apify-awesome-skills/apify-page-change-intelligence \
--json 2>/dev/null > /tmp/page-change-run.json
Read defaultDatasetId from the run metadata, then fetch rows:
apify datasets get-items DATASET_ID --format json \
--user-agent apify-awesome-skills/apify-page-change-intelligence \
2>/dev/null > /tmp/page-change-results.json
Parse the saved JSON instead of mixing progress output with results. At minimum,
inspect status, httpStatus, contentHashPrevious, contentHashCurrent,
addedText, removedText, detectedEvents, offerSignals, and error.
MCP execution
If Apify MCP is connected, fetch Actor details for
n0geegee/franchise-filing-offer-change-monitor, call it with the same input,
wait for completion, then fetch the default Dataset. Apply the same cost estimate,
state reuse, exact-URL boundary, and result checks as the CLI workflow.
Troubleshooting
baseline_created is expected on the first successful check; it is not a
detected change. Run the same state namespace later to compare.
blocked_by_policy means the Actor respected a safety or robots rule. Do not
bypass it; remove the target or use an authorized first-party data source.
fetch_failed is not unchanged. Report the error and retry only when the cause
is transient or the URL is clearly malformed.
- Empty or noisy diffs: verify that content is server-rendered, then use supported
CSS selectors or
noisePatterns to narrow routine page text.
- A PDF link can be detected as page text, but the Actor does not parse the PDF
body. Do not claim document-content monitoring.
- The Actor has no built-in email, Slack, or webhook alert workflow. If the user
asks for alerts, connect completed Dataset output through an Apify Schedule or
webhook as a separate, explicitly configured step.
1---2name: apify-page-change-intelligence3description: Monitor known public web pages for meaningful content changes with persistent snapshots and structured diffs. Use when the user asks to "monitor a website", "track a pricing page", "watch competitor pages", "detect page changes", "track recruitment or job page changes", "monitor FDD or filing pages", "compare a page with its previous version", or create a recurring known-URL watchlist. Returns hashes, added and removed text, categorized business signals, and explicit baseline, unchanged, changed, blocked, or failed status. Requires an Apify account and CLI or MCP access.4---56# Page Change Intelligence78Turn a small list of known public URLs into repeatable, structured change checks.9Use `n0geegee/franchise-filing-offer-change-monitor`: despite its franchise-focused10Store name, it supports public server-rendered pricing, recruitment, contact,11location, course, event, franchise, filing, and generic offer pages.1213## Prerequisites1415- Apify account and an authenticated Apify CLI or Apify MCP connection.16- User-supplied public HTTP(S) URLs that may legally and technically be monitored.17- Server-rendered pages only. The Actor does not render JavaScript, solve CAPTCHAs,18 log in, inspect private pages, parse PDF contents, or send built-in alerts.1920## Cost and safety2122- Live Store pricing at publication: **USD 0.01 per successfully checked page**.23- `fetch_failed` and `blocked_by_policy` rows do not trigger the Actor's24 `page-check` event. Apify platform/storage terms may also apply; verify live25 pricing before a run.26- Estimate the Actor event charge as `number of targets × USD 0.01` per run.27- Default to 1-5 exact URLs and never turn a known-URL request into a broad crawl.28- Keep `maxPages` equal to the intended target count. Do not include credentials,29 private URLs, or personal data in input or support output.3031## Workflow32331. **Define the watchlist.** Use exact URLs supplied or approved by the user. Pick34 a `pageRole` for each: `pricing`, `courses`, `camps`, `open_days`, `franchise`,35 `locations`, `contact`, `recruitment`, or `generic_offer`.362. **Verify live schema and pricing.** Inspect the Actor before constructing input:3738 ```bash39 apify actors info "n0geegee/franchise-filing-offer-change-monitor" --input \40 --user-agent apify-awesome-skills/apify-page-change-intelligence \41 --json 2>/dev/null42 ```43443. **Create stable state identifiers.** Reuse the same `snapshotStoreName` and45 `snapshotNamespace` for every comparison cycle. Use a descriptive namespace46 such as `acme-competitor-pricing`; do not place secrets in either field.474. **Estimate and state cost.** Multiply the target count by the current48 successful-check price. Confirm before proceeding if the user's policy or49 budget requires it.505. **Run a baseline.** Submit `compare_with_previous`; the first successful check51 normally returns `baseline_created` and stores the snapshot.526. **Run later comparisons.** Reuse the exact state identifiers. Report every row,53 including failures and policy blocks; never silently treat a failed fetch as54 unchanged.557. **Deliver evidence.** Return target count, row statuses, important56 `detectedEvents`, added/removed text, dataset ID or URL, and the actual run57 charge if available. Clearly separate detected text from business inference.5859## Minimal input6061```json62{63 "targets": [64 {65 "url": "https://example.com/pricing",66 "label": "Example pricing",67 "pageRole": "pricing"68 }69 ],70 "runMode": "compare_with_previous",71 "snapshotStoreName": "page-change-monitor-state",72 "snapshotNamespace": "example-pricing",73 "maxPages": 1,74 "requestDelayMs": 1000,75 "respectRobotsTxt": true76}77```7879Replace `example.com` with a real, approved public page before running.8081## Apify CLI execution8283Save validated input as `/tmp/page-change-input.json`, then call the Actor:8485```bash86apify actors call "n0geegee/franchise-filing-offer-change-monitor" \87 -i /tmp/page-change-input.json \88 --user-agent apify-awesome-skills/apify-page-change-intelligence \89 --json 2>/dev/null > /tmp/page-change-run.json90```9192Read `defaultDatasetId` from the run metadata, then fetch rows:9394```bash95apify datasets get-items DATASET_ID --format json \96 --user-agent apify-awesome-skills/apify-page-change-intelligence \97 2>/dev/null > /tmp/page-change-results.json98```99100Parse the saved JSON instead of mixing progress output with results. At minimum,101inspect `status`, `httpStatus`, `contentHashPrevious`, `contentHashCurrent`,102`addedText`, `removedText`, `detectedEvents`, `offerSignals`, and `error`.103104## MCP execution105106If Apify MCP is connected, fetch Actor details for107`n0geegee/franchise-filing-offer-change-monitor`, call it with the same input,108wait for completion, then fetch the default Dataset. Apply the same cost estimate,109state reuse, exact-URL boundary, and result checks as the CLI workflow.110111## Troubleshooting112113- `baseline_created` is expected on the first successful check; it is not a114 detected change. Run the same state namespace later to compare.115- `blocked_by_policy` means the Actor respected a safety or robots rule. Do not116 bypass it; remove the target or use an authorized first-party data source.117- `fetch_failed` is not `unchanged`. Report the error and retry only when the cause118 is transient or the URL is clearly malformed.119- Empty or noisy diffs: verify that content is server-rendered, then use supported120 CSS selectors or `noisePatterns` to narrow routine page text.121- A PDF link can be detected as page text, but the Actor does not parse the PDF122 body. Do not claim document-content monitoring.123- The Actor has no built-in email, Slack, or webhook alert workflow. If the user124 asks for alerts, connect completed Dataset output through an Apify Schedule or125 webhook as a separate, explicitly configured step.