Pricing & Feature Change Monitor
Pricing
from $2.00 / 1,000 url checks
Pricing & Feature Change Monitor
Watch public pricing and feature pages for content changes. Compares normalized SHA-256 hashes, emits structured change rows, and charges PPE events (url-check, change-detected). No browser — Cheerio only. Limited permissions: reads public URLs and uses Actor KV/dataset storage only.
Pricing
from $2.00 / 1,000 url checks
Rating
0.0
(0)
Developer
Frqnk Frederik
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Watch a list of public pricing and feature pages. On each run the Actor fetches the HTML (Cheerio — no browser), normalizes the text, compares a SHA-256 hash to the last snapshot, and writes a structured dataset row: baseline, unchanged, changed, or error.
Store: apify.com/frqnk/pricing-feature-change-monitor
When to use it
- Competitive intel: notice when a SaaS competitor changes price or feature copy
- Agent workflows: schedule checks and branch only when
status === "changed" - Lightweight monitoring without login scraping or headless browsers
Limitations (honest)
- Public pages only — no logins, cookies, or authenticated dashboards
- Cheerio / static HTML — works best on server-rendered marketing pages. Heavy SPA shells (empty HTML until JavaScript runs) may need a browser-based Actor later; this one does not use Playwright
- Noise filters reduce false positives from timestamps/counters but are not perfect
- Diffs are text-based heuristics (
changeType/severity), not a full visual QA tool
How it works
- Fetch each URL with Crawlee CheerioCrawler
- Normalize HTML (
script/stylestripped; optionalcontentSelector; optional noise stripping) - Hash normalized text (SHA-256) and load the previous snapshot from a named Key-Value store
- Emit a dataset row and charge PPE only when the rules below say so
| Situation | Dataset | PPE |
|---|---|---|
First seen, emitBaseline: true | baseline row | No charge |
First seen, emitBaseline: false | No row (state saved) | No charge |
| Same hash | unchanged | url-check |
| Different hash | changed + diff snippets | url-check + change-detected |
| Fetch / process failure | error | No charge |
Demos & Store auto-tests: keep emitBaseline: true so the first run produces rows quickly.
Production schedules on the same URLs: you can set emitBaseline: false if you only want unchanged / changed after the first silent snapshot.
Input example
{"urls": ["https://stripe.com/pricing","https://github.com/pricing"],"contentSelector": "main","profile": "pricing","ignoreNoise": true,"minChangePercent": 1,"stateStoreName": "pricing-feature-change-state","emitBaseline": true,"maxConcurrency": 5}
| Field | Default | Notes |
|---|---|---|
urls | (required) | Public pages to monitor |
contentSelector | main | Region hashed; falls back to body |
profile | pricing | Heuristic for changeType / severity |
ignoreNoise | true | Strip dates / “Updated: …” / counters |
minChangePercent | 1 | Influences severity banding |
stateStoreName | pricing-feature-change-state | Named KV for snapshots across runs |
emitBaseline | true | Emit first-seen rows (never charged) |
maxConcurrency | 5 | Parallel fetches |
Output example (changed row)
{"url": "https://stripe.com/pricing","status": "changed","changed": true,"checkedAt": "2026-09-20T15:00:00.000Z","previousCheckedAt": "2026-09-19T15:00:00.000Z","contentHash": "452029c4…","previousHash": "a1b2c3d4…","changeType": "pricing","severity": "major","addedText": ["Pro plan costs $49 per month."],"removedText": ["Pro plan costs $29 per month."],"diffSnippet": "- Pro plan costs $29 per month.\n+ Pro plan costs $49 per month.","httpStatus": 200,"errorCode": null}
status: baseline | unchanged | changed | error
Pricing (pay-per-event)
Configured on this Actor:
| Event | Price | When |
|---|---|---|
apify-actor-start | platform default | Actor starts |
url-check (primary) | $0.002 | Successful fetch + compare (unchanged or changed) |
change-detected | $0.04 | Meaningful hash change |
Baselines and errors are never charged. Platform usage for paying users is handled under Apify’s PPE rules (creator share / costs — see Apify monetization docs).
Run from an agent or API
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('frqnk/pricing-feature-change-monitor').call({urls: ['https://stripe.com/pricing','https://github.com/pricing',],profile: 'pricing',ignoreNoise: true,emitBaseline: false,stateStoreName: 'pricing-feature-change-state',});const { items } = await client.dataset(run.defaultDatasetId).listItems();const changes = items.filter((row) => row.status === 'changed');console.log(changes);
Or open the Actor in Console, paste URLs, and click Start. For recurring checks, add an Apify Schedule (daily/hourly) on the same stateStoreName.
Permissions
Limited permissions: public HTTP(S) fetches plus the run dataset and named KV store. No login automation, no residential-proxy requirement for typical public marketing pages.
Support
Issues and feature requests: open a discussion on the Store page or contact the publisher via Apify.
License
Apache-2.0