# SBOM Diff Reporter (`junipr/sbom-diff-reporter`) Actor

Compare two SPDX/CycloneDX SBOMs and summarize package, version, license, and risk-relevant changes.

- **URL**: https://apify.com/junipr/sbom-diff-reporter.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 $3.90 / 1,000 sbom compareds

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

## SBOM Diff Reporter

Compare normalized SBOM components by stable name while reporting versions, package URLs, licenses, scope, hashes, additions, and updates.

Use this actor to turn structured records or supported text evidence into a normalized Apify dataset. Each paid row represents one SBOM component; blocked and no-result diagnostics remain free so invalid evidence does not look like successful extraction.

### What It Returns

Every dataset row includes stable source and record identifiers, a checked timestamp, current and previous hashes, a change classification, issue codes, a concise recommendation, the charged event name, and strict actor-specific data. The data object contains only fields relevant to SBOM component records.

Change classifications are `observed` when no prior snapshot is supplied, `added` for a new key, `updated` when normalized metadata changed, and `unchanged` when the normalized record matches. Diagnostic rows use `diagnostic`, contain no paid event name, and explain how to supply usable evidence.

### Input Sources

- Inline `currentText`, `text`, or `html` for deterministic runs.
- `items` for structured current records and `previousItems` for structured history.
- `previousText` for snapshot comparison.
- `targets` to process several bounded sources in one run.
- `urls` or `sourceUrl` only when `allowUrlFetch` is explicitly enabled.

Public URL retrieval accepts HTTP and HTTPS only. It rejects credentials, redirects, localhost, private and reserved addresses, and DNS results that resolve privately. Responses have timeout and streamed byte limits. Defaults use bounded records from the stated public source, process one target, and make no network request.

### Quick Start

