# SaaS Pricing Intelligence Analyst (`eltropa/legion-002-pricing-intelligence`) Actor

Compare SaaS pricing pages and generate deterministic competitive pricing reports.

- **URL**: https://apify.com/eltropa/legion-002-pricing-intelligence.md
- **Developed by:** [Geovanis Lopez](https://apify.com/eltropa) (community)
- **Categories:** AI, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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 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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Analyst

Automatic SaaS Pricing Intelligence Analyst for Apify.

Compare one SaaS pricing page with up to 10 competitors, normalize compatible plans, and generate deterministic executive insights about price position, free plans, free trials, sales-assisted models, and data reliability.

This Actor is designed for manual review and pricing research workflows. It does not use an LLM, does not build a custom dashboard, and does not promise perfect coverage on every website. It returns a structured JSON report that is easy to inspect in Apify Console or via the API.

### What it does

The Actor receives a company pricing URL and one or more competitor pricing URLs. It fetches each page, extracts pricing evidence, normalizes compatible plans, and produces a comparison only when the cohort is materially comparable.

When the data is sufficient, the Actor returns a `comparison_ready` result with executive insights and a consultant-style report. When pages are partially missing, blocked, or structurally incompatible, the Actor still returns the best useful result it can and explains the limits through warnings.

### Input

Required fields:

- `companyUrl`: SaaS pricing page to analyze.
- `competitorUrls`: 1 to 10 competitor pricing page URLs.

Optional fields:

- `currency`: free text hint such as `EUR` or `USD`.
- `language`: `en` or `es`, default `en`.

Example:

```json
{
  "companyUrl": "https://www.notion.com/pricing",
  "competitorUrls": [
    "https://slack.com/pricing",
    "https://www.monday.com/pricing",
    "https://www.rydoo.com/pricing"
  ],
  "language": "en"
}
````

### Output

The dataset item includes these top-level blocks:

- `status`
- `executionSummary`
- `company`
- `competitors`
- `marketSummary`
- `priceComparison`
- `insights`
- `warnings`
- `report`
- `generatedAt`

Example:

```json
{
  "status": "comparison_ready",
  "executionSummary": {
    "requestedCompanies": 4,
    "successfulCompanies": 4,
    "failedCompanies": 0,
    "successRate": 1
  },
  "priceComparison": {
    "currency": "EUR",
    "companyEntryPrice": 11.5,
    "competitorMedian": 7.38,
    "companyMarketPosition": "above_market"
  },
  "insights": [
    {
      "id": "price_above_market",
      "severity": "medium",
      "category": "pricing"
    }
  ]
}
```

### How prices are compared

The Actor only compares plans that match on:

- currency;
- billing period;
- pricing unit.

Unknown values are treated carefully. If the cohort is too small or too inconsistent, the Actor leaves the pricing benchmark unresolved instead of inventing a result.

### Reliability and warnings

Typical warnings include:

- pages that redirect;
- pages without public pricing;
- mixed currencies;
- incompatible billing periods;
- incompatible pricing units;
- partially blocked or incomplete pages.

Those warnings are part of the product output and should be reviewed before using the result in decision-making.

### Languages

The Actor supports:

- English (`en`)
- Spanish (`es`)

Templates are stored separately for each language and are not machine-translated on the fly.

### Local run

```bash
npm install
npm run build
$env:CRAWLEE_STORAGE_DIR="$PWD\.storage"
$env:APIFY_INPUT='{"companyUrl":"https://www.notion.com/pricing","competitorUrls":["https://slack.com/pricing","https://www.monday.com/pricing","https://www.rydoo.com/pricing"],"language":"en"}'
npm start
```

### Testing

```bash
npm test
```

### Cost and performance

Cost depends on the number of URLs, the complexity of the pages, and whether pages are slow, blocked, or highly dynamic.

In local validation, a four-page run completed in a few seconds without browser rendering. Real Apify usage will vary with network conditions and page structure, so pricing should leave room for that variability.

### Integrations

The Actor works with standard Apify Console workflows, API usage, and downstream automations that consume dataset output.

### Limitations

- It does not scrape every website perfectly.
- It does not use a browser renderer or an LLM.
- It can return `insufficient_data` when pages are not comparable enough.
- It should not be treated as a guarantee of market completeness.
- It is intended for pricing intelligence workflows, not generic website scraping.

# Actor input Schema

## `companyUrl` (type: `string`):

SaaS pricing page to analyze.

## `competitorUrls` (type: `array`):

1 to 10 competitor pricing page URLs. More pages usually improve confidence, but they also increase runtime and cost.

## `currency` (type: `string`):

Optional currency hint such as EUR or USD.

## `language` (type: `string`):

Language of the executive report.

## Actor input object example

```json
{
  "companyUrl": "https://example.com/pricing",
  "currency": "USD",
  "language": "en"
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("eltropa/legion-002-pricing-intelligence").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("eltropa/legion-002-pricing-intelligence").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 '{}' |
apify call eltropa/legion-002-pricing-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SaaS Pricing Intelligence Analyst",
        "description": "Compare SaaS pricing pages and generate deterministic competitive pricing reports.",
        "version": "0.1",
        "x-build-id": "A34ARJjoYbYuLNPL5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/eltropa~legion-002-pricing-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-eltropa-legion-002-pricing-intelligence",
                "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/eltropa~legion-002-pricing-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-eltropa-legion-002-pricing-intelligence",
                "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/eltropa~legion-002-pricing-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-eltropa-legion-002-pricing-intelligence",
                "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": [
                    "companyUrl",
                    "competitorUrls"
                ],
                "properties": {
                    "companyUrl": {
                        "title": "Company pricing page",
                        "type": "string",
                        "description": "SaaS pricing page to analyze."
                    },
                    "competitorUrls": {
                        "title": "Competitor pricing pages",
                        "minItems": 1,
                        "maxItems": 10,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "1 to 10 competitor pricing page URLs. More pages usually improve confidence, but they also increase runtime and cost.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "Optional currency hint such as EUR or USD."
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "es"
                        ],
                        "type": "string",
                        "description": "Language of the executive report.",
                        "default": "en"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
