# SaaS Pricing Delta Tracker (`floydyra/saas-pricing-delta-tracker`) Actor

Tracks plans, prices, features, and billing cycles across SaaS pricing pages. Detects changes, quarantines anomalous runs, and fires webhook alerts. 3-tier fetch: HTTP, Lightpanda, Camoufox.

- **URL**: https://apify.com/floydyra/saas-pricing-delta-tracker.md
- **Developed by:** [Brat 和因第拉](https://apify.com/floydyra) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 pricing page checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SaaS Pricing Delta Tracker (Schema v2.0)

An enterprise-grade competitive intelligence and monitoring tool designed for RevOps, Finance, Procurement, and Product Marketing teams. It tracks plans, pricing points, features, billing intervals, and CTAs across SaaS websites, generating stable identifiers, calculating semantic deltas, and routing suspicious runs through a quarantine gate.

***

### Key Features

- **3-Tier Cascading Fetcher**:
  1. **Tier 1 (HTTP-first)**: Fetches pages using `curl_cffi` (Chrome TLS fingerprint spoofing) in ~1s. Bypasses WAF blocks on 90% of pages at <0.01 CU.
  2. **Tier 2 (Lightpanda CDP)**: headful client-side JS rendering on-demand.
  3. **Tier 3 (Camoufox Playwright Firefox)**: Stealth Firefox anti-detect browser fallback to bypass Cloudflare Turnstile blocks.
- **Polite Domain-Aware Throttling**: Limits requests per domain name concurrently and schedules polite delay gaps between successive fetches.
- **Stable Plan Hashing (`plan_id`)**: Generates stable hashes from immutable properties (`canonical_url + section_path + plan_name + period + basis`) to prevent updates from collapsing or appearing as false additions/deletions.
- **Zero-Plan & Drop Quarantine**: Prevents corrupting snapshots with empty or partially failed loads. Quarantines suspicious runs separately rather than overwriting valid database snapshots.
- **JSON State Parser**: Parses Next.js (`__NEXT_DATA__`), Remix, Astro, and inline hydration script states *before* stripping script tags.
- **Automated Billing Toggles**: Clicks billing controls dynamically inside browser fallbacks to isolate and capture both monthly and annual pricing matrices.
- **Severity Classified Webhooks**: Rates price updates, feature adjustments, CTAs, and plan changes by severity (`critical`, `major`, `medium`, `low`) and deduplicates webhook alerts using cryptographic change signatures.

***

### Input Parameters

The Actor takes the following configurations in JSON:

| Key | Type | Description | Default |
|---|---|---|---|
| `urls` | Array (String) | List of direct pricing pages or domains (e.g. `apify.com/pricing`). | *Required* |
| `mode` | String | `"changes_only"` (Output changes only) or `"snapshot"` (Output all runs). | `"changes_only"` |
| `webhook_url` | String | External HTTP POST webhook endpoint for alert notifications. | `null` |
| `concurrency_limit` | Integer | Maximum concurrent requests globally. | `3` |
| `max_concurrency_per_domain` | Integer | Concurrency limit against a single domain. | `1` |
| `delay_between_same_domain_requests_ms` | Integer | Delay between consecutive page hits to same host. | `2000` |
| `allow_empty_snapshots` | Boolean | Set to true to permit empty database snapshots. | `false` |
| `confidence_threshold` | Float | Gating score threshold (0.0 to 1.0) below which runs are quarantined. | `0.3` |
| `debug` | Boolean | Enables saving raw DOM HTML and headless screenshots on failure. | `false` |
| `debug_artifact_retention_days` | Integer | Lifespan in days before debug artifacts are pruned. | `7` |
| `alert_deduplication` | Boolean | Prevents dispatching repeated identical webhook events. | `true` |

***

### Output Schema (v2.0)

Each dataset item contains structured plans parsed with confidence metadata:

```json
{
  "schema_version": "2.0",
  "url": "https://apify.com/pricing",
  "timestamp": "2026-07-06T11:04:30Z",
  "event_type": "change",
  "has_changes": true,
  "detected_plans": [
    {
      "schema_version": "2.0",
      "plan_key": "https://apify.com/pricing|General|Starter|monthly|per subscription",
      "plan_id": "8f38c3505c2a12c8ff6a24446e507ea293c39339243760a927d2e0ff5a842cfb",
      "name": "Starter",
      "price": 29.0,
      "price_raw": "29.0",
      "normalized_price": 29.0,
      "currency": "USD",
      "period": "monthly",
      "billing_basis": "per subscription",
      "features": ["Chat support", "Bronze Apify Store discount"],
      "cta": "Choose plan",
      "is_enterprise": false,
      "product_section": "General",
      "product_section_path": "General",
      "confidence": 0.85,
      "confidence_details": {
        "overall": 0.85,
        "price": 1.0,
        "identity": 1.0,
        "section": 0.5,
        "field_coverage": 0.83
      },
      "evidence_text": "Starter $29 per month ... Choose plan",
      "source_selector": "div.pricing-card.starter-card",
      "parse_warnings": []
    }
  ],
  "changes_summary": "Updated price for 'Starter' (General): USD29.0/monthly -> USD39.0/monthly",
  "tier_resolved": "HTTP"
}
```

***

### Webhook Delta Payload (v2.0)

Dispatched to `webhook_url` when changes occur:

```json
{
  "schema_version": "2.0",
  "url": "https://apify.com/pricing",
  "timestamp": "2026-07-06T11:04:30Z",
  "changes_summary": "Updated price for 'Starter' (General): USD29.0/monthly -> USD39.0/monthly",
  "alerts": [
    {
      "severity": "critical",
      "change_type": "price_changed",
      "plan_id": "8f38c3505c2a12c8ff6a24446e507ea293c39339243760a927d2e0ff5a842cfb",
      "plan_key": "https://apify.com/pricing|General|Starter|monthly|per subscription",
      "message": "Updated price for 'Starter' (General): USD29.0/monthly -> USD39.0/monthly",
      "alert_fingerprint": "a4d8c950a7c4ff12a0d182b8c9d0eeff4a39029994c92b21c97aef0e12b7a942"
    }
  ],
  "plans": [...]
}
```

***

### Known Limitations

1. **Interactive Captchas (Hard Turnstiles)**: Targets enforcing high-security WAF puzzles (requiring manual checkbox clicking or image puzzle solving) cannot be bypassed headlessly out-of-the-box. These are safely caught by our anomaly check, returning `"event_type": "quarantine"` rather than reporting corrupt plan removals.
2. **Calculator-Only Pricing**: Sites with sliders, inputs, or dynamically calculated prices without explicit plan grids (e.g. cloud hosting estimators) cannot be resolved into static cards.
3. **Authentication Walls**: Pricing hidden behind user log-ins is inaccessible.

# Actor input Schema

## `urls` (type: `array`):

List of SaaS domains (e.g. stripe.com) or full URLs (e.g. https://stripe.com/pricing) to track.

## `mode` (type: `string`):

snapshot: Always save pricing plan results. changes\_only: Only output data when plans or pricing configurations have changed.

## `webhook_url` (type: `string`):

An external HTTP POST endpoint. Fired only on pricing changes/deltas.

## `concurrency_limit` (type: `integer`):

Maximum number of total pages monitored in parallel.

## `max_concurrency_per_domain` (type: `integer`):

Maximum number of parallel browser sessions/requests active against the same domain name.

## `delay_between_same_domain_requests_ms` (type: `integer`):

Wait time between consecutive requests to the same domain name to avoid overloading target sites.

## `allow_empty_snapshots` (type: `boolean`):

Set to true if you want to permit overwriting healthy snapshots with empty plan arrays.

## `confidence_threshold` (type: `number`):

Confidence score boundary. Plans with lower scores are warning-flagged and excluded from alert triggers.

## `debug` (type: `boolean`):

If enabled, saves raw DOM HTML and headless screenshots of browser states to Key-Value store on failures.

## `debug_artifact_retention_days` (type: `integer`):

Number of days before old debug HTML and screenshot files are automatically pruned from Key-Value store.

## `alert_deduplication` (type: `boolean`):

If enabled, blocks duplicate alerts if identical changes have already been sent in previous runs.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com/pricing",
    "https://render.com"
  ],
  "mode": "changes_only",
  "concurrency_limit": 3,
  "max_concurrency_per_domain": 1,
  "delay_between_same_domain_requests_ms": 2000,
  "allow_empty_snapshots": false,
  "confidence_threshold": 0.65,
  "debug": false,
  "debug_artifact_retention_days": 7,
  "alert_deduplication": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

Structured JSON items representing snapshots of pricing plans or detected changes.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://apify.com/pricing",
        "https://render.com"
    ],
    "concurrency_limit": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("floydyra/saas-pricing-delta-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": [
        "https://apify.com/pricing",
        "https://render.com",
    ],
    "concurrency_limit": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("floydyra/saas-pricing-delta-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://apify.com/pricing",
    "https://render.com"
  ],
  "concurrency_limit": 3
}' |
apify call floydyra/saas-pricing-delta-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,floydyra/saas-pricing-delta-tracker"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Q20lntuDr2efW2Cw6/builds/m1jSQXwlpk0ER52b0/openapi.json
