SaaS pricing pages

SaaS pricing and policy page change alerts from public URLs

This Actor fetches public SaaS pricing, terms, and feature pages, snapshots extracted text, and emits source-linked change rows when the page hash or filtered text drifts. Live input is a targets[] list of id, name, kind, and url — not a top-level urls array.

Not an authenticated customer portal, CPQ, or invoice scraper. Not a PDF-contract parser. Public web only; aggressive bot walls may block fetches.

from $1.00 / 1,000 SaaS change rows ($0.001 per delivered apify-default-dataset-item). No Actor Start. Unchanged datasetMode=changes_only runs can emit zero rows and zero charge.

Open SaaS Pricing Tracker on Apify

SaaS Pricing Tracker, not a neighboring Actor

Use this page for this Actor’s job. Use Website Content Extractor for One-shot page-to-markdown; Use Status Page Incident Digest Monitor for Vendor status-page incidents; Use Trust Center Subprocessor Monitor for Trust-center vendor lists.

This Actor Website Content Extractor Status Page Incident Digest Monitor Trust Center Subprocessor Monitor
Intent SaaS Pricing Tracker One-shot page-to-markdown Vendor status-page incidents Trust-center vendor lists
Primary input targets urls status page feeds/URLs trust-center URLs
What it reads Public sources listed on the Store page page HTML status.io-style public pages public subprocessors pages
Primary output Dataset rows billed per live PPE markdown/text incident digest rows subprocessor change rows
Not this job Not an authenticated customer portal, CPQ, or invoice scraper. Not a PDF-contract parser. Public web only; aggressive bot walls may block fetches. Not recurring pricing diffs Not pricing/terms copy diffs Not plan-price text diffs

Store ID: taroyamada/saas-change-monitor-actor. Respect source terms, robots.txt, and rate limits.

Use cases

How is SaaS Pricing Tracker different from Website Content Extractor and Status Page Incident Digest Monitor?

SaaS Pricing Tracker — Competitor Page Change Alerts (taroyamada/saas-change-monitor-actor): This Actor fetches public SaaS pricing, terms, and feature pages, snapshots extracted text, and emits source-linked change rows when the page hash or filtered text drifts. Live input is a targets[] list of id, name, kind, and url — not a top-level urls array. Not an authenticated customer portal, CPQ, or invoice scraper. Not a PDF-contract parser. Public web only; aggressive bot walls may block fetches. Website Content Extractor is for One-shot page-to-markdown (input urls; page HTML; markdown/text). Not recurring pricing diffs. Status Page Incident Digest Monitor is for Vendor status-page incidents (input status page feeds/URLs; status.io-style public pages; incident digest rows). Not pricing/terms copy diffs. Trust Center Subprocessor Monitor is for Trust-center vendor lists (input trust-center URLs; public subprocessors pages; subprocessor change rows). Not plan-price text diffs.

What input is required?

Live required fields: targets. Published exampleRunInput uses three targets (Stripe pricing, Linear terms, Vercel features) with include/exclude patterns. Schema prefill is Notion pricing. datasetMode default changes_only. delivery enum includes email as a placeholder path.

Field Type Default Notes
targets array required empty Monitored Targets. List of targets. Each item supports id, name, kind, url, includePatterns, excludePatterns, maxChars, fixtureHtml, fixturePath.
requestTimeoutSeconds integer 30 Request Timeout (seconds). HTTP request timeout per target.
userAgent string empty Custom User-Agent. Optional user-agent header for target requests.
maxChars integer 25000 Global Max Chars per Page. Upper bound for extracted text length.
delivery string dataset Delivery Mode. Where to send run results.
datasetMode string changes_only Dataset Mode. Choose whether dataset/webhook sends all targets or only event items.
webhookUrl string empty Webhook URL. Required when delivery is webhook.
notifyOnNoChange boolean false Notify Even If No Change. When false, webhook mode skips if no event items.
snapshotKey string saas-change-monitor-snapshots Snapshot Key. Key used for snapshot persistence.
nowIso string empty Now (ISO, optional). Optional fixed timestamp for deterministic tests.
dryRun boolean false Dry Run. Skip delivery side effects and snapshot save.

Published Store example run input (omitted fields take schema defaults):

{
  "targets": [
    {
      "id": "stripe-pricing",
      "name": "Stripe Pricing",
      "kind": "price",
      "url": "https://stripe.com/pricing",
      "includePatterns": [
        "pricing",
        "starter",
        "professional",
        "enterprise"
      ],
      "excludePatterns": [
        "cookie",
        "sign in",
        "support"
      ]
    },
    {
      "id": "linear-terms",
      "name": "Linear Terms",
      "kind": "terms",
      "url": "https://linear.app/legal/terms",
      "includePatterns": [
        "billing",
        "refund",
        "termination",
        "subscription"
      ],
      "excludePatterns": [
        "cookie",
        "sign in"
      ]
    },
    {
      "id": "vercel-features",
      "name": "Vercel Features",
      "kind": "features",
      "url": "https://vercel.com/features",
      "includePatterns": [
        "feature",
        "edge",
        "security",
        "analytics"
      ],
      "excludePatterns": [
        "cookie",
        "sign in"
      ]
    }
  ],
  "requestTimeoutSeconds": 30,
  "maxChars": 25000,
  "delivery": "dataset",
  "datasetMode": "changes_only",
  "notifyOnNoChange": false,
  "snapshotKey": "saas-change-monitor-snapshots",
  "dryRun": false
}

Run SaaS Pricing Tracker on Apify

How do dataset, webhook, and dry-run delivery work?

delivery defaults to dataset on the live schema. Dataset output is the billable surface when rows are written. webhookUrl is used when delivery is webhook (and typically not during dryRun). dryRun true validates or samples without the usual dataset/webhook side effects described on the Store schema. datasetMode can limit emits to changes_only versus all. Unchanged runs that write zero default-dataset rows typically charge $0.00 on current PPE.

What does a result contain?

The published README output sample on the Store page is truncated or not valid standalone JSON. Treat README field lists as illustrations, not a live coverage guarantee. There is no published output JSON schema on the Store page.

How is SaaS Pricing Tracker priced?

Billing is pay per event. The live Store card is from $1.00 / 1,000 SaaS change rows ($0.001 per delivered apify-default-dataset-item). No Actor Start. Unchanged datasetMode=changes_only runs can emit zero rows and zero charge. Current PPE:

Event Price Emitted when
apify-default-dataset-item (SaaS change row) $0.001 Charged only when a source-linked SaaS page change row is delivered.

The published README Cost block is stale versus the live Store pricing tab. README Cost still quotes actor-start $0.01 + dataset-item $0.003 ($3.01 / 1,000). Live Store: SaaS change row $0.001, no start. README Input Examples use urls/emitTextDiff; live schema requires targets and has no emitTextDiff. This page quotes live PPE only.

from $1.00 / 1,000 SaaS change rows ($0.001 per delivered apify-default-dataset-item). No Actor Start. Unchanged datasetMode=changes_only runs can emit zero rows and zero charge.

See SaaS Pricing Tracker pricing on Apify

Limits to keep in mind

Open SaaS Pricing Tracker on Apify

Related pages