# API Docs Changelog Diff Monitor (`junipr/api-docs-changelog-diff-monitor`) Actor

Compare API docs, SDK docs, changelog, and pricing-doc snapshots for endpoint, header, auth, version, pricing, deprecation, and release-note changes.

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

## Pricing

from $6.50 / 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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## API Docs Changelog Diff Monitor

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

**Store title:** API Docs Changelog Diff Monitor

**Short description:** Compare API docs, SDK docs, changelog, and pricing-doc snapshots for endpoint, header, auth, version, pricing, deprecation, and release-note changes.

**SEO title:** API Docs Changelog Diff Monitor — change monitoring and diff reports

**SEO description:** Compare API docs, SDK docs, changelog, and pricing-doc snapshots for endpoint, header, auth, version, pricing, deprecation, and release-note changes. Use it for recurring watchlists, previous/current comparisons, changed-row evidence, and schedule-friendly digests.

**Categories:** DEVELOPER_TOOLS, AUTOMATION

**Keywords:** api, docs, changelog, diff, monitor, change monitor, pricing audit, api testing, recurring monitor/diff actor

### 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: M1 — Recurring monitor/diff actor
- Primary event: `snapshot-compared` at $0.00650 base
- Default max charge: $20.00
- Store discounts: FREE/BRONZE base, SILVER discounted, GOLD deepest approved discount

Event set:

- `actor-start`: base $0.02000, GOLD $0.01600. API Docs Changelog Diff Monitor: charged when actor start is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `snapshot-compared`: base $0.00650, GOLD $0.00520. API Docs Changelog Diff Monitor: charged when snapshot compared is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `change-detected`: base $0.01300, GOLD $0.01040. API Docs Changelog Diff Monitor: charged when change detected is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `digest-generated`: base $0.05000, GOLD $0.04000. API Docs Changelog Diff Monitor: charged when digest generated is completed. The price includes Apify platform usage; no separate usage pass-through is intended.
- `executive-report-generated`: base $0.10000, GOLD $0.08000. API Docs Changelog Diff Monitor: charged when executive report generated is completed. The price includes Apify platform usage; no separate usage pass-through is intended.

### Public Task Concepts

- Monitor API Docs Changelog Diff Monitor changes on a schedule
- Compare previous and current API Docs Changelog Diff Monitor snapshots
- Audit api issues across supplied public inputs
- Extract evidence-backed api rows for client QA
- Prioritize api fixes before a launch or migration
<!-- FIXED_INCLUSIVE_PPE_20260707_END -->

### What does API Docs Changelog Diff Monitor do?

API Docs Changelog Diff Monitor compares previous and current API documentation, SDK documentation, changelog, or pricing-document snapshots and turns meaningful differences into structured Apify dataset rows. It is designed for developer-monitoring workflows where a generic text diff is too noisy and a strict OpenAPI spec diff is not available.

It detects added, removed, and changed API signals across endpoints, headers, auth schemes, version language, pricing or quota language, deprecations, and release notes. The actor is fixture-first and no-network by default. You paste or pass stored snapshots; it does not crawl, fetch, render pages, call LLMs, or use proxies.

### Why Use This Actor

| Capability | This actor | Manual text diff | OpenAPI-only diff tools | Generic page-change monitors |
| --- | --- | --- | --- | --- |
| Works from pasted docs/changelog text | Yes | Yes | Usually no | Sometimes |
| Works without a complete OpenAPI spec | Yes | Yes | No | Yes |
| Structured Apify dataset rows | Yes | No | Usually no | Usually no |
| API-specific categories | Endpoint, header, auth, version, pricing, deprecation, release note | No | Schema-first only | No |
| Tiny default run | Yes | Not applicable | Not applicable | Depends on target |
| Network required | No | No | No | Usually yes |
| Pricing model | M1 PPE, target-based | Free labor | Tool-specific | Tool-specific |

Use this actor for vendor API monitoring, SDK release review, pricing and quota doc review, internal platform docs review, partner integration checks, and changelog triage. Use a schema-first OpenAPI differ when you already have complete previous/current OpenAPI files and need semantic request/response schema changes.

### How to Use

Minimal input:

