# Vendor Terms Monitor (`junipr/vendor-terms-monitor`) Actor

Monitor vendor terms, legal pages, subprocessors, SLAs, security, privacy, and data-retention changes from supplied previous/current snapshots.

- **URL**: https://apify.com/junipr/vendor-terms-monitor.md
- **Developed by:** [junipr](https://apify.com/junipr) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.80 / 1,000 target checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Vendor Terms Monitor

<!-- FIXED_INCLUSIVE_PPE_20260707_START -->
### Store Positioning

**Store title:** Vendor Terms Monitor

**Short description:** Monitor vendor terms, legal pages, subprocessors, SLAs, security, privacy, and data-retention changes from supplied previous/current snapshots.

**SEO title:** Vendor Terms Monitor — premium B2B monitoring and intelligence workflow

**SEO description:** Monitor vendor terms, legal pages, subprocessors, SLAs, security, privacy, and data-retention changes from supplied previous/current snapshots. Use it for high-value B2B workflows where trustworthy evidence, prioritization, and executive reporting matter.

**Categories:** SEO_TOOLS, AUTOMATION

**Keywords:** vendor, terms, monitor, data qa, change monitor, security headers, high-ticket specialized b2b workflow

### Fixed-Inclusive PPE Pricing

This actor uses pay-per-event pricing. Event prices include Apify platform usage; users are not expected to pay a separate platform-usage pass-through charge for the configured pricing model.

- Tier: P1 — High-ticket specialized B2B workflow
- Primary event: `target-checked` at $0.00980 base
- Default max charge: $50.00
- Store discounts: FREE/BRONZE base, SILVER discounted, GOLD deepest approved discount

Event set:

- `actor-start`: base $0.05000, GOLD $0.04400. Vendor Terms Monitor: charged when actor start is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `target-checked`: base $0.00980, GOLD $0.00862. Vendor Terms Monitor: charged when target checked is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `high-value-event-detected`: base $0.01950, GOLD $0.01720. Vendor Terms Monitor: charged when high value event detected is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `executive-report-generated`: base $0.50000, GOLD $0.44000. Vendor Terms Monitor: charged when executive report generated is completed. The price includes Apify platform usage; no separate usage pass-through is intended.

### Public Task Concepts

- Compare previous and current Vendor Terms snapshots
- Monitor Vendor Terms changes for a capped watchlist
- Build a Vendor Terms change digest from supplied evidence
- Prioritize high-impact Vendor Terms changes
- Export Vendor Terms change rows for client review
<!-- FIXED_INCLUSIVE_PPE_20260707_END -->

### What does Vendor Terms Monitor do?

Vendor Terms Monitor compares supplied previous and current vendor legal or policy snapshots and turns noisy text diffs into structured vendor-risk signals. It is built for procurement, security, privacy, legal operations, RevOps, and SaaS teams that need a deterministic way to notice when a vendor changes terms, subprocessors, SLAs, support commitments, security controls, privacy language, or data-retention promises.

The actor is snapshot-first by default. Paste or send the previous and current page text directly, and the run stays local to the provided input. Optional URL fetch exists only for workflows that explicitly enable it with `allowUrlFetch: true`; it is disabled by default and capped by timeout and byte limits.

Key features:

- Compares previous/current terms, privacy, trust-center, DPA, subprocessor, SLA, support, and retention snapshots.
- Extracts effective dates, detected sections, subprocessors, stable diff signals, severity, recommendations, and snapshot hashes.
- Produces a dataset row per audited target plus optional JSON and Markdown reports in the key-value store.
- Uses deterministic rules and fixture-friendly output; it does not make legal-advice claims.
- Keeps billing predictable with pay-per-event pricing and no platform pass-through by default.

### Why Use This Actor

Most change monitors tell you that a page changed. Vendor Terms Monitor focuses on the parts vendor owners actually need to triage: subprocessors, service levels, security posture, privacy/data processing, support commitments, retention windows, notice language, and other material terms.

Build-time market context checked on July 2, 2026:

| Option | Current positioning | Pricing signal | Best fit | Vendor Terms Monitor difference |
| --- | --- | --- | --- | --- |
| [Website Terms & Policy Scraper](https://apify.com/taroyamada/saas-change-monitor-actor-premium/api) | Legal-page monitor with SHA256 diffs and pay-per-event pricing | Apify page showed pay-per-event pricing and low early usage | Broad terms/policy scraping | This actor accepts supplied snapshots by default and emits vendor-risk categories, stable signal IDs, and recommendations. |
| [Subprocessor & Trust Center Scraper](https://apify.com/taroyamada/trust-center-subprocessor-monitor/api/openapi) | Trust-center/subprocessor monitor | Apify page showed from $10.00 / 1,000 results | Subprocessor and trust-center extraction | This actor combines subprocessors with terms, SLA, support, security, privacy, and retention diff triage in one row per vendor. |
| [Website Change Monitor & Diff Tracker](https://apify.com/ryanclinton/website-change-monitor/input-schema) | General website change monitor | Apify page showed from $100.00 / 1,000 site monitoreds | General page monitoring and alerts | This actor is not a general crawler; it is a deterministic vendor legal-policy snapshot auditor. |
| [junipr Web Page Change Monitor](https://apify.com/junipr/web-page-change-monitor) | General page text diff monitor | Apify page showed from $3.90 / 1,000 page checks | Generic page changes, selectors, schedules | Use this actor when the page has already been captured and the question is vendor-risk meaning, not raw page diffing. |

### How to Use

Minimal zero-config run:

```json
{
  "includeReport": true,
  "allowUrlFetch": false
}
````

Typical snapshot run:

```json
{
  "sourceId": "acme-terms",
  "vendorName": "Acme SaaS",
  "sourceUrl": "https://acme.example/legal/terms",
  "previousLabel": "2026-06-01",
  "currentLabel": "2026-07-01",
  "previousText": "Effective date: June 1, 2026\nSubprocessors: AWS, Stripe.\nThe service target is 99.9% monthly uptime.",
  "currentText": "Effective date: July 1, 2026\nSubprocessors: AWS, Stripe, Snowflake.\nThe service target is 99.0% monthly uptime.",
  "maxSignals": 50,
  "includeReport": true,
  "allowUrlFetch": false
}
```

Steps:

1. Capture or export the previous vendor legal/policy page text.
2. Capture or export the current page text.
3. Provide both snapshots to the actor as top-level fields or as items in `targets`.
4. Review the dataset row for severity, flags, subprocessors, stable signals, and recommendations.
5. Send the Markdown report to the vendor owner, privacy reviewer, procurement owner, or legal operations queue if a review is needed.

#### Single Vendor Renewal Review

Use one target with `sourceId`, `vendorName`, `previousText`, and `currentText`. Keep `includeReport` enabled so the run writes a Markdown delivery summary.

#### Batch Vendor Snapshot Audit

Use `targets` for multiple vendors:

```json
{
  "targets": [
    {
      "sourceId": "crm-vendor-terms",
      "vendorName": "CRM Vendor",
      "previousText": "Effective date: June 1, 2026\nSubprocessors: AWS, Stripe.",
      "currentText": "Effective date: July 1, 2026\nSubprocessors: AWS, Stripe, Snowflake."
    },
    {
      "sourceId": "analytics-vendor-privacy",
      "vendorName": "Analytics Vendor",
      "previousText": "Personal data is processed only to provide the service.",
      "currentText": "Personal data may be shared with affiliates for analytics."
    }
  ],
  "maxTargets": 2,
  "maxSignals": 100,
  "includeReport": true,
  "allowUrlFetch": false
}
```

#### Explicit URL Fetch

URL fetching is disabled by default. Enable it only when you deliberately want the actor to fetch text:

```json
{
  "sourceId": "vendor-url-fetch",
  "vendorName": "Vendor With Public Terms",
  "previousUrl": "https://example.com/legal/terms-previous.txt",
  "currentUrl": "https://example.com/legal/terms-current.txt",
  "previousText": "",
  "currentText": "",
  "allowUrlFetch": true
}
```

The fetch path is capped and is not a browser/proxy setup. If a site blocks basic HTTP fetching or requires login, supply captured text snapshots instead.

### Input Configuration

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `sourceId` | string | `example-vendor-terms` | Stable ID for a single snapshot pair. |
| `vendorName` | string | `Example Vendor` | Vendor or service name shown in output. |
| `sourceUrl` | string | example terms URL | Label-only canonical URL for the legal page. |
| `previousUrl` | string | empty | Older URL, fetched only when URL fetch is enabled and text is blank. |
| `currentUrl` | string | empty | Newer URL, fetched only when URL fetch is enabled and text is blank. |
| `previousLabel` | string | `previous` | Label for the older snapshot. |
| `currentLabel` | string | `current` | Label for the newer snapshot. |
| `previousEffectiveDate` | string | empty | Optional effective-date override. |
| `currentEffectiveDate` | string | empty | Optional effective-date override. |
| `previousText` | string | fixture text | Older legal, privacy, trust, SLA, DPA, or subprocessor page text. |
| `currentText` | string | fixture text | Newer legal, privacy, trust, SLA, DPA, or subprocessor page text. |
| `targets` | array | `[]` | Optional list of snapshot pairs; overrides top-level fields. |
| `maxTargets` | integer | `1` | Maximum snapshot pairs processed in one run. |
| `maxSignals` | integer | `100` | Maximum stable diff signals emitted per target. |
| `includeReport` | boolean | `true` | Write JSON and Markdown KVS reports after a successful report charge. |
| `allowUrlFetch` | boolean | `false` | Opt-in only; fetches blank text fields from URLs with strict caps. |
| `maxChargeUsd` | number | `10` | Hard run-level PPE cap; stops before paid work or withholds uncharged reports. |
| `debug` | boolean | `false` | Enables additional logs. |

### Output Format

- `previousSnapshot` and `currentSnapshot`: normalized text, effective date, hash, and counts.
- `detectedSections`: presence/change summary for effective date, material terms, subprocessors, SLA, support, security, privacy, and data retention.
- `subprocessors`: previous/current names plus added and removed processors.
- `changeFlags`: booleans for review routing.
- `stableDiffSignals`: severity-ranked stable IDs with snippets and recommendations.
- `riskSeverity` and `riskScore`: deterministic triage values, not legal conclusions.

Example signal:

```json
{
  "signalId": "a4f67d1a753b70294e05",
  "type": "changed",
  "category": "terms",
  "categories": ["terms"],
  "severity": "critical",
  "summary": "Material Terms changed: We may update these Terms without notice when we determine changes are necessary.",
  "previousText": "We will provide at least 30 days notice before material changes to these Terms.",
  "currentText": "We may update these Terms without notice when we determine changes are necessary.",
  "recommendation": "Route this material terms signal to legal or procurement review. This actor is not providing legal advice."
}
```

KVS report artifacts:

- `VENDOR_TERMS_RESULTS.json`
- `VENDOR_TERMS_SUMMARY.json`
- `VENDOR_TERMS_REPORT.md`

### Integration Examples

#### Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
  sourceId: 'crm-vendor-terms',
  vendorName: 'CRM Vendor',
  previousText: previousTermsText,
  currentText: currentTermsText,
  includeReport: true,
  allowUrlFetch: false
};

const run = await client.actor('junipr/vendor-terms-monitor').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const highRisk = items.filter((row) => ['high', 'critical'].includes(row.riskSeverity));
console.log(highRisk.map((row) => ({ vendor: row.vendorName, flags: row.changeFlags })));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("junipr/vendor-terms-monitor").call(run_input={
    "sourceId": "analytics-vendor-privacy",
    "vendorName": "Analytics Vendor",
    "previousText": previous_text,
    "currentText": current_text,
    "includeReport": True,
    "allowUrlFetch": False,
})

rows = client.dataset(run["defaultDatasetId"]).list_items().items
for row in rows:
    if row["changeFlags"]["privacyChanged"] or row["changeFlags"]["dataRetentionChanged"]:
        print(row["vendorName"], row["riskSeverity"], row["recommendations"])
```

### Tips and Advanced Usage

#### Snapshot Hygiene

Use consistent capture logic upstream. Strip navigation, cookie banners, and footer boilerplate before sending snapshots when possible. The actor is deterministic, so stable inputs produce stable signal IDs.

#### Signal Tuning

Use `maxSignals` to keep output compact for very large policy pages. The actor sorts signals by severity first, then category, so high-risk material changes stay visible when truncation occurs.

#### URL Fetch

Keep `allowUrlFetch` off for most workflows. The actor is not a browser crawler and does not use proxies by default. If live browser/proxy fetching is added later, platform pass-through should be revisited before publication.

#### Review Routing

Use `changeFlags` for automation:

- `subprocessorsChanged`: send to vendor-management or privacy operations.
- `slaChanged` and `supportChanged`: send to service owner or business owner.
- `securityChanged`: send to security review.
- `privacyChanged` and `dataRetentionChanged`: send to privacy or data governance review.
- `materialTermsChanged`: send to procurement/legal operations.

### Limitations

- This actor is a deterministic monitoring and triage tool, not legal advice or contract interpretation.
- The default path compares supplied snapshots and does not browse logged-in portals, bypass access controls, or solve anti-bot challenges.
- It can highlight changed terms, SLA, privacy, renewal, liability, and subprocessor evidence, but a human owner should review original source text before vendor decisions.
- Optional URL fetching is capped and should be used only for pages you are authorized to monitor.

### FAQ

#### Does this actor provide legal advice?

No. It provides deterministic monitoring signals and review recommendations. The output is a triage aid for vendor-risk workflows and is not legal advice.

#### Does it crawl vendor websites by default?

No. It is snapshot-first by default. Supply previous/current text snapshots. Optional URL fetch is disabled unless `allowUrlFetch` is explicitly set to `true`.

#### What counts as a target?

#### Can it detect new subprocessors?

Yes. It scans subprocessor/service-provider lines, extracts common vendor names, and reports added and removed names.

#### Can I monitor multiple vendors in one run?

Yes. Provide `targets` and set `maxTargets` to the number of snapshot pairs you want to process, up to the package cap.

#### Why are full snapshots included in the output?

The actor is designed for auditability. It includes normalized previous/current text, hashes, counts, and signal snippets so downstream reviewers can trace why a flag was raised.

#### What if a vendor page requires login or blocks HTTP requests?

Capture the text outside the actor and pass it as `previousText` and `currentText`. The default actor path does not use browsers, sessions, or proxies.

#### Does the actor detect every legal risk?

No. It detects structured text signals that are useful for triage. Human review remains necessary for legal interpretation and vendor decisions.

### Related Actors

- [Web Page Change Monitor](https://apify.com/junipr/web-page-change-monitor)
- [OpenAPI Spec Diff Auditor](https://apify.com/junipr/openapi-spec-diff-auditor)
- [Security Headers Auditor](https://apify.com/junipr/security-headers-auditor)
- [TLS Certificate Monitor](https://apify.com/junipr/tls-certificate-monitor)
- [Broken Link Redirect Map](https://apify.com/junipr/broken-link-redirect-map)

# Actor input Schema

## `sourceId` (type: `string`):

Stable label for this vendor or legal page snapshot pair.

## `vendorName` (type: `string`):

Human-readable vendor or service name.

## `sourceUrl` (type: `string`):

Optional canonical legal, privacy, trust, or terms page URL used for labeling output.

## `previousUrl` (type: `string`):

Optional older page URL. Fetched only when Allow URL Fetch is enabled and previousText is blank.

## `currentUrl` (type: `string`):

Optional newer page URL. Fetched only when Allow URL Fetch is enabled and currentText is blank.

## `previousLabel` (type: `string`):

Label for the older legal/policy snapshot.

## `currentLabel` (type: `string`):

Label for the newer legal/policy snapshot.

## `previousEffectiveDate` (type: `string`):

Optional effective date override for the previous snapshot. If blank, the actor tries to extract it from text.

## `currentEffectiveDate` (type: `string`):

Optional effective date override for the current snapshot. If blank, the actor tries to extract it from text.

## `previousText` (type: `string`):

Older vendor terms, privacy, trust-center, SLA, DPA, or subprocessor page text.

## `currentText` (type: `string`):

Newer vendor terms, privacy, trust-center, SLA, DPA, or subprocessor page text.

## `targets` (type: `array`):

Optional list of vendor snapshot pairs. When provided, these override the top-level snapshot fields.

## `maxItems` (type: `integer`):

Alias for Max Targets/Maximum Records used by the Junipr actor baseline. When both are provided, actor-specific limits still apply.

## `maxTargets` (type: `integer`):

Maximum vendor snapshot pairs to audit in one run.

## `maxSignals` (type: `integer`):

Maximum stable diff signals emitted per target after severity sorting.

## `includeReport` (type: `boolean`):

Store dataset rows, summary JSON, and a Markdown report in the default key-value store.

## `allowUrlFetch` (type: `boolean`):

Disabled by default. When enabled, the actor may fetch previous/current URLs with strict timeout and byte caps.

## `maxChargeUsd` (type: `number`):

Hard local spending cap for actor-start, per-item, and report events. The actor stops before work or withholds uncharged output when the next event would exceed this amount.

## `dryRun` (type: `boolean`):

Validate input and write a dry-run summary without PPE charges or dataset output.

## `debug` (type: `boolean`):

Enable additional logs for target normalization, billing decisions, and signal extraction.

## Actor input object example

```json
{
  "sourceId": "example-vendor-terms",
  "vendorName": "Example Vendor",
  "sourceUrl": "https://example.com/legal/terms",
  "previousUrl": "",
  "currentUrl": "",
  "previousLabel": "previous",
  "currentLabel": "current",
  "previousEffectiveDate": "",
  "currentEffectiveDate": "",
  "previousText": "Effective date: June 1, 2026\n\n# Example Vendor Terms\n\nWe will provide at least 30 days notice before material changes to these Terms.\nCustomer liability is capped at fees paid in the prior 12 months.\n\n# Subprocessors\nSubprocessors: AWS, Stripe.\n\n# Service Levels\nThe service target is 99.9% monthly uptime with service credits for qualifying downtime.\n\n# Security\nVendor maintains SOC 2 Type II controls, encryption at rest and in transit, MFA for administrative access, and annual penetration testing.\n\n# Privacy and Data Retention\nCustomer personal data is processed only to provide the service.\nCustomer data is deleted within 30 days after account termination unless retention is required by law.\n\n# Support\nCritical support requests receive a first response within 4 business hours.",
  "currentText": "Effective date: July 1, 2026\n\n# Example Vendor Terms\n\nWe may update these Terms without notice when we determine changes are necessary.\nCustomer must indemnify Vendor for claims related to use of the service.\n\n# Subprocessors\nSubprocessors: AWS, Stripe, Snowflake.\n\n# Service Levels\nThe service target is 99.0% monthly uptime and service credits are no longer offered.\n\n# Security\nVendor maintains encryption in transit and MFA for administrative access.\n\n# Privacy and Data Retention\nCustomer personal data may be shared with affiliates for analytics and service improvement.\nCustomer data may be retained for 180 days after account termination.\n\n# Support\nCritical support requests receive a first response within 1 business day.",
  "targets": [],
  "maxItems": 1,
  "maxTargets": 1,
  "maxSignals": 100,
  "includeReport": true,
  "allowUrlFetch": false,
  "maxChargeUsd": 10,
  "dryRun": false,
  "debug": false
}
```

# Actor output Schema

## `results` (type: `string`):

Each dataset row is one vendor snapshot-pair audit with detected sections, stable diff signals, severity, and recommendations.

## `resultsJson` (type: `string`):

Full JSON array of vendor terms monitoring rows.

## `summaryJson` (type: `string`):

Run-level counts by target, category, severity, and billing-truncation status.

## `summaryReport` (type: `string`):

Markdown report summarizing important vendor-risk changes and recommendations.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("junipr/vendor-terms-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("junipr/vendor-terms-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call junipr/vendor-terms-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=junipr/vendor-terms-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Vendor Terms Monitor",
        "description": "Monitor vendor terms, legal pages, subprocessors, SLAs, security, privacy, and data-retention changes from supplied previous/current snapshots.",
        "version": "1.0",
        "x-build-id": "LhvvBkDaVSGC4yaFj"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~vendor-terms-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-vendor-terms-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/junipr~vendor-terms-monitor/runs": {
            "post": {
                "operationId": "runs-sync-junipr-vendor-terms-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/junipr~vendor-terms-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-vendor-terms-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sourceId": {
                        "title": "Source ID",
                        "type": "string",
                        "description": "Stable label for this vendor or legal page snapshot pair.",
                        "default": "example-vendor-terms"
                    },
                    "vendorName": {
                        "title": "Vendor Name",
                        "type": "string",
                        "description": "Human-readable vendor or service name.",
                        "default": "Example Vendor"
                    },
                    "sourceUrl": {
                        "title": "Source URL",
                        "type": "string",
                        "description": "Optional canonical legal, privacy, trust, or terms page URL used for labeling output.",
                        "default": "https://example.com/legal/terms"
                    },
                    "previousUrl": {
                        "title": "Previous Snapshot URL",
                        "type": "string",
                        "description": "Optional older page URL. Fetched only when Allow URL Fetch is enabled and previousText is blank.",
                        "default": ""
                    },
                    "currentUrl": {
                        "title": "Current Snapshot URL",
                        "type": "string",
                        "description": "Optional newer page URL. Fetched only when Allow URL Fetch is enabled and currentText is blank.",
                        "default": ""
                    },
                    "previousLabel": {
                        "title": "Previous Label",
                        "type": "string",
                        "description": "Label for the older legal/policy snapshot.",
                        "default": "previous"
                    },
                    "currentLabel": {
                        "title": "Current Label",
                        "type": "string",
                        "description": "Label for the newer legal/policy snapshot.",
                        "default": "current"
                    },
                    "previousEffectiveDate": {
                        "title": "Previous Effective Date",
                        "type": "string",
                        "description": "Optional effective date override for the previous snapshot. If blank, the actor tries to extract it from text.",
                        "default": ""
                    },
                    "currentEffectiveDate": {
                        "title": "Current Effective Date",
                        "type": "string",
                        "description": "Optional effective date override for the current snapshot. If blank, the actor tries to extract it from text.",
                        "default": ""
                    },
                    "previousText": {
                        "title": "Previous Legal Page Text",
                        "type": "string",
                        "description": "Older vendor terms, privacy, trust-center, SLA, DPA, or subprocessor page text.",
                        "default": "Effective date: June 1, 2026\n\n# Example Vendor Terms\n\nWe will provide at least 30 days notice before material changes to these Terms.\nCustomer liability is capped at fees paid in the prior 12 months.\n\n# Subprocessors\nSubprocessors: AWS, Stripe.\n\n# Service Levels\nThe service target is 99.9% monthly uptime with service credits for qualifying downtime.\n\n# Security\nVendor maintains SOC 2 Type II controls, encryption at rest and in transit, MFA for administrative access, and annual penetration testing.\n\n# Privacy and Data Retention\nCustomer personal data is processed only to provide the service.\nCustomer data is deleted within 30 days after account termination unless retention is required by law.\n\n# Support\nCritical support requests receive a first response within 4 business hours."
                    },
                    "currentText": {
                        "title": "Current Legal Page Text",
                        "type": "string",
                        "description": "Newer vendor terms, privacy, trust-center, SLA, DPA, or subprocessor page text.",
                        "default": "Effective date: July 1, 2026\n\n# Example Vendor Terms\n\nWe may update these Terms without notice when we determine changes are necessary.\nCustomer must indemnify Vendor for claims related to use of the service.\n\n# Subprocessors\nSubprocessors: AWS, Stripe, Snowflake.\n\n# Service Levels\nThe service target is 99.0% monthly uptime and service credits are no longer offered.\n\n# Security\nVendor maintains encryption in transit and MFA for administrative access.\n\n# Privacy and Data Retention\nCustomer personal data may be shared with affiliates for analytics and service improvement.\nCustomer data may be retained for 180 days after account termination.\n\n# Support\nCritical support requests receive a first response within 1 business day."
                    },
                    "targets": {
                        "title": "Vendor Targets",
                        "type": "array",
                        "description": "Optional list of vendor snapshot pairs. When provided, these override the top-level snapshot fields.",
                        "items": {
                            "type": "object"
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Alias for Max Targets/Maximum Records used by the Junipr actor baseline. When both are provided, actor-specific limits still apply.",
                        "default": 1
                    },
                    "maxTargets": {
                        "title": "Maximum Targets",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum vendor snapshot pairs to audit in one run.",
                        "default": 1
                    },
                    "maxSignals": {
                        "title": "Maximum Signals Per Target",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum stable diff signals emitted per target after severity sorting.",
                        "default": 100
                    },
                    "includeReport": {
                        "title": "Generate Summary Report",
                        "type": "boolean",
                        "description": "Store dataset rows, summary JSON, and a Markdown report in the default key-value store.",
                        "default": true
                    },
                    "allowUrlFetch": {
                        "title": "Allow URL Fetch",
                        "type": "boolean",
                        "description": "Disabled by default. When enabled, the actor may fetch previous/current URLs with strict timeout and byte caps.",
                        "default": false
                    },
                    "maxChargeUsd": {
                        "title": "Maximum Charge (USD)",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "number",
                        "description": "Hard local spending cap for actor-start, per-item, and report events. The actor stops before work or withholds uncharged output when the next event would exceed this amount.",
                        "default": 10
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Validate input and write a dry-run summary without PPE charges or dataset output.",
                        "default": false
                    },
                    "debug": {
                        "title": "Debug Logging",
                        "type": "boolean",
                        "description": "Enable additional logs for target normalization, billing decisions, and signal extraction.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
