SaaS Pricing Scraper avatar

SaaS Pricing Scraper

Pricing

Pay per usage

Go to Apify Store
SaaS Pricing Scraper

SaaS Pricing Scraper

Extract structured pricing data from any SaaS website. Get tiers, features, billing options as clean JSON. AI-powered.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

DataHQ

DataHQ

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

1

Monthly active users

15 days ago

Last modified

Categories

Share

Multi-source SaaS pricing intelligence. Extract pricing tiers, features, and competitor data from any SaaS product in seconds.


⚡ Quick Start

{
"query": "Notion",
"useLLM": true,
"llmProvider": "openai",
"openaiApiKey": "sk-..."
}

Or with a direct URL:

{
"url": "https://www.notion.so/pricing",
"useLLM": true,
"llmProvider": "anthropic",
"claudeApiKey": "sk-ant-..."
}

🔄 How It Works

  1. Discovery → Find pricing page via search or direct URL
  2. Scrape → Playwright captures page, clicks billing toggles automatically
  3. Extract → LLM or DOM selectors parse pricing tiers
  4. Enrich → Calculate confidence score, detect pricing model

🚀 Key Features

  • Universal Scraping: Works on most SaaS pricing pages (Notion, Slack, HubSpot, Vercel, etc.)
  • Smart Interactions: Auto-detects and clicks "Annual/Monthly" toggles to capture discount pricing
  • LLM Extraction: Uses GPT-5.2 or Claude 4.5 Sonnet for accurate parsing of complex pricing tables
  • BYOK: Bring your own OpenAI or Anthropic API key
  • Structured Output: Clean JSON with tiers, features, billing options, pricing model detection

💰 Pricing

Free to use. You only pay:

  • Apify platform costs (~$0.01-0.05 per run)
  • Your own LLM API costs if enabled (~$0.01-0.03 per run)

🎯 Use Cases

  • Founders: Benchmark pricing against competitors before launch
  • Sales Teams: Get competitor pricing during deal negotiations
  • VCs & Analysts: Track SaaS pricing trends across sectors
  • Procurement: Verify you're getting the best deal

⚙️ Input Parameters

FieldTypeRequiredDescription
querystringYes*Product name (e.g., "Notion", "Slack")
urlstringYes*Direct pricing page URL
useLLMbooleanNoEnable AI extraction. Default: true
llmProviderstringNoopenai or anthropic
llmModelstringNoOverride model. Defaults: gpt-5.2, claude-4-5-sonnet-latest
openaiApiKeystringNoYour OpenAI key
claudeApiKeystringNoYour Anthropic key

*Either query or url required


📊 Output Example

{
"product": {
"name": "Notion",
"website": "https://www.notion.so/pricing"
},
"pricing": {
"model": "seat-based",
"has_free_tier": true,
"currency": "USD",
"billing_options": ["monthly", "annual"],
"tiers": [
{
"name": "Free",
"price_monthly": 0,
"price_annual": 0,
"price_unit": "per member",
"features": ["Collaborative workspace", "Basic page analytics"]
},
{
"name": "Plus",
"price_monthly": 10,
"price_annual": 8,
"price_unit": "per member",
"features": ["Unlimited blocks", "Unlimited file uploads", "30-day page history"]
},
{
"name": "Business",
"price_monthly": 18,
"price_annual": 15,
"price_unit": "per member",
"features": ["SAML SSO", "Advanced analytics", "90-day page history"]
}
]
},
"metadata": {
"extraction_status": "success",
"extraction_method": "llm-openai",
"confidence_score": 0.95,
"tiers_found": 4
}
}

📈 Confidence Scores

ScoreMeaning
0.9+High confidence, LLM validated
0.7-0.9Good, DOM extraction worked
0.3-0.7Partial data, some tiers may be missing
<0.3Low confidence, enable LLM for better results

⚠️ Limitations

  • Enterprise pricing (Salesforce, SAP, Oracle) often requires login
  • Usage-based pricing shows estimates only
  • Some sites block automated browsers
  • Results cached 24 hours to reduce costs
  • No LLM fallback returns empty tiers if selectors fail

🔗 API Integration

Run programmatically via Apify API:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('datahq/saas-pricing-radar').call({
query: 'Notion',
useLLM: true,
llmProvider: 'openai',
openaiApiKey: process.env.OPENAI_API_KEY
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

📬 Feedback

Found a bug or have a feature request? Use the Issues tab or leave a review.