```json
{
  "previousSnapshot": "GET /v1/users lists users. Auth: Bearer token.",
  "currentSnapshot": "GET /v1/users lists active and invited users. GET /v1/teams lists teams. Auth: Bearer token.",
  "sourceId": "partner-api",
  "includeReport": true
}
````

1. Copy the older docs, SDK docs, or changelog text into `previousSnapshot`.
2. Copy the newer version into `currentSnapshot`.
3. Set `sourceId` to a stable name such as `stripe-api` or `vendor-sdk-docs`.
4. Run the actor and review the default dataset rows.
5. Open `API_DOCS_DIFF_SUMMARY.json` or `API_DOCS_DIFF_REPORT.md` for run-level triage.

#### Tiny Default Check

Run with the default input to verify output shape and billing behavior. The default snapshots are intentionally tiny and local.

#### HTML Snapshot Diff

Set `contentType` to `html` when passing rendered HTML. The actor strips scripts, styles, and tags before extracting API signals.

#### Multi-Target Review

### Input Configuration

| Name | Type | Default | Description |
| --- | --- | --- | --- |
| `sourceId` | string | `example-api-docs` | Stable label for the snapshot pair. |
| `sourceUrl` | string | empty | Optional traceability URL label. The actor does not fetch it. |
| `previousLabel` | string | `previous` | Label for the older snapshot. |
| `currentLabel` | string | `current` | Label for the newer snapshot. |
| `previousSnapshot` | string | tiny fixture | Older text, Markdown, OpenAPI-ish YAML, or HTML snapshot. |
| `currentSnapshot` | string | tiny fixture | Newer text, Markdown, OpenAPI-ish YAML, or HTML snapshot. |
| `targets` | array | `[]` | Optional list of snapshot pairs. Overrides top-level snapshots when non-empty. |
| `contentType` | string | `auto` | `auto`, `text`, `markdown`, `html`, or `openapi`. |
| `includeCategories` | string\[] | all categories | Filter to endpoint, header, auth, version, pricing, deprecation, and release-note rows. |
| `maxTargets` | integer | `1` | Maximum snapshot pairs processed in one run. |
| `maxChanges` | integer | `100` | Maximum emitted rows per target after severity sorting. |
| `includeReport` | boolean | `true` | Write JSON and Markdown KVS artifacts. |
| `debug` | boolean | `false` | Enable verbose extraction logs. |

### Output Format

Each dataset row is one API-change signal:

```json
{
  "changeId": "857cc3b36b406e52",
  "sourceId": "example-api-docs",
  "sourceUrl": null,
  "previousLabel": "2026-06-01",
  "currentLabel": "2026-07-01",
  "status": "changed",
  "changeType": "added",
  "signalCategory": "endpoint",
  "severity": "info",
  "identifier": "GET /v1/teams",
  "method": "GET",
  "path": "/v1/teams",
  "previousHash": null,
  "currentHash": "c65daef7e6d9fc74",
  "previousEvidence": null,
  "currentEvidence": "- Added GET /v1/teams for team membership lookup.",
  "previousLine": null,
  "currentLine": 5,
  "processedAt": "2026-07-02T00:00:00.000Z",
  "recommendation": "Evaluate whether GET /v1/teams should be added to SDK coverage, docs examples, tests, or release notes."
}
```

`API_DOCS_DIFF_RESULTS.json` contains the emitted row array. `API_DOCS_DIFF_SUMMARY.json` contains counts by target, change type, category, and severity. `API_DOCS_DIFF_REPORT.md` is a Markdown triage report.

### Integration Examples

Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("junipr/api-docs-changelog-diff-monitor").call(run_input={
    "sourceId": "partner-api",
    "previousSnapshot": "GET /v1/users lists users.",
    "currentSnapshot": "GET /v1/users lists users. GET /v1/teams lists teams.",
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    if item["severity"] in {"critical", "warning"}:
        print(item["signalCategory"], item["identifier"], item["recommendation"])
```

