# SaaS Pricing Intelligence Monitor (`orbiscribe/saas-pricing-intelligence-monitor`) Actor

Monitor public SaaS pricing pages, extract plans and prices, and emit structured pricing change events for competitive intelligence.

- **URL**: https://apify.com/orbiscribe/saas-pricing-intelligence-monitor.md
- **Developed by:** [Orbiscribe Labs](https://apify.com/orbiscribe) (community)
- **Categories:** Business, Automation, Lead generation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 pricing page analyzeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Intelligence Monitor

Monitor public SaaS pricing pages and turn them into structured pricing
snapshots and change events.

This Actor is for founders, product marketing teams, RevOps, sales teams, and
competitive-intelligence researchers who need to know when a competitor changes
plans, prices, limits, or feature packaging.

The best first use case is a focused watchlist, for example AI/devtools pricing
pages where model access, usage credits, team seats, and enterprise packaging
change often enough to matter.

### Run This First

Paste this small AI/devtools watchlist, run it once, then run it again later
with the same `snapshotStoreName` to see change rows:

```json
{
  "pricingUrls": [
    { "url": "https://linear.app/pricing" },
    { "url": "https://www.cursor.com/pricing" },
    { "url": "https://www.pinecone.io/pricing/" }
  ],
  "compareToPreviousRun": true,
  "snapshotStoreName": "ai-devtools-pricing-watchlist",
  "includeHtml": false,
  "includeText": true,
  "maxPages": 3,
  "maxPlansPerPage": 20,
  "dryRun": false
}
````

Look first at `detectedPrices`, `plans`, `hasChanges`, `changes`, and
`BUYER_BRIEF`. A practical workflow recipe is in
`docs/workflow-recipes/saas-pricing-change-alert.md` in the GitHub repository.

### What It Does

Give the Actor a list of public pricing page URLs. It fetches each page,
extracts visible pricing signals, stores the latest snapshot in a named
key-value store, and compares later runs against the previous snapshot.

It returns:

- detected company and pricing page URL
- normalized plans, prices, billing periods, and feature bullets
- flattened `detectedPrices` rows for Sheets, Slack, Airtable, and n8n
- evidence snippets for each detected plan
- confidence scores for extraction and changes
- change events such as `price_increase`, `price_decrease`, `plan_added`,
  `plan_removed`, `feature_added`, `feature_removed`, and `page_text_changed`
- run summary in the key-value store

The run also writes key-value outputs:

- `RUN_SUMMARY`: counts, status, inputs, and failed URLs
- `BUYER_BRIEF`: a short Markdown brief of pricing changes to review
- `SLACK_ALERTS`: compact alert objects for webhook or chat workflows

### Why Use This Instead Of A Page Monitor

Generic page monitors tell you that HTML changed. This Actor tries to answer
the business question: what pricing changed, which plan changed, and what value
should a human verify?

The first version is deterministic. It does not require an LLM key, does not log
in, and does not collect private data. That keeps scheduled runs cheap and
repeatable.

### Input

```json
{
  "pricingUrls": [
    { "url": "https://example.com/pricing" },
    { "url": "https://competitor.com/pricing" }
  ],
  "compareToPreviousRun": true,
  "snapshotStoreName": "saas-pricing-intelligence-monitor-snapshots",
  "includeHtml": false,
  "includeText": true,
  "maxPages": 25,
  "maxPlansPerPage": 20
}
```

Use Apify schedules to run the same input daily or weekly. Use Apify webhooks to
send changed rows into Slack, email, Google Sheets, Make, Zapier, or your own
dashboard.

The default Store run is a dry-run demo so the Actor succeeds with no setup.
Set `dryRun` to `false` when you want to monitor real pricing pages.

### Use With n8n, Make, or Zapier

Save your input as an Apify Task and schedule it weekly. In n8n, Make, or
Zapier, run the Task with wait-for-finish enabled, then read the dataset and the
`SLACK_ALERTS` key-value output.

Typical workflow:

1. Run once to create the baseline snapshot.
2. Schedule the same Task weekly.
3. Filter for rows where `hasChanges` is true.
4. Send `company`, `url`, `changes`, `summary`, and `evidenceSnippets` to
   Slack, Sheets, Airtable, or a competitive-intel dashboard.

### Output

Each dataset item is one analyzed pricing page:

```json
{
  "recordType": "pricing_snapshot",
  "company": "Example CRM",
  "url": "https://example.com/pricing",
  "plans": [
    {
      "name": "Pro",
      "prices": [{ "amount": 29, "currency": "USD", "raw": "$29/month" }],
      "features": ["10 seats", "API access", "Priority support"],
      "confidence": 0.91
    }
  ],
  "detectedPrices": [
    {
      "amount": 29,
      "currency": "USD",
      "raw": "$29/month",
      "billingPeriod": "month",
      "plan": "Pro"
    }
  ],
  "changes": [
    {
      "changeType": "price_increase",
      "plan": "Pro",
      "oldValue": "$24/month",
      "newValue": "$29/month",
      "summary": "Pro price increased from $24/month to $29/month (20.8%).",
      "confidence": 0.9
    }
  ],
  "hasChanges": true,
  "changeCount": 1,
  "extractionConfidence": 0.89
}
```

### Pricing

This Actor uses pay-per-event pricing. Dry-run examples are not charged. Apify
free-plan users get the first 10 analyzed pricing pages without this Actor's
custom event charge; after that, normal pay-per-event pricing and the user's run
spending limit apply.

| Event | Price | What counts |
| --- | --- | --- |
| `pricing-page` | `$0.02` | One public pricing page analyzed and written to the dataset |

Paying per analyzed page is intentional. A monitor still provides value when it
confirms there was no pricing change.

### Limits

This Actor works on public pricing pages. It does not log in, bypass paywalls,
solve CAPTCHAs, or access private customer dashboards.

Pricing pages vary a lot. Treat low-confidence rows and high-impact changes as
review queues, not legal or financial facts. For JavaScript-heavy pricing pages,
use this Actor as a first pass; a browser-rendered version can be added if
there is enough buyer demand.

### Good Use Cases

- competitor pricing monitoring
- weekly product marketing alerts
- sales battlecard updates
- RevOps pricing-package research
- analyst datasets for SaaS categories
- private dashboards that need structured pricing-change events

### Bad Fits

- private pricing hidden behind login
- custom enterprise quote collection
- scraping pages that prohibit automated access
- exact price guarantees for legal or contract decisions

# Actor input Schema

## `pricingUrls` (type: `array`):

Public pricing pages to analyze. Use direct pricing URLs, not login-only dashboards.

## `compareToPreviousRun` (type: `boolean`):

Compare each page to the previous snapshot stored in the named key-value store.

## `snapshotStoreName` (type: `string`):

Named key-value store used to persist pricing snapshots across scheduled runs.

## `includeHtml` (type: `boolean`):

Include cleaned source HTML in each dataset item for audit/debugging. Increases dataset size.

## `includeText` (type: `boolean`):

Include the normalized visible text used for deterministic extraction.

## `maxPages` (type: `integer`):

Maximum number of pricing URLs to analyze.

## `maxPlansPerPage` (type: `integer`):

Maximum number of detected pricing plans to return per page.

## `dryRun` (type: `boolean`):

Return demo pricing snapshots and changes without crawling pages or charging custom pay-per-event events.

## Actor input object example

```json
{
  "pricingUrls": [
    {
      "url": "https://example.com/pricing"
    }
  ],
  "compareToPreviousRun": true,
  "snapshotStoreName": "saas-pricing-intelligence-monitor-snapshots",
  "includeHtml": false,
  "includeText": true,
  "maxPages": 25,
  "maxPlansPerPage": 20,
  "dryRun": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "pricingUrls": [
        {
            "url": "https://example.com/pricing"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("orbiscribe/saas-pricing-intelligence-monitor").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 = { "pricingUrls": [{ "url": "https://example.com/pricing" }] }

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

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

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

```

## CLI example

```bash
echo '{
  "pricingUrls": [
    {
      "url": "https://example.com/pricing"
    }
  ]
}' |
apify call orbiscribe/saas-pricing-intelligence-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=orbiscribe/saas-pricing-intelligence-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SaaS Pricing Intelligence Monitor",
        "description": "Monitor public SaaS pricing pages, extract plans and prices, and emit structured pricing change events for competitive intelligence.",
        "version": "0.1",
        "x-build-id": "t0TT02x5C8eoRzGXy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/orbiscribe~saas-pricing-intelligence-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-orbiscribe-saas-pricing-intelligence-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/orbiscribe~saas-pricing-intelligence-monitor/runs": {
            "post": {
                "operationId": "runs-sync-orbiscribe-saas-pricing-intelligence-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/orbiscribe~saas-pricing-intelligence-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-orbiscribe-saas-pricing-intelligence-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "pricingUrls"
                ],
                "properties": {
                    "pricingUrls": {
                        "title": "Pricing URLs",
                        "type": "array",
                        "description": "Public pricing pages to analyze. Use direct pricing URLs, not login-only dashboards.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "compareToPreviousRun": {
                        "title": "Compare to previous run",
                        "type": "boolean",
                        "description": "Compare each page to the previous snapshot stored in the named key-value store.",
                        "default": true
                    },
                    "snapshotStoreName": {
                        "title": "Snapshot store name",
                        "type": "string",
                        "description": "Named key-value store used to persist pricing snapshots across scheduled runs.",
                        "default": "saas-pricing-intelligence-monitor-snapshots"
                    },
                    "includeHtml": {
                        "title": "Include raw HTML",
                        "type": "boolean",
                        "description": "Include cleaned source HTML in each dataset item for audit/debugging. Increases dataset size.",
                        "default": false
                    },
                    "includeText": {
                        "title": "Include extracted text",
                        "type": "boolean",
                        "description": "Include the normalized visible text used for deterministic extraction.",
                        "default": true
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 1,
                        "maximum": 250,
                        "type": "integer",
                        "description": "Maximum number of pricing URLs to analyze.",
                        "default": 25
                    },
                    "maxPlansPerPage": {
                        "title": "Max plans per page",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of detected pricing plans to return per page.",
                        "default": 20
                    },
                    "dryRun": {
                        "title": "Dry run",
                        "type": "boolean",
                        "description": "Return demo pricing snapshots and changes without crawling pages or charging custom pay-per-event events.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
