📉 SaaS Vendor Pricing Monitor
Pricing
from $10.00 / 1,000 results
📉 SaaS Vendor Pricing Monitor
Track hidden subscription cost hikes and plan changes across your software stack. Extract exact previous vs current prices for contract renewal leverage.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
太郎 山田
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Vendor Pricing, Terms & Renewal Watch API
Procurement and operations teams use this web scraper to systematically track SaaS vendor pricing and detect hidden changes to subscription plans. Software costs can spiral out of control when vendors silently increase prices or alter the features included in their tiers. By using a headless browser to crawl target URLs, this tool fetches current pricing structures and compares them against previous runs to expose exact cost hikes. You can schedule the tracker to run on an automated calendar, extracting vital details like previous_price, current_price, and last_updated_date. The scraped data gives your finance department the exact leverage they need before a contract renewal negotiation. Stop relying on manual website checks or waiting for an unexpected invoice email to realize a vendor has changed their terms. Automatically capture persistent snapshots of vendor pages and integrate the structured web data directly into your spend management dashboards. Whether you are monitoring core enterprise platforms, tracking cloud service providers, or scraping hundreds of smaller subscription websites, this automated browser tool delivers clean, structured cost insights. Set up alerts to notify your team the moment a vendor modifies their public pricing, ensuring your procurement specialists are never caught off guard during an upcoming software renewal.
Store Quickstart
What first success looks like:
Key Features
- 📡 SaaS change detection — Diff pricing, terms, and feature pages across vendor sites
- 🕐 Scheduled snapshots — Persistent snapshots enable delta alerts between runs
- 🎯 Multi-vendor tracking — Monitor dozens of vendors per run for procurement intelligence
- 📊 Diff visualization — Structured before/after payloads for downstream diffing UIs
- 📡 Alert delivery — Webhook push to procurement/legal teams on material changes
Use Cases
| Who | Why |
|---|---|
| Developers | Automate recurring data fetches without building custom scrapers |
| Data teams | Pipe structured output into analytics warehouses |
| Ops teams | Monitor changes via webhook alerts |
| Product managers | Track competitor/market signals without engineering time |
Input
| Field | Type | Default | Description |
|---|---|---|---|
| vendors | array | prefilled | Starter / free path: begin with exactly 1 vendor and only pricing + terms pages. Advanced path: expand to 2-3 vendors an |
| requestTimeoutSeconds | integer | 30 | HTTP request timeout per monitored pricing, terms, policy, status, or changelog page. |
| userAgent | string | — | Optional User-Agent header for monitored requests. |
| maxChars | integer | 30000 | Upper bound for extracted text length per monitored page. |
| delivery | string | "dataset" | Starter / free path: use dataset delivery. Advanced path: move to webhook or email once the same vendor digests should r |
| datasetMode | string | "changes_only" | Use changes_only for the starter baseline and first recurring proof, action_needed for routed buyer alerts, or all for a |
| webhookUrl | string | — | Required when delivery is webhook. Best used after the actor proves value with a changed vendor digest. |
| notifyOnNoChange | boolean | false | Advanced delivery noise control. When false, webhook delivery skips when there are no changed vendor digests and no acti |
Input Example
{"vendors": [{"id": "openai","name": "OpenAI","criticality": "high","owner": "Procurement","tags": ["ai", "renewal-q2", "usage-based"],"urlPacks": {"pricing": [{"id": "openai-pricing","url": "https://openai.com/api/pricing/","includePatterns": ["pricing", "tokens", "billing", "enterprise", "annual"]}],"terms": [{"id": "openai-business-terms","url": "https://openai.com/policies/business-terms/","includePatterns": ["payment", "renewal", "termination", "liability", "service credits"]}],"security": [{"id": "openai-security","url": "https://trust.openai.com/","includePatterns": ["security", "compliance", "controls", "incident"]}],"status": [{"id": "openai-status","url": "https://status.openai.com/","includePatterns": ["incident", "degraded", "maintenance", "operational"]}]}}],"delivery": "dataset","datasetMode": "action_needed","snapshotKey": "vendor-renewal-watch","diffMode": "line_summary","summaryMaxLines": 12,"concurrency": 2}
Output
| Field | Type | Description |
|---|---|---|
meta | object | |
recurringDigest | object | |
actionNeeded | array | |
results | array | |
actionNeeded[].vendorId | string | |
actionNeeded[].vendorName | string | |
actionNeeded[].owner | string | |
actionNeeded[].severity | string | |
actionNeeded[].status | string | |
actionNeeded[].reason | string | |
actionNeeded[].changedPacks | array | |
actionNeeded[].recommendedActions | array | |
actionNeeded[].executiveSummary | string |
Output Example
{"vendorId": "openai","vendorName": "OpenAI","owner": "Procurement","status": "changed","severity": "high","reason": "OpenAI showed material drift on pricing, terms-of-service, trust-center / security surfaces for a high vendor.","recommendedActions": ["Compare the pricing or packaging diff against renewal assumptions, budget, forecast / CPQ models, and competitor benchmarks.","Review terms-of-service, renewal, billing, liability, or termination language with Procurement before the next commercial decision."],"vendorSummary": {"changedPacks": ["pricing", "terms"],"actionNeeded": true}}
API Usage
Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.
cURL
curl -X POST "https://api.apify.com/v2/acts/taroyamada~vendor-change-monitor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{ "vendors": [ { "id": "openai", "name": "OpenAI", "criticality": "high", "owner": "Procurement", "tags": ["ai", "renewal-q2", "usage-based"], "urlPacks": { "pricing": [ { "id": "openai-pricing", "url": "https://openai.com/api/pricing/", "includePatterns": ["pricing", "tokens", "billing", "enterprise", "annual"] } ], "terms": [ { "id": "openai-business-terms", "url": "https://openai.com/policies/business-terms/", "includePatterns": ["payment", "renewal", "termination", "liability", "service credits"] } ], "security": [ { "id": "openai-security", "url": "https://trust.openai.com/", "includePatterns": ["security", "compliance", "controls", "incident"] } ], "status": [ { "id": "openai-status", "url": "https://status.openai.com/", "includePatterns": ["incident", "degraded", "maintenance", "operational"] } ] } } ], "delivery": "dataset", "datasetMode": "action_needed", "snapshotKey": "vendor-renewal-watch", "diffMode": "line_summary", "summaryMaxLines": 12, "concurrency": 2 }'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("taroyamada/vendor-change-monitor").call(run_input={"vendors": [{"id": "openai","name": "OpenAI","criticality": "high","owner": "Procurement","tags": ["ai", "renewal-q2", "usage-based"],"urlPacks": {"pricing": [{"id": "openai-pricing","url": "https://openai.com/api/pricing/","includePatterns": ["pricing", "tokens", "billing", "enterprise", "annual"]}],"terms": [{"id": "openai-business-terms","url": "https://openai.com/policies/business-terms/","includePatterns": ["payment", "renewal", "termination", "liability", "service credits"]}],"security": [{"id": "openai-security","url": "https://trust.openai.com/","includePatterns": ["security", "compliance", "controls", "incident"]}],"status": [{"id": "openai-status","url": "https://status.openai.com/","includePatterns": ["incident", "degraded", "maintenance", "operational"]}]}}],"delivery": "dataset","datasetMode": "action_needed","snapshotKey": "vendor-renewal-watch","diffMode": "line_summary","summaryMaxLines": 12,"concurrency": 2})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('taroyamada/vendor-change-monitor').call({"vendors": [{"id": "openai","name": "OpenAI","criticality": "high","owner": "Procurement","tags": ["ai", "renewal-q2", "usage-based"],"urlPacks": {"pricing": [{"id": "openai-pricing","url": "https://openai.com/api/pricing/","includePatterns": ["pricing", "tokens", "billing", "enterprise", "annual"]}],"terms": [{"id": "openai-business-terms","url": "https://openai.com/policies/business-terms/","includePatterns": ["payment", "renewal", "termination", "liability", "service credits"]}],"security": [{"id": "openai-security","url": "https://trust.openai.com/","includePatterns": ["security", "compliance", "controls", "incident"]}],"status": [{"id": "openai-status","url": "https://status.openai.com/","includePatterns": ["incident", "degraded", "maintenance", "operational"]}]}}],"delivery": "dataset","datasetMode": "action_needed","snapshotKey": "vendor-renewal-watch","diffMode": "line_summary","summaryMaxLines": 12,"concurrency": 2});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Tips & Limitations
- Schedule weekly runs for procurement watchlists; daily for critical vendors.
- Use webhook delivery to drop diffs into a shared procurement Slack channel.
- Track competitor pricing quarterly to inform your own pricing strategy.
- Store snapshots persistently — these are valuable for contract renegotiation evidence.
- Combine with
vendor-change-monitorfor term-level changes alongside pricing.
FAQ
How are diffs computed?
Semantic diff on structured fields (prices, plan names, feature tables) rather than raw HTML — filters out cosmetic changes.
What happens if a vendor redesigns their site?
The actor falls back to best-effort structured extraction; material redesigns may require a vendor-specific adapter update.
Can I track changes to downloadable contracts/PDFs?
The actor tracks content text; PDF-only vendors with dynamic URLs may require manual review.
Does this bypass anti-bot measures?
No — it uses standard requests. Some vendors with aggressive bot protection may not be monitorable; report these issues and we'll adjust fetch strategy.
Can I monitor internal portals?
No — this actor is public-web only. Internal portals with auth are out of scope.
Related Actors
SaaS & Vendor Monitoring cluster — explore related Apify tools:
- SaaS Pricing & Terms Monitor API — Monitor pricing, terms, and feature pages with machine-readable diffs, snapshot history, and dataset/webhook delivery.
- SaaS / Company Site Change Monitor Pro — Premium monitor for pricing, terms, and feature page diffs with dataset/webhook delivery.
- Vendor Status Page & Incident Digest Monitor — Monitor public vendor status pages and incident feeds.
Cost
Pay Per Event:
actor-start: $0.01 (flat fee per run)dataset-item: $0.003 per output item
Example: 1,000 items = $0.01 + (1,000 × $0.003) = $3.01
No subscription required — you only pay for what you use.
⭐ Was this helpful?
If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.
Bug report or feature request? Open an issue on the Issues tab of this actor.