# SaaS Pricing Intelligence Extractor (`timely_quarterstaff/saas-pricing-extractor`) Actor

Deterministic, SSRF-guarded extraction of SaaS pricing tiers from any public pricing-page URL. Returns structured plans (name, price, billing period, features) plus all detected price strings. Pure code, no AI and no paid API by default. Optional AI enrichment with your own key.

- **URL**: https://apify.com/timely\_quarterstaff/saas-pricing-extractor.md
- **Developed by:** [Ahmed Moussa](https://apify.com/timely_quarterstaff) (community)
- **Categories:** Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Extractor

Deterministic extraction of **SaaS pricing tiers** from any public pricing-page URL.

### What it does

Give it a pricing page; it returns structured plans — plan name, price, billing
period and feature bullets — plus every price string detected on the page.

### Why it is safe & cheap

- **Pure code, no AI by default.** Pricing is parsed with deterministic regex +
  structural HTML heuristics. No LLM and no paid API are called on a normal run,
  so there is **$0 idle cost and $0 uncovered per-run cost** beyond Apify compute.
- **SSRF-guarded.** Reuses OMEGA's proven DataPulse fetch core: private /
  loopback / link-local / reserved IPs are blocked (fail-closed), a domain
  blocklist is enforced, and every redirect hop is re-validated.
- **Bounded.** Hard caps on connect/read timeouts, response size (2 MB) and
  redirect count — it never hangs.

### Input

```json
{
  "url": "https://www.example.com/pricing",
  "urls": ["https://other.com/pricing"],
  "llm_api_key": "<optional: YOUR OpenRouter key>",
  "llm_model": "deepseek/deepseek-chat"
}
````

`url` / `urls` are public pricing-page URLs. `llm_api_key` is **optional** and,
if supplied, enables AI enrichment **using your own key** — the actor never uses
any built-in AI key.

### Output (one dataset item per URL)

```json
{
  "url": "https://www.example.com/pricing",
  "status": "completed",
  "plans": [
    {"name": "Starter", "price": "$19", "period": "month", "features": ["10 projects", "Email support"]},
    {"name": "Pro", "price": "$49", "period": "month", "features": ["Unlimited projects", "Priority support"]}
  ],
  "raw_prices": ["$19", "$49", "Custom"],
  "parse_confidence": "high",
  "method": "deterministic_code",
  "extracted_at": "2026-06-23T00:00:00+00:00"
}
```

`status` is `completed`, `blocked` (security gate / SSRF / blocklist / auth-walled)
or `failed`. `parse_confidence` is a code-owned heuristic (`high` ≥2 plans,
`low` 1 plan, `none` 0). When you supply your own key an extra `llm_plans` field
is added; the deterministic `plans` always stand on their own.

### Use cases

- Competitive pricing monitoring — track competitor plans and price changes.
- Build a pricing-intelligence dataset across many SaaS vendors.
- Normalize messy pricing pages into structured plans for analysis or dashboards.

### How it works (deterministic, code-only)

The page is fetched through the SSRF-guarded DataPulse core, then plan cards,
price strings and feature bullets are extracted with deterministic regex +
structural HTML heuristics. A code-owned `parse_confidence` reflects how many
clean plans were found. AI enrichment is optional and only runs with your key.

### Limitations (honest)

Pricing pages that render entirely client-side (heavy JS, no server-side HTML)
may expose fewer tiers; the actor still returns all detected `raw_prices` and an
honest low/none confidence rather than fabricating plans.

# Actor input Schema

## `url` (type: `string`):

A single public SaaS pricing-page URL to extract pricing tiers from.

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

Optional list of additional pricing-page URLs (processed in addition to 'url').

## `llm_api_key` (type: `string`):

Optional. Enables AI enrichment of the deterministic pricing parse using YOUR OpenRouter key. If empty, a fully deterministic code-only extraction is returned (no AI, no paid API).

## `llm_model` (type: `string`):

OpenRouter model id for optional AI enrichment.

## Actor input object example

```json
{
  "url": "https://www.notion.so/pricing",
  "llm_model": "deepseek/deepseek-chat"
}
```

# 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 = {
    "url": "https://www.notion.so/pricing"
};

// Run the Actor and wait for it to finish
const run = await client.actor("timely_quarterstaff/saas-pricing-extractor").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 = { "url": "https://www.notion.so/pricing" }

# Run the Actor and wait for it to finish
run = client.actor("timely_quarterstaff/saas-pricing-extractor").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 '{
  "url": "https://www.notion.so/pricing"
}' |
apify call timely_quarterstaff/saas-pricing-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SaaS Pricing Intelligence Extractor",
        "description": "Deterministic, SSRF-guarded extraction of SaaS pricing tiers from any public pricing-page URL. Returns structured plans (name, price, billing period, features) plus all detected price strings. Pure code, no AI and no paid API by default. Optional AI enrichment with your own key.",
        "version": "0.1",
        "x-build-id": "emeZUsvLUstWITUzz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/timely_quarterstaff~saas-pricing-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-timely_quarterstaff-saas-pricing-extractor",
                "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/timely_quarterstaff~saas-pricing-extractor/runs": {
            "post": {
                "operationId": "runs-sync-timely_quarterstaff-saas-pricing-extractor",
                "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/timely_quarterstaff~saas-pricing-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-timely_quarterstaff-saas-pricing-extractor",
                "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",
                "properties": {
                    "url": {
                        "title": "Pricing page URL",
                        "type": "string",
                        "description": "A single public SaaS pricing-page URL to extract pricing tiers from."
                    },
                    "urls": {
                        "title": "Pricing page URLs (batch)",
                        "type": "array",
                        "description": "Optional list of additional pricing-page URLs (processed in addition to 'url').",
                        "items": {
                            "type": "string"
                        }
                    },
                    "llm_api_key": {
                        "title": "OpenRouter API key (optional, your own key)",
                        "type": "string",
                        "description": "Optional. Enables AI enrichment of the deterministic pricing parse using YOUR OpenRouter key. If empty, a fully deterministic code-only extraction is returned (no AI, no paid API)."
                    },
                    "llm_model": {
                        "title": "LLM model (optional)",
                        "type": "string",
                        "description": "OpenRouter model id for optional AI enrichment.",
                        "default": "deepseek/deepseek-chat"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
