# Third-Party Script & Tracker Change Monitor (`produkdigitalali/third-party-script-tracker-change-monitor`) Actor

Compare browser-observed scripts, tracker host matches and loading attributes across scheduled Playwright runs with persistent baselines and hashed paths.

- **URL**: https://apify.com/produkdigitalali/third-party-script-tracker-change-monitor.md
- **Developed by:** [ProdukDigitalAli](https://apify.com/produkdigitalali) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$12.00 / 1,000 rendered script page 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does this Playwright script monitor do?

**Detect script and tracker integration changes after website releases.** This Actor renders supplied public pages in Chromium, observes script requests and external script DOM attributes, then compares them with the last complete baseline. It includes script elements injected during the observation window.

Use it alongside Browser Network & HAR Inspector and Cookie & Session Health Monitor. Apify provides API calls, scheduled runs, dataset export and integrations. Try the prefilled https://example.com/ page for a safe initial baseline.

### Why use it?

Investigate script additions or removals after a release, tag-manager rollout, payment integration or vendor change. Reports include loading attributes and integrity fingerprints. Provider matches identify a small set of known hosts including Google Tag Manager, Meta Pixel, Clarity, Hotjar and OneTrust. These are observations, not compliance verdicts.

### How to use it

1. Enter one to three public URLs.
2. Use a stable monitorKey such as release-homepage.
3. Run once to create a baseline.
4. Run later with identical URLs and observation settings.
5. Inspect changeStatus and added, removed or changed IDs.

Each page has a fresh context. No login/session input or consent clicks. Main-frame DOM attributes are collected; script request observations may include child frames.

### Input

urls: 1-3 HTTP(S) pages.
monitorKey: 1-64 letters/digits/underscore/hyphen; default default.
settleMs: default 1500, maximum 5000.
navigationTimeoutSeconds: default 25, maximum 45.
maxScriptsPerPage: default 100, maximum 200.
Private destinations, credentials and nonstandard ports are rejected. Changing URLs or observation settings starts a separate baseline identity.

### Output

CHECKED rows include scripts, changeStatus, added, removed, changed, finalPageChanged and timing/network evidence. First complete observations use BASELINE_CREATED; identical observations UNCHANGED. INCOMPLETE reports preserve prior baselines. ERROR rows contain fixed safe codes.
Script/page paths and integrity values are hashed. No queries, raw paths, bodies, inline code, cookie values or authorization data persist. Hashes are identifiers rather than encryption: known path guesses can be matched.
Download results as JSON, CSV, HTML or Excel. OUTPUT gives requested, succeeded, incomplete, failed and charged. Persistent baselines use a separate Actor-specific named key-value store.

### Pricing and limits

Proposed standard PPE USD 0.012 per complete stored page check, including initial and unchanged complete observations. Error and incomplete reports are free. Actual price appears in Pricing after configuration; platform usage depends on the plan.
Both dataset and baseline are stored before charge. chargeEligible is an eligibility flag; OUTPUT and platform events confirm charges.

### Limitations and support

Requests do not prove successful script execution. Query-only version changes are ignored. Multiple instances at one origin/path collapse. Late injections, inline/eval and worker-only imports are not inspected. Images/fonts/media and mutation requests are blocked, so results describe a bounded diagnostic browser.
CrossOrigin means different origin, not ownership under the public suffix list. Schedule serial runs to avoid baseline races. Contact the developer through Issues with sanitized examples.

# Changelog

This Actor's version history is a separate document: https://apify.com/produkdigitalali/third-party-script-tracker-change-monitor/changelog.md

# Actor input Schema

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

One to three pages to visit in fresh Chromium contexts.

## `monitorKey` (type: `string`):

Reuse this label for comparisons; 1-64 letters, numbers, underscores or hyphens.

## `settleMs` (type: `integer`):

Wait after DOM readiness before observing storage keys.

## `navigationTimeoutSeconds` (type: `integer`):

Maximum time for initial navigation.

## `maxScriptsPerPage` (type: `integer`):

Over-cap results are incomplete and free, and preserve baselines.

## Actor input object example

```json
{
  "urls": [
    "https://example.com/"
  ],
  "monitorKey": "default",
  "settleMs": 1500,
  "navigationTimeoutSeconds": 25,
  "maxScriptsPerPage": 100
}
```

# Actor output Schema

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

No description

## `results` (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 = {
    "urls": [
        "https://example.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("produkdigitalali/third-party-script-tracker-change-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 = { "urls": ["https://example.com/"] }

# Run the Actor and wait for it to finish
run = client.actor("produkdigitalali/third-party-script-tracker-change-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://example.com/"
  ]
}' |
apify call produkdigitalali/third-party-script-tracker-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,produkdigitalali/third-party-script-tracker-change-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/icZaKtTxt86C9Y9ZP/builds/siPSpUprGJ7Df99Ey/openapi.json
