# Website Change Monitor - Automated Change Tracking (`petr.volf/website-change-monitor`) Actor

Monitors web pages on a schedule and sends a Markdown webhook notification when the LLM detects a change relevant to your intent.

- **URL**: https://apify.com/petr.volf/website-change-monitor.md
- **Developed by:** [Petr Volf](https://apify.com/petr.volf) (community)
- **Categories:** AI, Automation, Integrations
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

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

### Website Change Monitor - Track Website Changes

Get notified when something changes on any website — automatically, on a schedule you control.

### What it does

Set it up once, and the Actor keeps an eye on the pages you care about. Whenever something relevant changes — a price, a product, a job posting, a policy update — you get notified. No manual checking required.

You describe what you want to watch in plain English. The Actor uses that description to filter out noise (ads, navigation updates, timestamps) and only alerts you when something that actually matters has changed.

### How to set it up

1. **Paste the URLs** you want to monitor — or just describe what you're looking for and let the Actor find the right pages for you.
2. **Write your intent** — one or two sentences explaining what kind of change you care about (see examples below).
3. **Set how often to check** — every hour, every day, or whatever suits your needs.
4. **Add a webhook** (optional) — get an instant notification in Slack, email, or any other tool when a change is detected.
5. **Run the Actor** — it will take a first snapshot and start monitoring from there.

### Input

| Field | Description |
|---|---|
| **Intent** | What you want to watch for, in plain English. This is the most important setting — be specific. |
| **URLs** | The pages to monitor. Leave empty to let the Actor find relevant pages based on your intent. |
| **Interval** | How often to check for changes, in minutes. Default is every 60 minutes. |
| **Auto-schedule** | When turned on, the Actor sets up its own recurring schedule so you don't have to. On by default. |
| **Schedule name** | A name for the schedule. |
| **Auto-fill URLs** | Let the Actor search for relevant pages based on your intent. Turns on automatically if no URLs are provided. |
| **Webhook** | A URL to send a notification to when a change is detected. |
| **Webhook headers** | Authentication headers for your webhook endpoint, if required. |

#### Writing a good intent

Think of the intent as instructions to a colleague: tell them exactly what to look out for.

**Good examples:**
- "Tell me if the pricing on the Pro or Business plan changes."
- "Alert me when new engineering jobs are posted."
- "Let me know if they add or remove anything from the API docs."

**Too vague:**
- "Monitor changes" — this will catch everything, including things you don't care about.

### Getting notified

Connect a webhook to receive alerts in real time. Paste your webhook URL into the **Webhook** field and the Actor will send a message whenever a relevant change is found.

Works out of the box with Slack, Make, Zapier, PagerDuty, and any service that accepts HTTP webhooks.

The request body is a plain Markdown summary of the detected changes, sent with `Content-Type: text/markdown`. Example:

```markdown
- https://example.com/pricing: **Pro plan** price increased from $49/mo to $59/mo.
- https://example.com/business: Removed the "free trial" mention from the hero section.
````

### Output

Every detected change is saved to the dataset so you have a full history. Each record includes the page URL, when the change was detected, and a description of what changed.

# Actor input Schema

## `intent` (type: `string`):

Natural language description of what to focus on when making a diff.

## `interval` (type: `integer`):

How often the Actor checks for changes, in minutes. For example, 60 means the page is checked once an hour.

## `scheduleName` (type: `string`):

Name of the auto-created schedule. If a schedule with this name already exists, it will not be re-created.

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

URLs to scrape.

## `autoschedule` (type: `boolean`):

Whether the Actor should set up its own schedule.

## `autoFillUrls` (type: `boolean`):

When enabled, the Actor runs a Google search using the intent and appends 1–5 relevant URLs to any explicitly provided ones. Results are cached per intent so repeated runs skip the search. Requires 'intent' to be set. Automatically switches to true if no URLs are provided.

## `webhook` (type: `string`):

Webhook URL to notify on diff.

## `headers` (type: `object`):

Headers to send with the webhook POST request, as a JSON object of header name to value.

## Actor input object example

```json
{
  "interval": 60,
  "scheduleName": "diff-actor",
  "urls": [],
  "autoschedule": true,
  "autoFillUrls": false
}
```

# 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("petr.volf/website-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("petr.volf/website-change-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 petr.volf/website-change-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Change Monitor - Automated Change Tracking",
        "description": "Monitors web pages on a schedule and sends a Markdown webhook notification when the LLM detects a change relevant to your intent.",
        "version": "0.0",
        "x-build-id": "uGrzfVDqZUZfNaTHs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/petr.volf~website-change-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-petr.volf-website-change-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/petr.volf~website-change-monitor/runs": {
            "post": {
                "operationId": "runs-sync-petr.volf-website-change-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/petr.volf~website-change-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-petr.volf-website-change-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",
                "required": [
                    "intent"
                ],
                "properties": {
                    "intent": {
                        "title": "Intent",
                        "type": "string",
                        "description": "Natural language description of what to focus on when making a diff."
                    },
                    "interval": {
                        "title": "Interval (minutes)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How often the Actor checks for changes, in minutes. For example, 60 means the page is checked once an hour.",
                        "default": 60
                    },
                    "scheduleName": {
                        "title": "Schedule name",
                        "type": "string",
                        "description": "Name of the auto-created schedule. If a schedule with this name already exists, it will not be re-created.",
                        "default": "diff-actor"
                    },
                    "urls": {
                        "title": "URLs",
                        "type": "array",
                        "description": "URLs to scrape.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "autoschedule": {
                        "title": "Auto-schedule",
                        "type": "boolean",
                        "description": "Whether the Actor should set up its own schedule.",
                        "default": true
                    },
                    "autoFillUrls": {
                        "title": "Auto-fill URLs",
                        "type": "boolean",
                        "description": "When enabled, the Actor runs a Google search using the intent and appends 1–5 relevant URLs to any explicitly provided ones. Results are cached per intent so repeated runs skip the search. Requires 'intent' to be set. Automatically switches to true if no URLs are provided.",
                        "default": false
                    },
                    "webhook": {
                        "title": "Webhook",
                        "type": "string",
                        "description": "Webhook URL to notify on diff."
                    },
                    "headers": {
                        "title": "Webhook headers",
                        "type": "object",
                        "description": "Headers to send with the webhook POST request, as a JSON object of header name to value."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
