# WatchTower – Website Change & Price Monitor (`hichemdev/watchtower-website-change-monitor`) Actor

Monitor any website for changes - track competitor prices, stock/availability, and content updates with field-level precision. Get instant webhook alerts on any change, a price increase or drop, or when a keyword appears. Ideal for price monitoring, competitor intelligence, and compliance.

- **URL**: https://apify.com/hichemdev/watchtower-website-change-monitor.md
- **Developed by:** [Hichem Ben Moussa](https://apify.com/hichemdev) (community)
- **Categories:** Business, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## WatchTower – Website Change & Price Monitor 🔔

**Monitor any website for changes — automatically.** WatchTower watches a list of URLs and tells you the moment a **price**, **stock status**, **headline**, **policy**, or any on-page value changes. It tracks *specific fields* (not noisy full-page HTML), so you only get alerts that matter — and it sends them straight to your **webhook, Slack, Zapier, or Make**.

Perfect for **competitor price monitoring**, **stock/availability tracking**, **content change detection**, and **compliance monitoring**.

### ✨ Features

- **Field-level monitoring** — target one element with a CSS selector (e.g. `.price`) or watch the whole page.
- **Smart triggers** — alert on *any* change, only on a price **increase**, a price **decrease**, or when a **keyword appears** (e.g. "in stock").
- **Numeric awareness** — parse prices/quantities and report the exact delta (e.g. `-$30.00`).
- **Change history** — every run stores a baseline, then reports only what's new.
- **Webhook alerts** — POST every change to Slack, Zapier, Make, or your own API.
- **Runs on a schedule** — set it to run hourly/daily and it becomes a hands-off monitor.
- **No proxy required** for most sites — cheap to run.

### 🎯 Use cases

- **E-commerce sellers** — track competitor prices and get alerted on drops before you lose the sale.
- **Deal & coupon sites** — detect price drops and back-in-stock events automatically.
- **Brands & MAP compliance** — watch reseller pages for policy-breaking prices.
- **Procurement / revenue teams** — monitor supplier and competitor pricing.
- **SEO & marketing** — get notified when a competitor changes a title, CTA, or landing-page copy.
- **Compliance & legal** — track changes to terms, policies, or regulatory pages.

### 📥 Input

| Field | Type | Description |
|---|---|---|
| `watches` | array | One entry per thing to monitor (see below). **Required.** |
| `onlyReportChanges` | boolean | Only output rows where something changed. Default `true`. |
| `webhookUrl` | string | Optional. Receives a JSON POST for every change. |
| `proxyConfiguration` | object | Optional. Off by default. |

Each **watch** entry:

```json
{
  "url": "https://shop.com/product/123",
  "selector": ".price-now",
  "label": "Competitor price",
  "extract": "number",
  "notifyOn": "decrease",
  "keyword": "in stock"
}
```

- `url` *(required)* — page to check.
- `selector` — CSS selector for one element. Omit to watch the whole page text.
- `label` — friendly name shown in output/alerts.
- `extract` — `text` (default), `number` (parses a price/quantity), or `html`.
- `notifyOn` — `change` (default), `increase`, `decrease`, or `contains`.
- `keyword` — required when `notifyOn` is `contains`.

### 📤 Output

```json
{
  "watchId": "a1b2c3d4e5f6a7b8",
  "label": "Competitor price",
  "url": "https://shop.com/product/123",
  "selector": ".price-now",
  "extract": "number",
  "previousValue": 129.0,
  "currentValue": 99.0,
  "changed": true,
  "changeType": "decrease",
  "numericDelta": -30.0,
  "isFirstRun": false,
  "checkedAt": "2026-07-14T09:00:00.000Z"
}
```

### 🔌 Integrations & scheduling

- **Schedule** it in Apify (hourly/daily) so monitoring runs automatically.
- Set `webhookUrl` to a **Slack** incoming webhook, a **Zapier**/**Make** catch-hook, or your own endpoint to get instant alerts.
- Export results to **CSV, Excel, JSON, or Google Sheets** from the dataset, or pull them via the Apify API.

### ❓ FAQ

**Does it work on JavaScript-heavy pages?** v1 fetches static HTML, which covers most price/stock/content pages. JavaScript rendering is on the roadmap.

**Do I need a proxy?** No — most public pages work without one. A proxy is optional for sites that block plain requests.

**How is it priced?** Pay per result — you're charged per URL checked. No subscription. Run it as often as you like and only pay for the checks you use.

**Can it monitor multiple pages at once?** Yes — add as many `watches` entries as you need in a single run.

### 🗺️ Roadmap

- JavaScript rendering for dynamic / SPA pages
- Visual / screenshot diffing
- Multiple fields per URL
- AI "summarize what changed"
- Built-in email digests

# Actor input Schema

## `watches` (type: `array`):

One entry per thing you want to watch. Each entry supports:
• url (required)
• selector – CSS selector to watch just one element (e.g. ".price"). Omit to watch the whole page's text.
• label – a friendly name for this watch.
• extract – "text" (default), "number" (parses a price/quantity), or "html".
• notifyOn – "change" (default), "increase", "decrease", or "contains".
• keyword – required when notifyOn is "contains" (e.g. "in stock").

## `onlyReportChanges` (type: `boolean`):

Recommended ON for alerting. On the very first run each watch is stored as a baseline and always shown so you can confirm the starting values.

## `webhookUrl` (type: `string`):

If set, WatchTower sends a JSON POST here for every detected change. Works with Slack, Zapier, Make, or your own endpoint.

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

Optional. Most public pages need no proxy. Datacenter proxy is included in your Apify plan if a site blocks plain requests.

## Actor input object example

```json
{
  "watches": [
    {
      "url": "https://example.com",
      "label": "Example homepage headline",
      "selector": "h1",
      "extract": "text",
      "notifyOn": "change"
    }
  ],
  "onlyReportChanges": true,
  "proxyConfiguration": {
    "useApifyProxy": 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 = {
    "watches": [
        {
            "url": "https://example.com",
            "label": "Example homepage headline",
            "selector": "h1",
            "extract": "text",
            "notifyOn": "change"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hichemdev/watchtower-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 = { "watches": [{
            "url": "https://example.com",
            "label": "Example homepage headline",
            "selector": "h1",
            "extract": "text",
            "notifyOn": "change",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("hichemdev/watchtower-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 '{
  "watches": [
    {
      "url": "https://example.com",
      "label": "Example homepage headline",
      "selector": "h1",
      "extract": "text",
      "notifyOn": "change"
    }
  ]
}' |
apify call hichemdev/watchtower-website-change-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/chbZZIBBghbshLIPk/builds/uWBLyMxH3C04LHrCQ/openapi.json
