Pricing & Feature Change Monitor avatar

Pricing & Feature Change Monitor

Pricing

from $2.00 / 1,000 url checks

Go to Apify Store
Pricing & Feature Change Monitor

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

Frqnk Frederik

Maintained by Community

Actor 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

  1. Fetch each URL with Crawlee CheerioCrawler
  2. Normalize HTML (script/style stripped; optional contentSelector; optional noise stripping)
  3. Hash normalized text (SHA-256) and load the previous snapshot from a named Key-Value store
  4. Emit a dataset row and charge PPE only when the rules below say so
SituationDatasetPPE
First seen, emitBaseline: truebaseline rowNo charge
First seen, emitBaseline: falseNo row (state saved)No charge
Same hashunchangedurl-check
Different hashchanged + diff snippetsurl-check + change-detected
Fetch / process failureerrorNo 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
}
FieldDefaultNotes
urls(required)Public pages to monitor
contentSelectormainRegion hashed; falls back to body
profilepricingHeuristic for changeType / severity
ignoreNoisetrueStrip dates / “Updated: …” / counters
minChangePercent1Influences severity banding
stateStoreNamepricing-feature-change-stateNamed KV for snapshots across runs
emitBaselinetrueEmit first-seen rows (never charged)
maxConcurrency5Parallel 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:

EventPriceWhen
apify-actor-startplatform defaultActor starts
url-check (primary)$0.002Successful fetch + compare (unchanged or changed)
change-detected$0.04Meaningful 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