# XML Sitemap Monitor & Change Detector BR (`joaosbp/sitemap-change-detector-br`) Actor

Monitor XML sitemaps, sitemap indexes, new URLs, removed URLs, and lastmod changes with structured JSON diffs for SEO automation.

- **URL**: https://apify.com/joaosbp/sitemap-change-detector-br.md
- **Developed by:** [João Victor](https://apify.com/joaosbp) (community)
- **Categories:** SEO tools, Automation, Developer tools
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 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

## XML Sitemap Monitor & Change Detector BR

![Sitemap Change Detector BR](./assets/store-preview-banner.png)

**Detect new URLs, removed URLs, child sitemap changes, and `lastmod` updates from public XML sitemaps — with persistent snapshots and structured JSON diffs.**

![Apify Actor](https://img.shields.io/badge/Apify-Actor-00c2ff) ![XML Sitemap](https://img.shields.io/badge/XML-Sitemap-22c55e) ![SEO Automation](https://img.shields.io/badge/SEO-Automation-8b5cf6) ![HTTP First](https://img.shields.io/badge/HTTP--first-low%20cost-f59e0b) ![Brazil](https://img.shields.io/badge/BR-SEO%20Agencies-39ff14)

Use this Actor to monitor client, competitor, publisher, e-commerce, SaaS, and Brazilian business websites through their XML sitemaps. Run it on a schedule, compare against the previous snapshot, and send the clean diff to Slack, Make, n8n, Zapier, dashboards, crawlers, or SEO reports.

### Why use it?

| Pain | What this Actor gives you |
|---|---|
| “Did my client accidentally remove important URLs?” | Added/removed URL counts and exact diff lines. |
| “Did a competitor publish new pages?” | New sitemap URLs detected automatically. |
| “Did content freshness change?” | `lastmod` changes captured in the normalized snapshot. |
| “I need this in automation, not spreadsheets.” | Dataset/API output ready for webhooks and workflows. |
| “I need low cost at scale.” | HTTP-first sitemap parsing; browser/proxy disabled by default. |

### Best for

| User | Use case |
|---|---|
| SEO agencies | Monitor multiple client and competitor sitemaps daily. |
| Technical SEO consultants | Detect crawl/indexation signals without manually opening XML files. |
| Content teams | Track new blog posts, docs, categories, landing pages, and removals. |
| SaaS founders | Watch competitor launches through sitemap activity. |
| Automation builders | Trigger crawlers, Slack alerts, Sheets, Airtable, BI, or indexing workflows. |
| Brazilian agencies | Monitor `.com.br`, Gov/portal, SaaS, marketplace, and local-business websites. |

### How it works

```text
Sitemap URL
  → XML fetch
  → urlset / sitemapindex parser
  → normalized snapshot
  → compare with previous run
  → structured Dataset/API diff
````

### What it detects

| Sitemap feature | Supported |
|---|---:|
| XML `<urlset>` | ✅ |
| XML `<sitemapindex>` | ✅ |
| URL count | ✅ |
| child sitemap count | ✅ |
| added URLs | ✅ |
| removed URLs | ✅ |
| added/removed child sitemaps | ✅ |
| `lastmod` changes | ✅ |
| `changefreq` and `priority` in snapshot | ✅ |
| item-level errors without failing the whole run | ✅ |
| private/internal URL blocking | ✅ |

### Quick start

1. Add one or more public XML sitemap URLs.
2. Run once to create the baseline snapshot.
3. Run again later, or create an Apify Schedule.
4. Use `emitMode: "CHANGES_ONLY"` for alert-style automations.
5. Connect Dataset results to Apify API, webhooks, Make, n8n, Zapier, Slack, Sheets, Airtable, or your own backend.

#### Minimal input

```json
{
  "startUrls": [
    { "url": "https://apify.com/sitemap.xml" }
  ],
  "extractionMode": "SITEMAP_XML",
  "maxItems": 10,
  "emitMode": "ALL"
}
```

#### Recommended scheduled input

```json
{
  "startUrls": [
    { "url": "https://example.com/sitemap.xml" },
    { "url": "https://example.com/post-sitemap.xml" }
  ],
  "snapshotStoreName": "my-client-sitemap-monitor",
  "extractionMode": "SITEMAP_XML",
  "emitMode": "CHANGES_ONLY",
  "useBrowser": false,
  "proxy": { "useApifyProxy": false }
}
```

### Example output

```json
{
  "url": "https://example.com/sitemap.xml",
  "finalUrl": "https://example.com/sitemap.xml",
  "title": "Sitemap: 152 URLs",
  "statusCode": 200,
  "changeType": "CHANGED",
  "severity": "MEDIUM",
  "isSignificant": true,
  "changeRatio": 0.08,
  "sitemapType": "urlset",
  "urlCount": 152,
  "sitemapCount": 0,
  "addedUrlCount": 3,
  "removedUrlCount": 1,
  "currentUrls": ["https://example.com/", "https://example.com/pricing"],
  "currentSitemaps": [],
  "addedText": "URL https://example.com/new-page LASTMOD 2026-07-08",
  "removedText": "URL https://example.com/old-page LASTMOD 2026-06-01",
  "previousFetchedAt": "2026-07-07T08:00:00.000Z",
  "currentFetchedAt": "2026-07-08T08:00:00.000Z",
  "snapshotKey": "SNAPSHOT_...",
  "source": "http",
  "error": null
}
```

### Dataset views

| View | Purpose |
|---|---|
| `Sitemap overview` | Change status, sitemap type, URL counts, added/removed counts, and errors. |
| `Current URLs` | Current extracted URLs and child sitemap URLs. |
| `Diff details` | Added/removed sitemap lines and timestamps. |
| `Technical details` | Final URL, status, hashes, snapshot key, source mode, and errors. |

### Common workflows

#### Daily client SEO monitoring

1. Add all client sitemap URLs.
2. Save input as an Apify Task.
3. Schedule daily or weekly runs.
4. Send only changed rows to Slack/Sheets/Looker Studio.

#### Competitor publishing monitor

1. Add competitor sitemap or sitemap index URLs.
2. Run once to create a baseline.
3. Use `CHANGES_ONLY` mode.
4. Alert when new product, pricing, docs, category, or blog URLs appear.

#### Brazil-focused agency reporting

Use it to track Brazilian client and competitor websites, including institutional sites, SaaS, marketplaces, content portals, local businesses, and public websites that expose standard XML sitemaps.

### Accuracy notes

- This Actor expects valid public XML sitemaps.
- It supports normal sitemap namespaces, sitemap indexes, escaped XML entities, relative URLs, `lastmod`, `changefreq`, and `priority`.
- It intentionally does not recursively crawl child sitemaps yet. If you need URL-level diffs for each child sitemap, add those child sitemap URLs directly as inputs.
- If a server blocks public requests with `403` or returns `404`, the Actor records an item-level error and continues.

### Cost controls

- HTTP mode is default and cheapest.
- Proxy is disabled by default.
- Browser rendering is unnecessary for normal XML sitemaps.
- `maxContentBytes`, `maxItems`, `maxConcurrency`, retries, and per-item errors protect cost and memory.
- Private/internal URLs are blocked by default for SSRF protection.

### API usage

Run this Actor through Apify API, CLI, Tasks, Schedules, webhooks, Make, n8n, Zapier, or your own backend.

### Pricing guidance

Keep regular platform usage while validating real-world demand and cost. After representative runs, consider Pay Per Event only for successful useful outputs, for example:

- `sitemap-checked`
- `sitemap-change-detected`
- `url-added-or-removed`

### FAQ

#### Does this Actor require login?

No. It is designed for public XML sitemaps.

#### Does it recursively crawl sitemap indexes?

Not yet. It detects child sitemap URLs in sitemap indexes and reports when the index changes. Add child sitemap URLs directly when you want detailed URL-level monitoring for each child sitemap.

#### Does it use browser automation?

Not by default. XML sitemaps should be fetched through cheap HTTP mode.

#### Can it detect updated pages?

Yes, when the sitemap exposes changed `lastmod` values. A changed `lastmod` line changes the snapshot and can trigger a diff.

#### Can I schedule it?

Yes. Save your input as an Apify Task and attach an Apify Schedule.

#### Can I use the output in automations?

Yes. Results are written to an Apify Dataset and can be consumed by API, webhooks, Make, n8n, Zapier, Slack, Airtable, Sheets, BI tools, crawlers, or internal workflows.

### Search terms

sitemap change detector, sitemap monitor, XML sitemap monitor, SEO sitemap tracker, sitemap diff API, new URLs detector, removed URLs monitor, sitemap index parser, SEO automation, Brazil SEO tools, monitorar sitemap, monitor de sitemap, auditoria SEO Brasil, sitemap XML, URLs removidas, URLs novas

### Support

If you need a custom version, open an issue or contact the Actor maintainer through Apify.

# Actor input Schema

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

Public XML sitemap URLs. Supports urlset sitemaps and sitemap indexes. Use one snapshot store per monitoring project.

## `snapshotStoreName` (type: `string`):

Named key-value store used to persist previous snapshots across runs. Use a different store per monitoring project.

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

Safety limit for how many URLs are processed in one run.

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

Maximum number of URLs processed in parallel. Keep low for browser mode to reduce memory and compute cost.

## `extractionMode` (type: `string`):

Choose sitemap XML for normal sitemap monitoring. Other modes are fallback options for unusual text sitemap sources.

## `contentSelector` (type: `string`):

Optional CSS selector to monitor only one part of the page, such as main, article, .pricing, or #content. Leave empty to monitor the body.

## `excludeSelectors` (type: `array`):

CSS selectors removed before comparison. Use this for navbars, footers, cookie banners, ads, timestamps, or dynamic widgets.

## `ignoreRegexes` (type: `array`):

Advanced: regex patterns removed from content before comparison. Useful for dates, counters, session IDs, ad slots, or personalization noise.

## `ignoreWhitespace` (type: `boolean`):

Collapse repeated whitespace before comparison so formatting-only changes do not create noisy alerts.

## `ignoreCase` (type: `boolean`):

Convert content to lowercase before comparison so capitalization-only changes are ignored.

## `ignoreNumbers` (type: `boolean`):

Replace numbers with a placeholder before comparison. Keep disabled when monitoring prices, quantities, metrics, or version numbers.

## `ignoreDates` (type: `boolean`):

Replace common date formats with a placeholder before comparison so last-updated timestamps do not create noisy alerts.

## `significantChangeThreshold` (type: `number`):

Minimum changed-content ratio required to mark a change as significant. 0.05 means roughly 5% of comparable text changed.

## `emitMode` (type: `string`):

ALL writes a row for every monitored URL. CHANGES\_ONLY writes first-seen and changed pages. SIGNIFICANT\_ONLY writes only significant changes and errors.

## `saveHtmlSnapshot` (type: `boolean`):

Store raw HTML in the snapshot key-value store. Useful for evidence, but increases storage usage.

## `updateSnapshots` (type: `boolean`):

Disable for dry runs. If disabled, the Actor compares against current stored snapshots without replacing them.

## `maxDiffCharacters` (type: `integer`):

Maximum number of characters kept in addedText and removedText fields to keep dataset rows compact.

## `useBrowser` (type: `boolean`):

Render pages with Playwright for JavaScript-heavy sites. Disabled by default to keep runs fast and cheap.

## `maxRetries` (type: `integer`):

Number of retry attempts for transient network, timeout, 429, or 5xx errors.

## `requestTimeoutSecs` (type: `integer`):

Maximum time in seconds to wait for each page request or browser navigation.

## `maxContentBytes` (type: `integer`):

Maximum response size read per URL. Default supports most modern pricing/docs pages while still stopping very large responses to protect memory and storage costs.

## `allowPrivateUrls` (type: `boolean`):

Allow localhost, private IP ranges, and internal DNS targets. Keep disabled for public scraping to reduce SSRF risk.

## `proxy` (type: `object`):

Optional Apify Proxy configuration. Most public pages do not need proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.gov.br/sitemap.xml"
    },
    {
      "url": "https://www.mercadolivre.com.br/sitemap.xml"
    },
    {
      "url": "https://apify.com/sitemap.xml"
    }
  ],
  "snapshotStoreName": "sitemap-change-detector-br-snapshots",
  "maxItems": 10,
  "maxConcurrency": 3,
  "extractionMode": "SITEMAP_XML",
  "excludeSelectors": [
    "script",
    "style",
    "noscript",
    "svg",
    "iframe",
    "nav",
    "footer",
    "[aria-hidden=\"true\"]",
    ".cookie",
    ".cookies",
    "#cookie",
    "#cookies"
  ],
  "ignoreRegexes": [],
  "ignoreWhitespace": true,
  "ignoreCase": false,
  "ignoreNumbers": false,
  "ignoreDates": true,
  "significantChangeThreshold": 0.05,
  "emitMode": "ALL",
  "saveHtmlSnapshot": false,
  "updateSnapshots": true,
  "maxDiffCharacters": 2000,
  "useBrowser": false,
  "maxRetries": 2,
  "requestTimeoutSecs": 20,
  "maxContentBytes": 2000000,
  "allowPrivateUrls": false,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Structured change detection results.

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

Counts of processed, emitted, changed, significant, unchanged, first-seen, and failed pages.

# 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://www.gov.br/sitemap.xml"
        },
        {
            "url": "https://www.mercadolivre.com.br/sitemap.xml"
        },
        {
            "url": "https://apify.com/sitemap.xml"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("joaosbp/sitemap-change-detector-br").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://www.gov.br/sitemap.xml" },
        { "url": "https://www.mercadolivre.com.br/sitemap.xml" },
        { "url": "https://apify.com/sitemap.xml" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("joaosbp/sitemap-change-detector-br").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 '{
  "startUrls": [
    {
      "url": "https://www.gov.br/sitemap.xml"
    },
    {
      "url": "https://www.mercadolivre.com.br/sitemap.xml"
    },
    {
      "url": "https://apify.com/sitemap.xml"
    }
  ]
}' |
apify call joaosbp/sitemap-change-detector-br --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=joaosbp/sitemap-change-detector-br",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "XML Sitemap Monitor & Change Detector BR",
        "description": "Monitor XML sitemaps, sitemap indexes, new URLs, removed URLs, and lastmod changes with structured JSON diffs for SEO automation.",
        "version": "0.1",
        "x-build-id": "j9j2tbHSFEVnpredH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/joaosbp~sitemap-change-detector-br/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-joaosbp-sitemap-change-detector-br",
                "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/joaosbp~sitemap-change-detector-br/runs": {
            "post": {
                "operationId": "runs-sync-joaosbp-sitemap-change-detector-br",
                "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/joaosbp~sitemap-change-detector-br/run-sync": {
            "post": {
                "operationId": "run-sync-joaosbp-sitemap-change-detector-br",
                "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": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Sitemap URLs to monitor",
                        "type": "array",
                        "description": "Public XML sitemap URLs. Supports urlset sitemaps and sitemap indexes. Use one snapshot store per monitoring project.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "snapshotStoreName": {
                        "title": "Snapshot store name",
                        "type": "string",
                        "description": "Named key-value store used to persist previous snapshots across runs. Use a different store per monitoring project.",
                        "default": "sitemap-change-detector-br-snapshots"
                    },
                    "maxItems": {
                        "title": "Maximum pages per run",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Safety limit for how many URLs are processed in one run.",
                        "default": 10
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of URLs processed in parallel. Keep low for browser mode to reduce memory and compute cost.",
                        "default": 3
                    },
                    "extractionMode": {
                        "title": "Extraction mode",
                        "enum": [
                            "SITEMAP_XML",
                            "VISIBLE_TEXT",
                            "HTML",
                            "METADATA"
                        ],
                        "type": "string",
                        "description": "Choose sitemap XML for normal sitemap monitoring. Other modes are fallback options for unusual text sitemap sources.",
                        "default": "SITEMAP_XML"
                    },
                    "contentSelector": {
                        "title": "Content CSS selector",
                        "type": "string",
                        "description": "Optional CSS selector to monitor only one part of the page, such as main, article, .pricing, or #content. Leave empty to monitor the body."
                    },
                    "excludeSelectors": {
                        "title": "Exclude CSS selectors",
                        "type": "array",
                        "description": "CSS selectors removed before comparison. Use this for navbars, footers, cookie banners, ads, timestamps, or dynamic widgets.",
                        "default": [
                            "script",
                            "style",
                            "noscript",
                            "svg",
                            "iframe",
                            "nav",
                            "footer",
                            "[aria-hidden=\"true\"]",
                            ".cookie",
                            ".cookies",
                            "#cookie",
                            "#cookies"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignoreRegexes": {
                        "title": "Ignore regex patterns",
                        "type": "array",
                        "description": "Advanced: regex patterns removed from content before comparison. Useful for dates, counters, session IDs, ad slots, or personalization noise.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignoreWhitespace": {
                        "title": "Ignore whitespace changes",
                        "type": "boolean",
                        "description": "Collapse repeated whitespace before comparison so formatting-only changes do not create noisy alerts.",
                        "default": true
                    },
                    "ignoreCase": {
                        "title": "Ignore letter casing",
                        "type": "boolean",
                        "description": "Convert content to lowercase before comparison so capitalization-only changes are ignored.",
                        "default": false
                    },
                    "ignoreNumbers": {
                        "title": "Ignore number changes",
                        "type": "boolean",
                        "description": "Replace numbers with a placeholder before comparison. Keep disabled when monitoring prices, quantities, metrics, or version numbers.",
                        "default": false
                    },
                    "ignoreDates": {
                        "title": "Ignore date changes",
                        "type": "boolean",
                        "description": "Replace common date formats with a placeholder before comparison so last-updated timestamps do not create noisy alerts.",
                        "default": true
                    },
                    "significantChangeThreshold": {
                        "title": "Significant change threshold",
                        "minimum": 0,
                        "maximum": 1,
                        "type": "number",
                        "description": "Minimum changed-content ratio required to mark a change as significant. 0.05 means roughly 5% of comparable text changed.",
                        "default": 0.05
                    },
                    "emitMode": {
                        "title": "Dataset output mode",
                        "enum": [
                            "ALL",
                            "CHANGES_ONLY",
                            "SIGNIFICANT_ONLY"
                        ],
                        "type": "string",
                        "description": "ALL writes a row for every monitored URL. CHANGES_ONLY writes first-seen and changed pages. SIGNIFICANT_ONLY writes only significant changes and errors.",
                        "default": "ALL"
                    },
                    "saveHtmlSnapshot": {
                        "title": "Save HTML snapshots",
                        "type": "boolean",
                        "description": "Store raw HTML in the snapshot key-value store. Useful for evidence, but increases storage usage.",
                        "default": false
                    },
                    "updateSnapshots": {
                        "title": "Update stored snapshots",
                        "type": "boolean",
                        "description": "Disable for dry runs. If disabled, the Actor compares against current stored snapshots without replacing them.",
                        "default": true
                    },
                    "maxDiffCharacters": {
                        "title": "Maximum diff characters",
                        "minimum": 100,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of characters kept in addedText and removedText fields to keep dataset rows compact.",
                        "default": 2000
                    },
                    "useBrowser": {
                        "title": "Render pages with browser",
                        "type": "boolean",
                        "description": "Render pages with Playwright for JavaScript-heavy sites. Disabled by default to keep runs fast and cheap.",
                        "default": false
                    },
                    "maxRetries": {
                        "title": "Maximum retries",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of retry attempts for transient network, timeout, 429, or 5xx errors.",
                        "default": 2
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time in seconds to wait for each page request or browser navigation.",
                        "default": 20
                    },
                    "maxContentBytes": {
                        "title": "Max content bytes",
                        "minimum": 50000,
                        "maximum": 5000000,
                        "type": "integer",
                        "description": "Maximum response size read per URL. Default supports most modern pricing/docs pages while still stopping very large responses to protect memory and storage costs.",
                        "default": 2000000
                    },
                    "allowPrivateUrls": {
                        "title": "Allow private/internal URLs",
                        "type": "boolean",
                        "description": "Allow localhost, private IP ranges, and internal DNS targets. Keep disabled for public scraping to reduce SSRF risk.",
                        "default": false
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy configuration. Most public pages do not need proxy.",
                        "default": {
                            "useApifyProxy": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
