📊 Vendor Change Monitor avatar

📊 Vendor Change Monitor

Pricing

from $10.00 / 1,000 results

Go to Apify Store
📊 Vendor Change Monitor

📊 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

太郎 山田

太郎 山田

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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

WhoWhy
DevelopersAutomate recurring data fetches without building custom scrapers
Data teamsPipe structured output into analytics warehouses
Ops teamsMonitor changes via webhook alerts
Product managersTrack competitor/market signals without engineering time

Input

FieldTypeDefaultDescription
vendorsarrayprefilledStarter / free path: begin with exactly 1 vendor and only pricing + terms pages. Advanced path: expand to 2-3 vendors an
requestTimeoutSecondsinteger30HTTP request timeout per monitored pricing, terms, policy, status, or changelog page.
userAgentstringOptional User-Agent header for monitored requests.
maxCharsinteger30000Upper bound for extracted text length per monitored page.
deliverystring"dataset"Starter / free path: use dataset delivery. Advanced path: move to webhook or email once the same vendor digests should r
datasetModestring"changes_only"Use changes_only for the starter baseline and first recurring proof, action_needed for routed buyer alerts, or all for a
webhookUrlstringRequired when delivery is webhook. Best used after the actor proves value with a changed vendor digest.
notifyOnNoChangebooleanfalseAdvanced 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

FieldTypeDescription
metaobject
recurringDigestobject
actionNeededarray
resultsarray
actionNeeded[].vendorIdstring
actionNeeded[].vendorNamestring
actionNeeded[].ownerstring
actionNeeded[].severitystring
actionNeeded[].statusstring
actionNeeded[].reasonstring
actionNeeded[].changedPacksarray
actionNeeded[].recommendedActionsarray
actionNeeded[].executiveSummarystring

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 ApifyClient
client = 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-monitor for 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.

SaaS & Vendor Monitoring cluster — explore related Apify tools:

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.