```json
{
  "sourceId": "cyclonedx-dropwizard-sbom",
  "sourceUrl": "https://raw.githubusercontent.com/CycloneDX/bom-examples/master/SBOM/dropwizard-1.3.15/bom.json",
  "items": [
    {
      "componentId": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.9.10",
      "name": "jackson-annotations",
      "version": "2.9.10",
      "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.9.10?type=jar",
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "c876f2e85d0f108a34cdd11ccc9d8d7875697367efc75bf10a89c2c26aee994c"
        }
      ]
    }
  ],
  "text": "",
  "currentText": "",
  "previousText": "",
  "maxItems": 1,
  "maxRecordsPerTarget": 5,
  "maxTextBytes": 250000,
  "fetchTimeoutMs": 15000,
  "allowUrlFetch": false,
  "includeDigest": false,
  "includeReport": true,
  "dryRun": false,
  "debug": false
}
````

Set `maxItems` to cap source targets, `maxRecordsPerTarget` to cap normalized records, `maxTextBytes` to cap each supplied or fetched body, and `fetchTimeoutMs` to cap public retrieval time. `dryRun` validates input without charges or dataset output.

### Data Quality

The parser normalizes and deduplicates SBOM component records by the actor's stable identity field. It never fabricates missing titles, dates, authors, links, guests, journals, or categories. Missing values stay null or empty and produce explicit issue codes.

Possible issue codes include: `missing-component-name`, `missing-version`, `missing-license`, `review-license`, `source-unavailable`. Review warning rows before using them in downstream publishing, outreach, reporting, or alerting.

### Reports And Digests

The default key-value store receives a results JSON file, summary JSON, and Markdown report after the corresponding report charge succeeds. Recurring monitor actors also produce JSON and Markdown change digests. Report artifacts are skipped when the run budget cannot cover the report event.

### Pay Per Event

| Event | Price | Purpose |
| --- | ---: | --- |
| `actor-start` | $0.00500 | Sbom Diff Reporter Actor Start |
| `operation-tested` | $0.00650 | Sbom Diff Reporter Operation Tested |
| `contract-rule-checked` | $0.00390 | Sbom Diff Reporter Contract Rule Checked |
| `report-generated` | $0.05000 | Sbom Diff Reporter Report Generated |

Platform usage is included in these event prices. The actor charges before paid dataset rows or report artifacts are written. If Apify rejects a charge because the run limit is reached, the actor records billing status and stops before the affected paid output.

### Operational Guidance

Use stable `sourceId` values across scheduled runs, retain the prior normalized source snapshot, and compare changes by `recordId` and `changeType`. Start with one source and inspect the dataset before increasing limits. Keep URL retrieval disabled when inline or structured evidence is available.

### How Parsing Works

This actor accepts structured records or supported text evidence. Structured records take priority when they are supplied. Otherwise, the parser reads the source format directly, normalizes whitespace and identifiers, resolves supported links, removes duplicate identities, and stops at `maxRecordsPerTarget`.

The actor-specific data fields are: `componentId`, `name`, `version`, `purl`, `licenses`, `scope`, `hashCount`, `issues`. These fields are validated by the strict dataset schema. Unknown top-level output fields and unknown fields inside `data` are not part of the contract.

Record identity is based on the strongest stable public identifier available for each SBOM component. Links and official IDs are preferred; a deterministic content identity is used only when the source omits a stronger identifier. Reordering a feed or inserting a new record does not turn unchanged historical records into updates.

### Comparison Workflow

1. Save the prior source body or structured records after a successful run.
2. Supply that evidence as `previousText` or `previousItems` on the next run.
3. Supply the current evidence through `currentText`, `items`, or an explicitly enabled public URL.
4. Read `added` and `updated` rows as detected events. `unchanged` rows preserve the current normalized inventory.
5. Store the current source evidence for the following run.

Comparisons use normalized record hashes, not timestamps generated by the actor. This keeps reruns deterministic and prevents a new `checkedAt` value from creating false changes.

### Scheduling And Delivery

For scheduled monitoring, use one stable target per public source and conservative caps. Send alerts from rows whose `changeType` is `added` or `updated`; keep all rows in the dataset when a complete current inventory is required. The JSON summary is suitable for automation, while the Markdown report and optional digest are suitable for review or delivery.

Do not treat an empty paid dataset as a successful zero-change result without checking diagnostics. A blocked diagnostic indicates missing evidence, disabled URL retrieval, an invalid public URL, a private address, a timeout, an oversized response, or an unsupported source shape.

### Limits And Failure Handling

- `maxItems` limits targets before retrieval or analysis.
- `maxRecordsPerTarget` limits normalized records per target.
- `maxTextBytes` limits inline and fetched source bodies.
- `fetchTimeoutMs` limits each explicitly enabled public request.
- Redirects and credentialed URLs are rejected.
- Charge-limit failures stop before the affected paid rows or report artifacts.
- Parser failures produce explicit diagnostics rather than invented records.

Use `debug` only when investigating source parsing or billing decisions. Avoid logging source bodies that may contain information you do not intend to retain.

Only process public, authorized, or owned sources. Do not use this actor to bypass access controls, collect private data, or make unsupported legal or compliance claims.

# Actor input Schema

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

Source Id input value.

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

Source Url input value.

## `text` (type: `string`):

Text input value.

## `html` (type: `string`):

Html input value.

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

Current Text input value.

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

Previous Text input value.

## `items` (type: `array`):

Items input value.

## `previousItems` (type: `array`):

Previous Items input value.

## `topics` (type: `array`):

Topics input value.

## `expectedOptions` (type: `array`):

Expected Options input value.

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

Targets input value.

## `urls` (type: `array`):

Urls input value.

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

Max Items input value.

## `maxRecordsPerTarget` (type: `integer`):

Max Records Per Target input value.

## `maxTextBytes` (type: `integer`):

Max Text Bytes input value.

## `fetchTimeoutMs` (type: `integer`):

Fetch Timeout Ms input value.

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

Allow Url Fetch input value.

## `includeDigest` (type: `boolean`):

Include Digest input value.

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

Include Report input value.

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

Dry Run input value.

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

Debug input value.

## Actor input object example

```json
{
  "sourceId": "cyclonedx-dropwizard-sbom",
  "sourceUrl": "https://raw.githubusercontent.com/CycloneDX/bom-examples/master/SBOM/dropwizard-1.3.15/bom.json",
  "text": "",
  "currentText": "",
  "previousText": "",
  "items": [
    {
      "componentId": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.9.10",
      "name": "jackson-annotations",
      "version": "2.9.10",
      "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.9.10?type=jar",
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "c876f2e85d0f108a34cdd11ccc9d8d7875697367efc75bf10a89c2c26aee994c"
        }
      ]
    }
  ],
  "maxItems": 1,
  "maxRecordsPerTarget": 5,
  "maxTextBytes": 250000,
  "fetchTimeoutMs": 15000,
  "allowUrlFetch": false,
  "includeDigest": false,
  "includeReport": true,
  "dryRun": false,
  "debug": false
}
```

# Actor output Schema

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

No description

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

No description

## `summary` (type: `string`):

No description

## `markdownReport` (type: `string`):

No description

# 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/sbom-diff-reporter").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/sbom-diff-reporter").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/sbom-diff-reporter --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SBOM Diff Reporter",
        "description": "Compare two SPDX/CycloneDX SBOMs and summarize package, version, license, and risk-relevant changes.",
        "version": "1.0",
        "x-build-id": "2cPLeymCaoMDuvamY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/junipr~sbom-diff-reporter/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-junipr-sbom-diff-reporter",
                "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~sbom-diff-reporter/runs": {
            "post": {
                "operationId": "runs-sync-junipr-sbom-diff-reporter",
                "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~sbom-diff-reporter/run-sync": {
            "post": {
                "operationId": "run-sync-junipr-sbom-diff-reporter",
                "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": "Source Id input value.",
                        "default": "cyclonedx-dropwizard-sbom"
                    },
                    "sourceUrl": {
                        "title": "Source Url",
                        "type": "string",
                        "description": "Source Url input value.",
                        "default": "https://raw.githubusercontent.com/CycloneDX/bom-examples/master/SBOM/dropwizard-1.3.15/bom.json"
                    },
                    "text": {
                        "title": "Text",
                        "type": "string",
                        "description": "Text input value.",
                        "default": ""
                    },
                    "html": {
                        "title": "Html",
                        "type": "string",
                        "description": "Html input value."
                    },
                    "currentText": {
                        "title": "Current Text",
                        "type": "string",
                        "description": "Current Text input value.",
                        "default": ""
                    },
                    "previousText": {
                        "title": "Previous Text",
                        "type": "string",
                        "description": "Previous Text input value.",
                        "default": ""
                    },
                    "items": {
                        "title": "Items",
                        "type": "array",
                        "description": "Items input value.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "componentId": {
                                    "type": "string",
                                    "title": "Component Id",
                                    "description": "Component Id input value."
                                },
                                "id": {
                                    "type": "string",
                                    "title": "Id",
                                    "description": "Id input value."
                                },
                                "name": {
                                    "type": "string",
                                    "title": "Name",
                                    "description": "Name input value."
                                },
                                "version": {
                                    "type": "string",
                                    "title": "Version",
                                    "description": "Version input value."
                                },
                                "purl": {
                                    "type": "string",
                                    "title": "Purl",
                                    "description": "Purl input value."
                                },
                                "licenses": {
                                    "type": "array",
                                    "title": "Licenses",
                                    "description": "Licenses input value."
                                },
                                "scope": {
                                    "type": "string",
                                    "title": "Scope",
                                    "description": "Scope input value."
                                },
                                "hashes": {
                                    "type": "array",
                                    "title": "Hashes",
                                    "description": "Hashes input value."
                                }
                            }
                        },
                        "default": [
                            {
                                "componentId": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.9.10",
                                "name": "jackson-annotations",
                                "version": "2.9.10",
                                "purl": "pkg:maven/com.fasterxml.jackson.core/jackson-annotations@2.9.10?type=jar",
                                "licenses": [
                                    {
                                        "license": {
                                            "id": "Apache-2.0"
                                        }
                                    }
                                ],
                                "hashes": [
                                    {
                                        "alg": "SHA-256",
                                        "content": "c876f2e85d0f108a34cdd11ccc9d8d7875697367efc75bf10a89c2c26aee994c"
                                    }
                                ]
                            }
                        ]
                    },
                    "previousItems": {
                        "title": "Previous Items",
                        "type": "array",
                        "description": "Previous Items input value.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "componentId": {
                                    "type": "string",
                                    "title": "Component Id",
                                    "description": "Component Id input value."
                                },
                                "id": {
                                    "type": "string",
                                    "title": "Id",
                                    "description": "Id input value."
                                },
                                "name": {
                                    "type": "string",
                                    "title": "Name",
                                    "description": "Name input value."
                                },
                                "version": {
                                    "type": "string",
                                    "title": "Version",
                                    "description": "Version input value."
                                },
                                "purl": {
                                    "type": "string",
                                    "title": "Purl",
                                    "description": "Purl input value."
                                },
                                "licenses": {
                                    "type": "array",
                                    "title": "Licenses",
                                    "description": "Licenses input value."
                                },
                                "scope": {
                                    "type": "string",
                                    "title": "Scope",
                                    "description": "Scope input value."
                                },
                                "hashes": {
                                    "type": "array",
                                    "title": "Hashes",
                                    "description": "Hashes input value."
                                }
                            }
                        }
                    },
                    "topics": {
                        "title": "Topics",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Topics input value.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "expectedOptions": {
                        "title": "Expected Options",
                        "maxItems": 20,
                        "type": "array",
                        "description": "Expected Options input value.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "targets": {
                        "title": "Targets",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Targets input value.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "sourceId": {
                                    "type": "string",
                                    "title": "Source Id",
                                    "description": "Source Id input value."
                                },
                                "sourceUrl": {
                                    "type": "string",
                                    "title": "Source Url",
                                    "description": "Source Url input value."
                                },
                                "text": {
                                    "type": "string",
                                    "title": "Text",
                                    "description": "Text input value."
                                },
                                "html": {
                                    "type": "string",
                                    "title": "Html",
                                    "description": "Html input value."
                                },
                                "currentText": {
                                    "type": "string",
                                    "title": "Current Text",
                                    "description": "Current Text input value."
                                },
                                "previousText": {
                                    "type": "string",
                                    "title": "Previous Text",
                                    "description": "Previous Text input value."
                                },
                                "items": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "properties": {
                                            "componentId": {
                                                "type": "string",
                                                "title": "Component Id",
                                                "description": "Component Id input value."
                                            },
                                            "id": {
                                                "type": "string",
                                                "title": "Id",
                                                "description": "Id input value."
                                            },
                                            "name": {
                                                "type": "string",
                                                "title": "Name",
                                                "description": "Name input value."
                                            },
                                            "version": {
                                                "type": "string",
                                                "title": "Version",
                                                "description": "Version input value."
                                            },
                                            "purl": {
                                                "type": "string",
                                                "title": "Purl",
                                                "description": "Purl input value."
                                            },
                                            "licenses": {
                                                "type": "array",
                                                "title": "Licenses",
                                                "description": "Licenses input value."
                                            },
                                            "scope": {
                                                "type": "string",
                                                "title": "Scope",
                                                "description": "Scope input value."
                                            },
                                            "hashes": {
                                                "type": "array",
                                                "title": "Hashes",
                                                "description": "Hashes input value."
                                            }
                                        }
                                    },
                                    "title": "Items",
                                    "description": "Items input value."
                                },
                                "previousItems": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "properties": {
                                            "componentId": {
                                                "type": "string",
                                                "title": "Component Id",
                                                "description": "Component Id input value."
                                            },
                                            "id": {
                                                "type": "string",
                                                "title": "Id",
                                                "description": "Id input value."
                                            },
                                            "name": {
                                                "type": "string",
                                                "title": "Name",
                                                "description": "Name input value."
                                            },
                                            "version": {
                                                "type": "string",
                                                "title": "Version",
                                                "description": "Version input value."
                                            },
                                            "purl": {
                                                "type": "string",
                                                "title": "Purl",
                                                "description": "Purl input value."
                                            },
                                            "licenses": {
                                                "type": "array",
                                                "title": "Licenses",
                                                "description": "Licenses input value."
                                            },
                                            "scope": {
                                                "type": "string",
                                                "title": "Scope",
                                                "description": "Scope input value."
                                            },
                                            "hashes": {
                                                "type": "array",
                                                "title": "Hashes",
                                                "description": "Hashes input value."
                                            }
                                        }
                                    },
                                    "title": "Previous Items",
                                    "description": "Previous Items input value."
                                },
                                "topics": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    },
                                    "maxItems": 50,
                                    "title": "Topics",
                                    "description": "Topics input value."
                                },
                                "expectedOptions": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    },
                                    "maxItems": 20,
                                    "title": "Expected Options",
                                    "description": "Expected Options input value."
                                }
                            }
                        }
                    },
                    "urls": {
                        "title": "Urls",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Urls input value.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Max Items input value.",
                        "default": 1
                    },
                    "maxRecordsPerTarget": {
                        "title": "Max Records Per Target",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Max Records Per Target input value.",
                        "default": 5
                    },
                    "maxTextBytes": {
                        "title": "Max Text Bytes",
                        "minimum": 1000,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Max Text Bytes input value.",
                        "default": 250000
                    },
                    "fetchTimeoutMs": {
                        "title": "Fetch Timeout Ms",
                        "minimum": 1000,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Fetch Timeout Ms input value.",
                        "default": 15000
                    },
                    "allowUrlFetch": {
                        "title": "Allow Url Fetch",
                        "type": "boolean",
                        "description": "Allow Url Fetch input value.",
                        "default": false
                    },
                    "includeDigest": {
                        "title": "Include Digest",
                        "type": "boolean",
                        "description": "Include Digest input value.",
                        "default": false
                    },
                    "includeReport": {
                        "title": "Include Report",
                        "type": "boolean",
                        "description": "Include Report input value.",
                        "default": true
                    },
                    "dryRun": {
                        "title": "Dry Run",
                        "type": "boolean",
                        "description": "Dry Run input value.",
                        "default": false
                    },
                    "debug": {
                        "title": "Debug",
                        "type": "boolean",
                        "description": "Debug input value.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
