# Website Change Intelligence (`ib4ngz/website-change-intelligence`) Actor

Monitor websites with persistent semantic baselines, noise-resistant diffs, severity scoring, and rule-based intelligence.

- **URL**: https://apify.com/ib4ngz/website-change-intelligence.md
- **Developed by:** [Iqbal R](https://apify.com/ib4ngz) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 website intelligence reports

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### What does Website Change Intelligence do?

**Website Change Intelligence monitors websites and turns meaningful changes into structured, prioritized reports.** It shows what changed, where it changed, how important it is, and why it may matter.

Monitor public websites such as [apify.com](https://apify.com/) for content updates, SEO changes, new or removed pages, structured-data regressions, technology changes, crawlability issues, navigation updates, and contact-information changes.

The first successful run creates a baseline. Subsequent runs compare the latest website state with that baseline and return only meaningful changes. On Apify, you can schedule runs, access results through the API, export datasets, connect integrations, and monitor run performance.

### Why use Website Change Intelligence?

Website pages change constantly, but many changes are unimportant. This Actor helps separate meaningful business and technical signals from routine website noise.

Use it to:

- Monitor competitor pricing, products, services, features, and positioning.
- Detect new landing pages, enterprise offerings, or commercial announcements.
- Find SEO risks such as new `noindex` directives, title changes, or incorrect canonicals.
- Track structured-data coverage and validation regressions.
- Identify CMS, ecommerce, analytics, hosting, or marketing-technology changes.
- Monitor robots.txt, sitemaps, navigation, internal links, and orphan pages.
- Detect changes to public email addresses, phone numbers, and social profiles.
- Supply structured change data to dashboards, reports, and automation workflows.

### How to monitor a website

1. Open the Actor and go to the **Input** tab.
2. Add one or more websites to `startUrls`, for example `https://apify.com/`.
3. Choose the maximum number of pages and crawl depth.
4. Run the Actor to create the initial baseline.
5. Run it again later, or create an Apify schedule for continuous monitoring.
6. Review the website change score, top changes, insights, and detailed evidence in the **Output** tab.

Each website is monitored independently. Changes from different domains are never combined into the same report.

### Input

#### Main input fields

| Field                     | Description                                              | Default                                 |
| ------------------------- | -------------------------------------------------------- | --------------------------------------- |
| `startUrls`               | One or more websites to monitor                          | `https://apify.com/`                    |
| `maxPagesPerSite`         | Maximum pages checked per website                        | `1`                                     |
| `maxCrawlDepth`           | Maximum number of link levels followed                   | `0`                                     |
| `includeSubdomains`       | Include subdomains in the monitoring scope               | `false`                                 |
| `resetBaseline`           | Replace the saved baseline without reporting old changes | `false`                                 |
| `changeCategories`        | Categories included in detailed results                  | All categories                          |
| `ignoreSelectors`         | Page elements to exclude from comparison                 | Empty                                   |
| `queryParameterHandling`  | How URL query parameters are handled                     | Strip tracking parameters               |
| `sitemapDiscovery`        | Use available sitemaps to discover pages                 | `false`                                 |
| `browserFallback`         | Improve extraction for supported dynamic pages           | `false`                                 |
| `maxBrowserFallbackPages` | Maximum dynamic pages processed per website              | `0`                                     |
| `timeoutSecs`             | Request timeout in seconds                               | `45`                                    |
| `maxConcurrency`          | Maximum parallel page requests                           | `10`                                    |
| `maxRequestRetries`       | Retry attempts for failed requests                       | `2`                                     |
| `maxChangesPerSite`       | Maximum detailed changes returned per website            | `200`                                   |
| `baselineStoreName`       | Storage name used to retain monitoring history           | `website-change-intelligence-baselines` |
| `proxyConfiguration`      | Optional Apify Proxy or custom proxy settings            | Disabled                                |

#### Input example

```json
{
    "startUrls": [
        {
            "url": "https://apify.com/"
        }
    ],
    "maxPagesPerSite": 100,
    "maxCrawlDepth": 5,
    "includeSubdomains": false,
    "resetBaseline": false,
    "changeCategories": [
        "content",
        "seo",
        "schema",
        "technology",
        "robots",
        "sitemap",
        "links",
        "contact",
        "lifecycle"
    ],
    "ignoreSelectors": [".rotating-banner"],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
}
```

Use `ignoreSelectors` for page elements that change frequently but are not relevant to your monitoring goal, such as rotating promotional banners or personalized recommendations.

### Output

The Actor returns one main dataset item for each monitored website. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "url": "https://apify.com/",
    "siteId": "apify.com",
    "status": "changed",
    "previousSnapshotAt": "2026-09-01T00:00:00.000Z",
    "currentSnapshotAt": "2026-09-03T00:00:00.000Z",
    "comparisonAvailable": true,
    "baselinePersisted": true,
    "summary": {
        "pagesChecked": 82,
        "pagesChanged": 12,
        "pagesAdded": 2,
        "pagesRemoved": 1,
        "pagesRestored": 0,
        "totalChanges": 31,
        "critical": 0,
        "high": 4,
        "medium": 11,
        "low": 16,
        "info": 0,
        "websiteChangeScore": 67,
        "changeLevel": "significant"
    },
    "topChanges": [
        {
            "type": "content.major_rewrite",
            "url": "https://apify.com/pricing",
            "summary": "The page content was substantially rewritten.",
            "severity": "HIGH",
            "importanceScore": 81
        }
    ],
    "insights": [
        {
            "type": "pricing_change",
            "summary": "A possible pricing or commercial strategy change was detected.",
            "severity": "HIGH",
            "confidence": 0.82
        }
    ]
}
```

### Data table

| Field                 | Description                                                     |
| --------------------- | --------------------------------------------------------------- |
| `url`                 | Website that was monitored                                      |
| `siteId`              | Stable website identifier                                       |
| `status`              | Baseline created, baseline reset, unchanged, changed, or failed |
| `previousSnapshotAt`  | Date of the previous successful snapshot                        |
| `currentSnapshotAt`   | Date of the current snapshot                                    |
| `comparisonAvailable` | Whether a previous baseline was available for comparison        |
| `baselinePersisted`   | Whether the latest successful state was saved                   |
| `summary`             | Page counts, change counts, severity totals, and website score  |
| `topChanges`          | Highest-priority changes                                        |
| `insights`            | Higher-level explanations based on related changes              |
| `changes`             | Detailed changes with evidence and scores                       |
| `pages`               | Summary of pages checked during the run                         |
| `crawl`               | Coverage and reliability information                            |
| `warnings`            | Important limitations affecting the report                      |

### Change categories

The Actor can report:

- **Content:** major rewrites, changed headings, and meaningful sections added or removed.
- **SEO:** title, meta description, canonical, H1, hreflang, Open Graph, Twitter metadata, and indexability.
- **Structured data:** schema additions, removals, type changes, property changes, and validation regressions.
- **Technology:** detected platforms, analytics tools, ecommerce systems, hosting, and possible migrations.
- **Crawlability:** robots.txt rules, site-wide restrictions, and sitemap changes.
- **Site structure:** navigation links, internal links, and orphan-page changes.
- **Contact:** public email, telephone, and social-profile changes.
- **Page lifecycle:** pages added, removed, redirected, or restored.

### Severity and website change score

Every change receives a severity:

- `INFO`: useful context with little direct risk.
- `LOW`: a minor change worth recording.
- `MEDIUM`: a meaningful change that may need review.
- `HIGH`: an important business, SEO, or technical change.
- `CRITICAL`: a potentially severe site-wide or high-value-page issue.

The `importanceScore` ranks individual changes from 0 to 100. It considers the type of change, the importance of the affected page, the size of the change, and the confidence of the evidence.

The `websiteChangeScore` summarizes the overall level of activity:

| Score  | Change level |
| ------ | ------------ |
| 0-10   | Negligible   |
| 11-30  | Minor        |
| 31-60  | Moderate     |
| 61-80  | Significant  |
| 81-100 | Major        |

The score is normalized so larger websites do not automatically receive higher scores simply because they contain more pages.

### How much does it cost to monitor website changes?

Cost depends on the number of websites, pages per website, crawl depth, response time, proxy usage, and the amount of dynamic content.

For predictable costs:

- Begin with 20-100 pages per website.
- Use a crawl depth that matches the pages you actually need.
- Add precise start URLs for important sections.
- Keep enhanced dynamic-page processing limited.
- Use Apify run limits and schedules that match your monitoring frequency.

Small monitoring jobs may fit within Apify's free usage allowance. Check your current Apify plan and platform pricing for exact limits.

### Tips and advanced options

- Keep the same `baselineStoreName` when you want monitoring history to continue.
- Use `resetBaseline` after intentionally changing scope or comparison settings.
- Add unstable page elements to `ignoreSelectors` to reduce irrelevant alerts.
- Keep tracking-parameter removal enabled unless query parameters represent separate pages.
- Avoid sharply reducing `maxPagesPerSite` between runs because lower coverage can reduce comparison confidence.
- Use consistent proxy geography when a website serves regional content.
- Review `crawl.inventoryConfidence` and `warnings` before acting on large inventory changes.

Temporary request failures do not automatically mark pages as removed. When a run does not have enough evidence, the report lowers its confidence and preserves the previous verified state.

### FAQ, disclaimers, and support

#### Why does the first run show no changes?

The first successful run establishes the reference baseline. A later run is required before changes can be calculated.

#### What happens when I reset the baseline?

When `resetBaseline` is enabled, the latest successful website state replaces the saved reference. The Actor does not report misleading changes against the discarded baseline.

#### Can it monitor dynamic websites?

Many public dynamic pages are supported. Coverage can still vary when content requires authentication, user interaction, a specific location, or a long-running session.

#### Why was a removed page not reported?

The Actor only reports removal when there is strong evidence. Timeouts, server errors, access blocks, crawl limits, and incomplete discovery can reduce confidence and suppress removal events.

#### Are all website changes detectable?

No. Authentication, bot protection, personalization, regional variants, experiments, and inaccessible pages can affect results. Technology and business insights are evidence-based estimates and should be reviewed before making important decisions.

#### Is website monitoring legal?

Only monitor websites you are permitted to access. Follow the website's terms, robots policies, applicable law, privacy requirements, and reasonable request rates.

For bugs, questions, or feature requests, use the Actor's **Issues** tab. Custom monitoring rules, reporting formats, integrations, and scoring models can be developed as tailored solutions.

# Actor input Schema

## `startUrls` (type: `array`):

Each distinct website becomes an isolated monitoring target.

## `maxPagesPerSite` (type: `integer`):

Hard safety limit for pages scheduled for each website.

## `maxCrawlDepth` (type: `integer`):

Maximum number of link hops from a seed URL.

## `includeSubdomains` (type: `boolean`):

Allow crawling hostnames below the normalized website domain.

## `resetBaseline` (type: `boolean`):

Replace the stored baseline without comparing it to the previous one.

## `changeCategories` (type: `array`):

Only return events in the selected categories.

## `ignoreSelectors` (type: `array`):

CSS selectors removed before text extraction and fingerprinting.

## `queryParameterHandling` (type: `string`):

Strip common tracking parameters, strip all parameters, or keep every parameter.

## `sitemapDiscovery` (type: `boolean`):

Use robots.txt sitemap declarations and common sitemap locations.

## `browserFallback` (type: `boolean`):

Render only pages whose HTTP result looks like a client-side shell.

## `maxBrowserFallbackPages` (type: `integer`):

Maximum number of dynamic pages that may receive enhanced rendering.

## `timeoutSecs` (type: `integer`):

Timeout in seconds for network requests.

## `maxConcurrency` (type: `integer`):

Maximum concurrent HTTP requests.

## `maxRequestRetries` (type: `integer`):

Retries for failed page requests.

## `maxChangesPerSite` (type: `integer`):

Caps the detailed changes array; summary counts still include every detected event.

## `baselineStoreName` (type: `string`):

Named key-value store used across Actor runs.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy or custom proxy configuration.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com/"
    }
  ],
  "maxPagesPerSite": 1,
  "maxCrawlDepth": 0,
  "includeSubdomains": false,
  "resetBaseline": false,
  "changeCategories": [
    "content",
    "seo",
    "schema",
    "technology",
    "robots",
    "sitemap",
    "links",
    "contact",
    "lifecycle"
  ],
  "ignoreSelectors": [],
  "queryParameterHandling": "strip-tracking",
  "sitemapDiscovery": false,
  "browserFallback": false,
  "maxBrowserFallbackPages": 0,
  "timeoutSecs": 45,
  "maxConcurrency": 10,
  "maxRequestRetries": 2,
  "maxChangesPerSite": 200,
  "baselineStoreName": "website-change-intelligence-baselines",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "startUrls": [
        {
            "url": "https://apify.com/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ib4ngz/website-change-intelligence").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 = { "startUrls": [{ "url": "https://apify.com/" }] }

# Run the Actor and wait for it to finish
run = client.actor("ib4ngz/website-change-intelligence").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 '{
  "startUrls": [
    {
      "url": "https://apify.com/"
    }
  ]
}' |
apify call ib4ngz/website-change-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ib4ngz/website-change-intelligence"
        }
    }
}

```

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/SLrIbCv0qLaFGackx/builds/ZN08KLaNv0fv41lLL/openapi.json