Node.js example:

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('junipr/api-docs-changelog-diff-monitor').call({
  sourceId: 'sdk-docs',
  previousSnapshot: 'Auth: Bearer token. GET /v1/users lists users.',
  currentSnapshot: 'Auth: OAuth 2.0. GET /v1/users lists users.',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((item) => item.signalCategory === 'auth'));
```

### Tips and Advanced Usage

#### Performance Optimization

Keep snapshots focused on API docs, changelogs, endpoint references, or release sections. Large marketing pages add noise and spend your `maxChanges` budget on low-value release-note lines.

#### Proxy Configuration

No proxy is needed. This actor does not fetch live pages. If you need to monitor live docs pages, schedule a separate fetcher or crawler to save snapshots, then pass the snapshots here.

#### Reducing Noise

Use `includeCategories` to focus on specific signal families. For example, a breaking-change workflow can include only `endpoint`, `auth`, `header`, and `deprecation`; a vendor-cost workflow can include only `pricing` and `release-note`.

### Limitations

- The actor compares supplied snapshots and does not crawl or authenticate to live documentation sites.
- It detects meaningful documentation, changelog, endpoint, pricing, auth, and deprecation changes, but it is not a full semantic OpenAPI validator.
- Source URLs are used as evidence labels unless an upstream crawler or archive supplies the page text.
- Human review is still required before treating a detected API change as a contractual or migration decision.

### FAQ

#### Does this actor fetch URLs?

No. `sourceUrl` is only a label for traceability. Pass snapshots from your own archive, webhook, crawler, CI job, or previous Apify run.

#### Can it diff OpenAPI files?

It can extract common endpoint patterns from OpenAPI-like YAML, but it is not a full semantic OpenAPI schema differ. Use it for broad docs/changelog monitoring and pair it with schema-specific tooling when complete specs are available.

#### Why do I see release-note rows and endpoint rows for the same line?

That is intentional. One line can be both a changelog item and an endpoint signal. Filter with `includeCategories` if you only want one category.

#### How are severities assigned?

Deprecations, auth changes, pricing changes, and removed endpoints are prioritized. Header, version, and release-note changes become warnings when they include removal, sunset, deprecation, or breaking-change language.

#### Will it detect parameter or response schema changes?

It detects changed evidence attached to the same endpoint or pricing identifier, but it does not parse every parameter, response object, invoice rule, tax rule, or plan entitlement semantically. For exact schema diffs, use a schema-first OpenAPI differ.

### Related Actors

- Domain Extractor Grouper
- Dataset QA Auditor
- Actor Pricing Simulator
- Actor README Quality Linter
- OpenAPI Spec Diff Auditor

# Actor input Schema

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

Stable name for this API docs or changelog source.

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

Optional URL label for traceability only. The actor does not fetch this URL.

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

Label for the older snapshot.

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

Label for the newer snapshot.

## `previousSnapshot` (type: `string`):

Older API docs or changelog snapshot as plain text, Markdown, or HTML.

## `currentSnapshot` (type: `string`):

Newer API docs or changelog snapshot as plain text, Markdown, or HTML.

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

Optional list of snapshot pairs. When provided, these override the top-level Previous and Current Snapshot fields.

## `contentType` (type: `string`):

How to normalize snapshots before extracting API signals.

## `includeCategories` (type: `array`):

API, changelog, and pricing-doc signal categories to include in the diff output. Valid values: endpoint, header, auth, version, pricing, deprecation, release-note.

## `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 snapshot pairs to compare in one run.

## `maxChanges` (type: `integer`):

Maximum structured diff rows emitted per target after sorting by severity and category.

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

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

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

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

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

Enable additional logs for snapshot normalization and signal extraction.

## Actor input object example

```json
{
  "sourceId": "example-api-docs",
  "sourceUrl": "",
  "previousLabel": "previous",
  "currentLabel": "current",
  "previousSnapshot": "# Example API Changelog\n\n## 2026-06-01\n- Added POST /v1/users for user creation. Requires Idempotency-Key header.\n- GET /v1/users lists active users with Authorization: Bearer token.\n- Deprecated GET /v1/legacy-users. Sunset planned for 2026-09-01.\n\nHeaders:\n- Authorization\n- Idempotency-Key\n\nAuth: Bearer token\nAPI version: v1",
  "currentSnapshot": "# Example API Changelog\n\n## 2026-07-01\n- Added POST /v1/users for user creation. Requires Idempotency-Key header.\n- GET /v1/users lists active and invited users with Authorization: Bearer token.\n- Added GET /v1/teams for team membership lookup.\n- Deprecated GET /v1/legacy-users. Removal date confirmed for 2026-09-01.\n\nHeaders:\n- Authorization\n- Idempotency-Key\n- X-API-Version\n\nAuth: Bearer token\nAPI version: v1",
  "targets": [],
  "contentType": "auto",
  "includeCategories": [
    "endpoint",
    "header",
    "auth",
    "version",
    "pricing",
    "deprecation",
    "release-note"
  ],
  "maxItems": 1,
  "maxTargets": 1,
  "maxChanges": 100,
  "includeReport": true,
  "dryRun": false,
  "debug": false
}
```

# Actor output Schema

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

Each dataset row is one added, removed, or changed API, changelog, or pricing signal with evidence and recommendation.

## `diffResultsJson` (type: `string`):

Full JSON array of structured diff rows.

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

Run-level counts by target, change type, category, and severity.

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

Markdown report describing the most important API docs, changelog, and pricing-doc changes.

# 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/api-docs-changelog-diff-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/api-docs-changelog-diff-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/api-docs-changelog-diff-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "API Docs Changelog Diff Monitor",
        "description": "Compare API docs, SDK docs, changelog, and pricing-doc snapshots for endpoint, header, auth, version, pricing, deprecation, and release-note changes.",
        "version": "1.0",
        "x-build-id": "rv2bgSF0FbeTAhRfi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~api-docs-changelog-diff-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-api-docs-changelog-diff-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~api-docs-changelog-diff-monitor/runs": {
            "post": {
                "operationId": "runs-sync-junipr-api-docs-changelog-diff-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~api-docs-changelog-diff-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-api-docs-changelog-diff-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 name for this API docs or changelog source.",
                        "default": "example-api-docs"
                    },
                    "sourceUrl": {
                        "title": "Source URL",
                        "type": "string",
                        "description": "Optional URL label for traceability only. The actor does not fetch this URL.",
                        "default": ""
                    },
                    "previousLabel": {
                        "title": "Previous Label",
                        "type": "string",
                        "description": "Label for the older snapshot.",
                        "default": "previous"
                    },
                    "currentLabel": {
                        "title": "Current Label",
                        "type": "string",
                        "description": "Label for the newer snapshot.",
                        "default": "current"
                    },
                    "previousSnapshot": {
                        "title": "Previous Snapshot",
                        "type": "string",
                        "description": "Older API docs or changelog snapshot as plain text, Markdown, or HTML.",
                        "default": "# Example API Changelog\n\n## 2026-06-01\n- Added POST /v1/users for user creation. Requires Idempotency-Key header.\n- GET /v1/users lists active users with Authorization: Bearer token.\n- Deprecated GET /v1/legacy-users. Sunset planned for 2026-09-01.\n\nHeaders:\n- Authorization\n- Idempotency-Key\n\nAuth: Bearer token\nAPI version: v1"
                    },
                    "currentSnapshot": {
                        "title": "Current Snapshot",
                        "type": "string",
                        "description": "Newer API docs or changelog snapshot as plain text, Markdown, or HTML.",
                        "default": "# Example API Changelog\n\n## 2026-07-01\n- Added POST /v1/users for user creation. Requires Idempotency-Key header.\n- GET /v1/users lists active and invited users with Authorization: Bearer token.\n- Added GET /v1/teams for team membership lookup.\n- Deprecated GET /v1/legacy-users. Removal date confirmed for 2026-09-01.\n\nHeaders:\n- Authorization\n- Idempotency-Key\n- X-API-Version\n\nAuth: Bearer token\nAPI version: v1"
                    },
                    "targets": {
                        "title": "Snapshot Targets",
                        "type": "array",
                        "description": "Optional list of snapshot pairs. When provided, these override the top-level Previous and Current Snapshot fields.",
                        "items": {
                            "type": "object"
                        },
                        "default": []
                    },
                    "contentType": {
                        "title": "Content Type",
                        "enum": [
                            "auto",
                            "text",
                            "markdown",
                            "html",
                            "openapi"
                        ],
                        "type": "string",
                        "description": "How to normalize snapshots before extracting API signals.",
                        "default": "auto"
                    },
                    "includeCategories": {
                        "title": "Signal Categories",
                        "type": "array",
                        "description": "API, changelog, and pricing-doc signal categories to include in the diff output. Valid values: endpoint, header, auth, version, pricing, deprecation, release-note.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "endpoint",
                            "header",
                            "auth",
                            "version",
                            "pricing",
                            "deprecation",
                            "release-note"
                        ]
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 100,
                        "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": 100,
                        "type": "integer",
                        "description": "Maximum snapshot pairs to compare in one run.",
                        "default": 1
                    },
                    "maxChanges": {
                        "title": "Maximum Changes Per Target",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum structured diff rows emitted per target after sorting by severity and category.",
                        "default": 100
                    },
                    "includeReport": {
                        "title": "Generate Summary Report",
                        "type": "boolean",
                        "description": "Store diff rows, summary JSON, and a Markdown report in the default key-value store.",
                        "default": true
                    },
                    "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 snapshot normalization 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
