📊 Vendor Change Monitor
Pricing
from $10.00 / 1,000 results
📊 Vendor Change Monitor
Track SaaS vendor pricing, terms of service, and renewal language. Extract web data to schedule procurement alerts and integrate results.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
太郎 山田
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Vendor Pricing, Terms & Renewal Watch API
Monitor vendor pricing changes, terms-of-service updates, renewal language, privacy / DPA policy diffs, and procurement / vendor-risk alerts with one summary-first vendor digest per monitored vendor.
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.