Website Change Tracker
Pricing
from $1.00 / 1,000 results
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
太郎 山田
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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.jsonfor a proven three-page first run. - If that output fits, switch to
store-input.templates.jsonand pick one of: Quickstart Pricing Monitorfor the cheapest first successPricing + Terms + Featuresfor broader daily monitoringWebhook Alertfor 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
| Who | Why |
|---|---|
| Developers | Automate recurring data fetches without building custom scrapers |
| Data teams | Pipe structured output into analytics warehouses |
| Ops teams | Monitor changes via webhook alerts |
| Product managers | Track competitor/market signals without engineering time |
Input
| Field | Type | Default | Description |
|---|---|---|---|
| targets | array | prefilled | List of targets. Each item supports id, name, kind, url, includePatterns, excludePatterns, maxChars, fixtureHtml, fixtur |
| requestTimeoutSeconds | integer | 30 | HTTP request timeout per target. |
| userAgent | string | — | Optional user-agent header for target requests. |
| maxChars | integer | 25000 | Upper bound for extracted text length. |
| delivery | string | "dataset" | Where to send run results. |
| datasetMode | string | "changes_only" | Choose whether dataset/webhook sends all targets or only event items. |
| webhookUrl | string | — | Required when delivery is webhook. |
| notifyOnNoChange | boolean | false | When 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
| Field | Type | Description |
|---|---|---|
meta | object | |
results | array | |
results[].id | string | |
results[].name | string | |
results[].kind | string | |
results[].url | string | |
results[].capturedAt | timestamp | |
results[].changed | boolean | |
results[].status | string | |
results[].hash | string | |
results[].previousHash | string | |
results[].previousCapturedAt | string | |
results[].lineCount | number | |
results[].changeSummary | object | |
results[].preview | string | |
results[].error | string | |
results[].finalUrl | string |
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 ApifyClientclient = 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-monitorfor 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.
Related Actors
SaaS & Vendor Monitoring cluster — explore related Apify tools:
- SaaS / Company Site Change Monitor Pro — Premium monitor for pricing, terms, and feature page diffs with dataset/webhook delivery.
- Vendor Pricing, Terms & Renewal Watch API — Monitor vendor pricing changes, terms-of-service updates, renewal language, privacy / DPA policy diffs, and procurement / vendor-risk alerts with one summary-first vendor digest per monitored vendor.
- Vendor Status Page & Incident Digest Monitor — Monitor public vendor status pages and incident feeds.
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.