# Pricing Detector (`brave_zygantrum/pricing-radar`) Actor

Detect SaaS Pricing Pages & Extract Prices without LLM

- **URL**: https://apify.com/brave\_zygantrum/pricing-radar.md
- **Developed by:** [Etan gentil](https://apify.com/brave_zygantrum) (community)
- **Categories:** E-commerce
- **Stats:** 4 total users, 1 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $10.00 / 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/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

## Pricing Radar — SaaS Pricing Page Detector & Extractor

Automatically detects pricing pages on any website and extracts structured plan data (name, price, features, billing interval) using an LLM of your choice. Built for sales intelligence workflows and CRM enrichment at scale.

**Just give it a domain — it finds the pricing page, crawls it, and returns clean JSON.**

***

### Features

- **Automatic Pricing Page Discovery**: You don't need to know the pricing URL. Provide any root domain (e.g. `notion.so`) and the actor navigates the site, finds the pricing page via sitemap, URL hints, and browser crawl — automatically.
- **Structured Plan Extraction (LLM-powered)**: Extracts plan names, prices, billing intervals, features lists, and CTA text into clean, normalized JSON. No regex guessing.
- **4 LLM Providers Supported**: Use your own API key with **Groq** (free tier, fast), **Google Gemini**, **Anthropic Claude**, or **OpenAI GPT-4o-mini**. You control the cost.
- **Free Tier & Toggle Detection**: Detects whether a free plan exists, whether pricing requires contacting sales, and whether a monthly/annual billing toggle is present.
- **Anti-Bot Evasion**: Uses Playwright with stealth fingerprinting to handle bot-protected sites.
- **Confidence Scoring**: Every plan and every run includes a confidence score so you can filter low-quality results in your workflows.

***

### Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `url` | String | **Yes** | — | Website URL or domain to analyze (e.g. `https://notion.so`) |
| `llmApiKey` | String | **Yes** | — | API key for the LLM provider you selected |
| `llmProvider` | String | No | `groq` | `groq`, `google`, `anthropic`, or `openai` |
| `maxPages` | Integer | No | `5` | Max pages to crawl (1–10) |
| `timeoutSeconds` | Integer | No | `45` | Max execution time in seconds (10–120) |

#### Example Input (Groq — free & fast)

```json
{
  "url": "https://notion.so/",
  "llmProvider": "groq",
  "llmApiKey": "gsk_your_groq_key_here"
}
```

#### Example Input (Anthropic Claude Haiku)

```json
{
  "url": "https://linear.app/",
  "llmProvider": "anthropic",
  "llmApiKey": "sk-ant-your_key_here"
}
```

#### Which LLM Provider to Choose?

| Provider | Model Used | Speed | Cost | Best For |
|---|---|---|---|---|
| **Groq** | llama-3.3-70b-versatile | Very fast | Free tier available | High-volume enrichment |
| **Google** | Gemini 2.0 Flash | Fast | Very cheap | Scale at low cost |
| **Anthropic** | Claude Haiku 4.5 | Fast | Low | Best accuracy |
| **OpenAI** | GPT-4o-mini | Fast | Low | Good accuracy |

***

### Output

```json
{
  "domain": "notion.so",
  "has_pricing_page": true,
  "pricing_urls": ["https://www.notion.so/pricing"],
  "has_free_tier": true,
  "need_contact_for_price": false,
  "has_monthly_annual_toggle": true,
  "plans": [
    {
      "name": "Free",
      "price_text": "$0",
      "price_value": 0,
      "currency": "USD",
      "interval": "none",
      "price_type": "free",
      "cta_text": "Get started",
      "features": ["Unlimited pages", "1 week version history", "5 MB file uploads"],
      "confidence": 0.95
    },
    {
      "name": "Plus",
      "price_text": "$10",
      "price_value": 10,
      "currency": "USD",
      "interval": "month",
      "price_type": "fixed",
      "cta_text": "Try free for 30 days",
      "features": ["Unlimited blocks", "Unlimited file uploads", "30 day version history"],
      "confidence": 0.93
    }
  ],
  "confidence": 0.91,
  "scraping_status": {
    "phase_completed": "browser_scan",
    "pages_visited": 2,
    "time_elapsed_ms": 7800,
    "error": null,
    "blocked": false
  }
}
```

#### Output Fields

| Field | Type | Description |
|---|---|---|
| `domain` | String | Root domain analyzed |
| `has_pricing_page` | Boolean | Whether a pricing page was found |
| `pricing_urls` | String\[] | All discovered pricing URLs |
| `has_free_tier` | Boolean | At least one free plan detected |
| `need_contact_for_price` | Boolean | At least one plan requires contacting sales |
| `has_monthly_annual_toggle` | Boolean | Monthly/annual billing toggle detected |
| `plans` | Array or null | Extracted plans (null if no pricing page or LLM fails) |
| `confidence` | Number | Global confidence score (0.0 – 1.0) |
| `scraping_status` | Object | Crawl metadata: phase, pages visited, timing, errors |

#### Plan Fields

| Field | Type | Values |
|---|---|---|
| `name` | String | Plan name as displayed on the page |
| `price_text` | String | Exact price text as shown (e.g. "$29/mo") |
| `price_value` | Number or null | Numeric price value |
| `currency` | String or null | ISO currency code (USD, EUR, GBP…) |
| `interval` | String | `month` · `year` · `one_time` · `none` · `unknown` |
| `price_type` | String | `free` · `fixed` · `starting_from` · `contact_sales` · `custom` · `unknown` |
| `cta_text` | String or null | Button/CTA text for this plan |
| `features` | String\[] | Features listed under this plan |
| `confidence` | Number | Per-plan confidence score (0.0 – 1.0) |

***

### Use Cases (Clay / CRM Enrichment)

Map the output directly to your Clay tables:

- **Lead scoring**: Prioritize prospects where `has_pricing_page: true` and `has_free_tier: false` (they monetize directly).
- **Sales personalization**: Reference specific plan names and price points in your outreach copy.
- **Market research**: Track whether competitors have added/removed free tiers or changed pricing models.
- **ICP filtering**: Filter by `need_contact_for_price: true` to identify enterprise-only companies.
- **Competitive intelligence**: Run on a list of 1,000 domains and get structured pricing data in minutes.

Combine with the **Checkout Detector** actor to get a complete picture of a company's monetization strategy: does it sell online? what's the pricing model?

***

### Tips

- **Empty `plans` array?** The site's pricing page may be behind a login wall or heavily bot-protected. Try increasing `timeoutSeconds` to `90`.
- **`has_pricing_page: false`?** The site may use non-standard URLs. The actor checks sitemaps and common paths — if the pricing page is deeply nested, it may not be found within `maxPages`.
- **Groq is free**: Get a free API key at [console.groq.com](https://console.groq.com) — no credit card required. Ideal for high-volume Clay workflows.

# Actor input Schema

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

The website URL to analyze for pricing information.

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

Maximum number of pages to crawl.

## `timeoutSeconds` (type: `integer`):

Maximum time for the entire crawl.

## `llmProvider` (type: `string`):

Which LLM provider to use for pricing extraction.

## `llmApiKey` (type: `string`):

API key for the selected LLM provider. Required for plan extraction.

## Actor input object example

```json
{
  "url": "https://example.com/",
  "maxPages": 5,
  "timeoutSeconds": 45,
  "llmProvider": "groq"
}
```

# 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://example.com/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("brave_zygantrum/pricing-radar").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://example.com/" }

# Run the Actor and wait for it to finish
run = client.actor("brave_zygantrum/pricing-radar").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 '{
  "url": "https://example.com/"
}' |
apify call brave_zygantrum/pricing-radar --silent --output-dataset

```

## MCP server setup

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

```

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/4fyiS8uIPMukOW3QM/builds/99zVcnAnVpPPnLtsf/openapi.json
