Website Change Tracker avatar

Website Change Tracker

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Website Change Tracker

Website Change Tracker

Monitor pages for text updates and extract structured diffs. Integrate scraped data into pipelines using webhooks and API.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

太郎 山田

太郎 山田

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

SaaS Pricing & Terms Monitor API

Monitor pricing, terms, and feature pages with machine-readable diffs, snapshot history, and dataset/webhook delivery.

Store Quickstart

  • Start with store-input.example.json for a proven three-page first run.
  • If that output fits, switch to store-input.templates.json and pick one of:
  • Quickstart Pricing Monitor for the cheapest first success
  • Pricing + Terms + Features for broader daily monitoring
  • Webhook Alert for Slack, Discord, or internal pipelines

Key Features

  • • **複数ターゲット監視 (price|terms|features|general** — 複数ターゲット監視 (price|terms|features|general`)
  • テキスト抽出 + SHA256スナップショット管理 — テキスト抽出 + SHA256スナップショット管理
  • 変更サマリ(追加/削除行) — 変更サマリ(追加/削除行)
  • Apify KV が使えない環境でもローカル state/ にフォールバック — Apify KV が使えない環境でもローカル state/ にフォールバック

Use Cases

WhoWhy
DevelopersAutomate recurring data fetches without building custom scrapers
Data teamsPipe structured output into analytics warehouses
Ops teamsMonitor changes via webhook alerts
Product managersTrack competitor/market signals without engineering time

Input

FieldTypeDefaultDescription
targetsarrayprefilledList of targets. Each item supports id, name, kind, url, includePatterns, excludePatterns, maxChars, fixtureHtml, fixtur
requestTimeoutSecondsinteger30HTTP request timeout per target.
userAgentstringOptional user-agent header for target requests.
maxCharsinteger25000Upper bound for extracted text length.
deliverystring"dataset"Where to send run results.
datasetModestring"changes_only"Choose whether dataset/webhook sends all targets or only event items.
webhookUrlstringRequired when delivery is webhook.
notifyOnNoChangebooleanfalseWhen false, webhook mode skips if no event items.

Input Example

{
"targets": [
{
"id": "notion-pricing",
"name": "Notion Pricing",
"kind": "price",
"url": "https://www.notion.so/pricing",
"includePatterns": [
"price",
"free",
"business",
"enterprise"
],
"excludePatterns": [
"cookie",
"login"
]
}
],
"requestTimeoutSeconds": 30,
"maxChars": 25000,
"delivery": "dataset",
"datasetMode": "changes_only",
"notifyOnNoChange": false,
"snapshotKey": "saas-change-monitor-snapshots",
"dryRun": false
}

Output

FieldTypeDescription
metaobject
resultsarray
results[].idstring
results[].namestring
results[].kindstring
results[].urlstring
results[].capturedAttimestamp
results[].changedboolean
results[].statusstring
results[].hashstring
results[].previousHashstring
results[].previousCapturedAtstring
results[].lineCountnumber
results[].changeSummaryobject
results[].previewstring
results[].errorstring
results[].finalUrlstring

Output Example

{
"meta": {
"generatedAt": "2026-03-13T09:40:25.990Z",
"now": "2026-03-13T09:40:25.951Z",
"input": {
"targets": [
{
"id": "notion-pricing",
"name": "Notion Pricing",
"kind": "price",
"url": ""
},
{
"id": "linear-terms",
"name": "Linear Terms",
"kind": "terms",
"url": ""
}
],
"requestTimeoutSeconds": 30,
"maxChars": 25000,
"delivery": "dataset",
"datasetMode": "all",
"dryRun": false
},
"snapshot": {
"key": "saas-change-monitor-proof-sample",
"loadedFrom": "local",
"savedTo": "local"
},
"warnings": [
"target(notion-pricing): includePatterns is empty, full-page text will be monitored",
"target(linear-terms): includePatterns is empty, full-page text will be monitored"
],
"totals": {
"targets": 2,
"changed": 0,
"initial": 2,
"unchanged": 0,
"errors": 0

API Usage

Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.

cURL

curl -X POST "https://api.apify.com/v2/acts/taroyamada~saas-change-monitor-actor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "targets": [ { "id": "notion-pricing", "name": "Notion Pricing", "kind": "price", "url": "https://www.notion.so/pricing", "includePatterns": [ "price", "free", "business", "enterprise" ], "excludePatterns": [ "cookie", "login" ] } ], "requestTimeoutSeconds": 30, "maxChars": 25000, "delivery": "dataset", "datasetMode": "changes_only", "notifyOnNoChange": false, "snapshotKey": "saas-change-monitor-snapshots", "dryRun": false }'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/saas-change-monitor-actor").call(run_input={
"targets": [
{
"id": "notion-pricing",
"name": "Notion Pricing",
"kind": "price",
"url": "https://www.notion.so/pricing",
"includePatterns": [
"price",
"free",
"business",
"enterprise"
],
"excludePatterns": [
"cookie",
"login"
]
}
],
"requestTimeoutSeconds": 30,
"maxChars": 25000,
"delivery": "dataset",
"datasetMode": "changes_only",
"notifyOnNoChange": false,
"snapshotKey": "saas-change-monitor-snapshots",
"dryRun": false
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/saas-change-monitor-actor').call({
"targets": [
{
"id": "notion-pricing",
"name": "Notion Pricing",
"kind": "price",
"url": "https://www.notion.so/pricing",
"includePatterns": [
"price",
"free",
"business",
"enterprise"
],
"excludePatterns": [
"cookie",
"login"
]
}
],
"requestTimeoutSeconds": 30,
"maxChars": 25000,
"delivery": "dataset",
"datasetMode": "changes_only",
"notifyOnNoChange": false,
"snapshotKey": "saas-change-monitor-snapshots",
"dryRun": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Tips & Limitations

  • Schedule weekly runs for procurement watchlists; daily for critical vendors.
  • Use webhook delivery to drop diffs into a shared procurement Slack channel.
  • Track competitor pricing quarterly to inform your own pricing strategy.
  • Store snapshots persistently — these are valuable for contract renegotiation evidence.
  • Combine with vendor-change-monitor for term-level changes alongside pricing.

FAQ

How are diffs computed?

Semantic diff on structured fields (prices, plan names, feature tables) rather than raw HTML — filters out cosmetic changes.

What happens if a vendor redesigns their site?

The actor falls back to best-effort structured extraction; material redesigns may require a vendor-specific adapter update.

Can I track changes to downloadable contracts/PDFs?

The actor tracks content text; PDF-only vendors with dynamic URLs may require manual review.

Does this bypass anti-bot measures?

No — it uses standard requests. Some vendors with aggressive bot protection may not be monitorable; report these issues and we'll adjust fetch strategy.

Can I monitor internal portals?

No — this actor is public-web only. Internal portals with auth are out of scope.

SaaS & Vendor Monitoring cluster — explore related Apify tools:

Cost

Pay Per Event:

  • actor-start: $0.01 (flat fee per run)
  • dataset-item: $0.003 per output item

Example: 1,000 items = $0.01 + (1,000 × $0.003) = $3.01

No subscription required — you only pay for what you use.