B2B pricing
Public SaaS and B2B pricing-page change alerts
This Actor fetches public competitor pricing pages from competitors[], snapshots extracted text, and emits source-linked change rows when price/tier copy drifts. Live required field is competitors, not a top-level urls array.
Not authenticated billing portals, CPQ, or invoices. Not PDF contracts. Public web only. Distinct from SaaS Pricing Tracker, which uses targets[] for pricing/terms/features.
from $9.00 / 1,000 Delivered monitoring result row ($0.009 per delivered apify-default-dataset-item). No Actor Start. Unchanged runs that write zero default-dataset rows typically charge $0.00 on current PPE.
Open B2B Pricing Scraper on Apify
B2B Pricing Scraper, not a neighboring Actor
Use this page for this Actor’s job. Use SaaS Pricing Tracker for Pricing/terms diffs; Use Website Content Extractor for One-shot page-to-markdown; Use Shopify Store Scraper for Public Shopify catalogs.
| This Actor | SaaS Pricing Tracker | Website Content Extractor | Shopify Store Scraper | |
|---|---|---|---|---|
| Intent | B2B Pricing Scraper | Pricing/terms diffs | One-shot page-to-markdown | Public Shopify catalogs |
| Primary input | see schema | targets[] | urls | storeUrls |
| What it reads | Public sources listed on the Store page | public SaaS pages | page HTML | Shopify JSON endpoints |
| Primary output | Dataset rows billed per live PPE | SaaS change rows | markdown/text | store/catalog rows |
| Not this job | Not authenticated billing portals, CPQ, or invoices. Not PDF contracts. Public web only. Distinct from SaaS Pricing Tracker, which uses targets[] for pricing/terms/features. | Not B2B competitor pricing packs | Not recurring pricing diffs | Not Shopify App Store reviews |
Store ID: taroyamada/competitive-pricing-monitor. Respect source terms, robots.txt, and rate limits.
Use cases
- Competitor tier/price watches
- Rate-hike text diffs
- Scheduled snapshotKey pricing boards
How is B2B Pricing Scraper different from SaaS Pricing Tracker and Website Content Extractor?
B2B Pricing Scraper (taroyamada/competitive-pricing-monitor): This Actor fetches public competitor pricing pages from competitors[], snapshots extracted text, and emits source-linked change rows when price/tier copy drifts. Live required field is competitors, not a top-level urls array. Not authenticated billing portals, CPQ, or invoices. Not PDF contracts. Public web only. Distinct from SaaS Pricing Tracker, which uses targets[] for pricing/terms/features. SaaS Pricing Tracker is for Pricing/terms diffs (input targets[]; public SaaS pages; SaaS change rows). Not B2B competitor pricing packs. Website Content Extractor is for One-shot page-to-markdown (input urls; page HTML; markdown/text). Not recurring pricing diffs. Shopify Store Scraper is for Public Shopify catalogs (input storeUrls; Shopify JSON endpoints; store/catalog rows). Not Shopify App Store reviews.
What input is required?
Live required fields: competitors. Published exampleRunInput is shown below. Monitor SaaS and ecommerce competitor pricing pages for plan changes, price increases/decreases, new/removed tiers, and packaging shifts
| Field | Type | Default | Notes |
|---|---|---|---|
competitors |
any[] required | empty |
required Competitors to monitor. Each entry is one competitor. Provide pricing page URLs, optional include/exclude patterns, and a stable id. One summary row per competitor is written to the dataset. |
requestTimeoutSeconds |
integer | 30 |
Request timeout (seconds). HTTP request timeout per pricing page fetch. min=5 max=120 |
userAgent |
string | empty |
Custom User-Agent. Optional User-Agent header used for pricing page requests. |
maxChars |
integer | 40000 |
Max extracted chars per page. Upper bound for extracted text per pricing page. Increase for long pricing pages with many plans. min=1000 max=200000 |
delivery |
string enum | dataset |
Delivery mode. dataset: write competitor rows to Apify dataset (recommended for starters). webhook: POST JSON payload to webhookUrl. email: placeholder, not implemented in MVP. enum: dataset, webhook, email |
datasetMode |
string enum | changes_only |
Dataset rows to include. changes_only: only competitors with detected changes. all: all competitors regardless of change status. action_needed: only high-severity changes. enum: action_needed, changes_only, all |
webhookUrl |
string | empty |
Webhook URL. Required when delivery is webhook. |
notifyOnNoChange |
boolean | false |
Notify even if no change. When false, webhook delivery is skipped if no competitors changed. Reduces noise. |
snapshotKey |
string | competitive-pricing-monitor |
Snapshot key (keep stable). Key used to persist pricing snapshots between runs. Keep this stable across runs. First run seeds the baseline; second run detects the first changes. |
summaryMaxLines |
integer | 15 |
Max diff lines per page. Maximum added and removed lines included in change summaries per page. min=5 max=50 |
concurrency |
integer | 3 |
Concurrency. Concurrent page fetches. Keep at 2–3 for respectful crawling. min=1 max=10 |
batchDelayMs |
integer | 500 |
Inter-batch delay (ms). Delay between concurrency batches to reduce rate-limit pressure. min=0 max=10000 |
nowIso |
string | empty |
Override current time (ISO). Optional deterministic timestamp override for testing. |
dryRun |
boolean | false |
Dry run (no snapshot save). Preview competitor pricing pages without persisting snapshots. Leave false when you want the baseline to count. |
Published Store example run input (omitted fields take schema defaults):
{
"competitors": [
{
"id": "hubspot",
"name": "HubSpot",
"tier": "direct",
"tags": [
"crm",
"marketing",
"smb"
],
"pricingPages": [
{
"id": "hubspot-pricing",
"name": "HubSpot Pricing",
"url": "https://www.hubspot.com/pricing",
"includePatterns": [
"starter",
"professional",
"enterprise",
"per month",
"per user",
"\\$",
"pricing",
"free"
],
"excludePatterns": [
"cookie",
"sign in",
"sign up",
"footer",
"nav",
"blog"
]
}
]
},
{
"id": "salesforce",
"name": "Salesforce",
"tier": "direct",
"tags": [
"crm",
"enterprise"
],
"pricingPages": [
{
"id": "salesforce-pricing",
"name": "Salesforce Sales Cloud Pricing",
"url": "https://www.salesforce.com/crm/pricing/",
"includePatterns": [
"essentials",
"professional",
"enterprise",
"unlimited",
"per user",
"\\$",
"annually"
],
"excludePatterns": [
"cookie",
"sign in",
"sign up"
]
}
]
}
],
"requestTimeoutSeconds": 30,
"maxChars": 40000,
"delivery": "dataset",
"datasetMode": "changes_only",
"notifyOnNoChange": false,
"snapshotKey": "competitive-pricing-quickstart",
"summaryMaxLines": 15,
"concurrency": 2,
"batchDelayMs": 800,
"dryRun": false
}
Run B2B Pricing Scraper on Apify
How do dataset, webhook, and dry-run delivery work?
delivery defaults to dataset on the live schema. Dataset output is the billable surface when rows are written. webhookUrl is used when delivery is webhook (and typically not during dryRun). dryRun true validates or samples without the usual dataset/webhook side effects described on the Store schema. datasetMode can limit emits to changes_only / changed_only / action_needed versus all. Unchanged runs that write zero default-dataset rows typically charge $0.00 on current PPE.
What does a result contain?
Published README Output Example / Sample Output JSON. Treat README samples as illustrations, not a live coverage guarantee. There is no published output JSON schema on the Store page.
How is B2B Pricing Scraper priced?
Billing is pay per event. The live Store card is from $9.00 / 1,000 Delivered monitoring result row ($0.009 per delivered apify-default-dataset-item). No Actor Start. Unchanged runs that write zero default-dataset rows typically charge $0.00 on current PPE. Current PPE:
| Event | Price | Emitted when |
|---|---|---|
apify-default-dataset-item (Delivered monitoring result row) |
$0.009 | Charged only when a new or changed monitoring result row is delivered. Unchanged runs are free. |
The published README Cost block is stale versus the live Store pricing tab. README Cost still quotes actor-start $0.01. README Cost quotes dataset-item $0.003; live primary is $0.009 (Delivered monitoring result row). Live: Delivered monitoring result row $0.009. This page quotes live PPE only.
from $9.00 / 1,000 Delivered monitoring result row ($0.009 per delivered apify-default-dataset-item). No Actor Start. Unchanged runs that write zero default-dataset rows typically charge $0.00 on current PPE.
See B2B Pricing Scraper pricing on Apify
Limits to keep in mind
- competitors required
- Public pages only
- maxChars / concurrency caps
- Not invoices or logged-in pricing
- Respect source terms, robots.txt, and rate limits.
Open B2B Pricing Scraper on Apify
Related pages
- SaaS Pricing Tracker — targets[] pricing/terms/features; this Actor uses competitors[].
- Website Content Extractor — One-shot markdown, not recurring price diffs.
- Shopify Store Scraper — Shopify JSON catalogs, not HTML price pages.
- Ad Landing Page Offer Intelligence — CRO gap reports from URLs you paste.
- Ads Library Competitive Intelligence — direct-source ad-library pages.
- SaaS Pricing Competitor Monitor — price-page snapshots.
- Shopify Public Catalog Map & Promo Watch — storefront catalog and promo diffs.
- SaaS Pricing Changelog Battlecard Watch — pricing and changelog diffs.
- AI API Pricing & Model Lifecycle Report — official LLM API prices.
- Tools