# Sitemap Change Monitor: New & Removed URLs (`offerastudio/sitemap-change-monitor`) Actor

Track a website's URL inventory from its sitemaps: new, removed and changed pages since the last run, URLs by section and publishing-speed stats (new URLs per day, median lag, stale share). Reads robots.txt, indexes and gzip; fetches only sitemaps, never pages.

- **URL**: https://apify.com/offerastudio/sitemap-change-monitor.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 site checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

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

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

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

# README

### What does Sitemap Change Monitor do?

**Sitemap Change Monitor** keeps a **URL inventory** of any website from its **sitemaps** and tells you what changed since the last run: **new pages, removed pages and pages whose `lastmod` changed**, plus **publishing-speed analytics**. Other sitemap Actors only list URLs; this one remembers them, so every scheduled run turns into a diff.

For every site you get:

- 🗂️ **URL count by section** (the first path segment: `/blog/`, `/products/`, `/en/` ...)
- 🆕 **new URLs** with their `lastmod` and the **time they were first seen**, ❌ **removed URLs** and 🔁 **URLs whose lastmod changed** (before and after)
- 📈 **publishing statistics**: **new URLs per day and per week**, **top sections by new URLs**, the **median lag between a page's lastmod and the day it appeared** in the sitemap, and the **stale share** (URLs whose lastmod is older than 12 months)
- 🔗 a link to the **full list of changes** of the run as a JSON record, when the lists in the row are cut

It finds sitemaps through **robots.txt** and `/sitemap.xml`, follows **sitemap indexes**, reads **gzip** (`.xml.gz`) files and plain text sitemaps. **It fetches only sitemap files and robots.txt, never the pages themselves**, respects the site's **robots.txt** (including Crawl-delay) and reads one file at a time. No proxy, no login, no API key.

### Who is it for?

- **Competitor content tracking**: see which pages a competitor publishes, how fast, and in which section.
- **SEO and content teams**: spot removed pages (broken links, lost rankings), unexpected new sections, and stale content.
- **E-commerce and catalogue monitoring**: watch product and category URLs appear and disappear.
- **News and publishing analysts**: measure publishing velocity and how quickly the sitemap follows the article.
- **Agencies and site owners** who want a daily "what changed in the sitemap" report.

### How to use it

1. Click **Start** with the default input: three sites with public sitemaps. The first run saves a **baseline** for each (nothing is reported as new yet).
2. Replace **Sites or sitemap URLs** with your own list (up to 200). Use a domain or site URL (`example.com`) to find its sitemaps automatically, or the URL of one sitemap file (`https://example.com/sitemap-news.xml`).
3. Optional: limit the inventory with **Include only these paths** (`/blog/*`) and **Exclude these paths** (`/tag/*`, `*.pdf`), and set **Maximum URLs per site** (default 50,000).
4. **Schedule** the Actor (for example daily). From the second run each site's row has new, removed and changed URLs and the publishing statistics. Connect the dataset to Slack, e-mail, a spreadsheet or a webhook.

Baselines live in a **named key-value store** of your account (compressed JSON), so runs of the same input find them. Give the monitor a **name** to keep history when you edit the site list. A run with **Include unchanged sites** off adds a row only for sites that changed; it is switched on in the example input only so a first try always shows rows.

### Input example

```json
{
    "sites": ["https://blog.apify.com", "example-shop.com", "https://news.example.org/sitemap-news.xml"],
    "maxUrlsPerSite": 50000,
    "includePaths": ["/blog/*", "/products/*"],
    "excludePaths": ["*/tag/*"],
    "includeUnchanged": false
}
```

| Field | Meaning |
| --- | --- |
| `sites` | Up to 200 domains, site URLs or sitemap URLs. |
| `maxUrlsPerSite` | Default 50,000, at most 250,000 (the baseline of a site must fit in 9 MB compressed). |
| `includePaths`, `excludePaths` | Path patterns with `*` (`/blog/*`, `*/tag/*`, `*.pdf`, `/shop/$`). Matched against the URL path from its start; exclude is applied after include. |
| `maxListedUrls` | Per site and category, how many new, removed and changed URLs are listed in the row (default 1,000). Counts are always complete; `diffUrl` has every URL. |
| `maxSitemapsPerSite` | Sitemap files read per site (default 100). |
| `includeUnchanged` | Add a row for sites without changes (default off). |
| `monitorName` | Names the baseline store. |

### Output example

Real output of a local run on 2 October 2026 with the default input (first run, baselines):

| Site | Status | URLs | Sections | Sitemap files | Stale share (lastmod older than 12 months) |
| --- | --- | --- | --- | --- | --- |
| www.sitemaps.org | baseline | 84 | 21 | 1 | 100 % |
| blog.apify.com | baseline | 971 | 821 | 5 (an index and 4 files) | 30 % |
| nodejs.org | baseline | 1,740 | 4 | 2 | 0 % |

A later run. To show a change without waiting for one, **the saved baseline of blog.apify.com was edited locally** (four posts removed from it, two made-up posts added, two lastmod values altered, tracking start moved back three days); the sitemap itself is the real one of 2 October 2026. The row (shortened to two sitemap files, three sections and two URLs per list):

```json
{
    "site": "https://blog.apify.com",
    "status": "changed",
    "summary": "4 new, 2 removed and 2 URLs with a new lastmod; 971 URLs in total.",
    "checkedAt": "2026-10-02T05:59:34.760Z",
    "previousCheckedAt": "2026-09-29T05:59:15.739Z",
    "baselineAt": "2026-09-29T05:59:15.739Z",
    "robotsTxt": "read",
    "sitemaps": [
        { "url": "https://blog.apify.com/sitemap.xml", "status": "ok", "kind": "index", "urls": 4, "error": null },
        { "url": "https://blog.apify.com/sitemap-pages.xml", "status": "ok", "kind": "urlset", "urls": 1, "error": null }
    ],
    "sitemapsRead": 5,
    "sitemapsFailed": 0,
    "sitemapsSkipped": 0,
    "urlCount": 971,
    "truncated": false,
    "filters": { "includePaths": [], "excludePaths": [], "maxUrlsPerSite": 50000 },
    "sectionCount": 823,
    "sections": [
        { "section": "author", "sectionUrls": 116, "sectionNewUrls": 0, "sectionRemovedUrls": 0 },
        { "section": "tag", "sectionUrls": 36, "sectionNewUrls": 0, "sectionRemovedUrls": 0 },
        { "section": "ai-implementation-challenges", "sectionUrls": 1, "sectionNewUrls": 1, "sectionRemovedUrls": 0 }
    ],
    "newUrlsCount": 4,
    "removedUrlsCount": 2,
    "changedUrlsCount": 2,
    "newUrls": [
        { "url": "https://blog.apify.com/google-trends-compare-keywords/", "section": "google-trends-compare-keywords", "lastmod": "2026-10-01T11:53:55.000Z", "firstSeenAt": "2026-10-02T05:59:34.760Z" },
        { "url": "https://blog.apify.com/martina-gelnerova-data-career-change/", "section": "martina-gelnerova-data-career-change", "lastmod": "2026-10-01T08:46:24.000Z", "firstSeenAt": "2026-10-02T05:59:34.760Z" }
    ],
    "removedUrls": [
        { "url": "https://blog.apify.com/example-removed-post-one/", "section": "example-removed-post-one", "lastmod": "2025-05-04T10:00:00.000Z", "firstSeenAt": "2026-09-29T05:59:15.739Z" }
    ],
    "changedUrls": [
        { "url": "https://blog.apify.com/firecrawl-vs-apify/", "section": "firecrawl-vs-apify", "previousLastmod": "2026-01-01T00:00:00.000Z", "lastmod": "2026-09-30T17:54:31.000Z", "firstSeenAt": "2026-09-29T05:59:15.739Z" }
    ],
    "listsTruncated": false,
    "diffUrl": "https://api.apify.com/v2/key-value-stores/<store id>/records/diff-59249a68d59243762e936176-20261002055934",
    "publishing": {
        "trackingSince": "2026-09-29T05:59:15.739Z",
        "trackingDays": 3,
        "newUrlsSinceBaseline": 4,
        "newUrlsPerDay": 1.33,
        "newUrlsPerWeek": 9.33,
        "newUrlsByDay": [{ "date": "2026-09-29", "newUrls": 0 }, { "date": "2026-09-30", "newUrls": 0 }, { "date": "2026-10-01", "newUrls": 0 }, { "date": "2026-10-02", "newUrls": 4 }],
        "topSectionsByNewUrls": [{ "section": "ai-implementation-challenges", "newUrls": 1 }, { "section": "google-trends-compare-keywords", "newUrls": 1 }],
        "medianLagDays": 0.92,
        "lagSamples": 4,
        "urlsWithLastmod": 971,
        "urlsWithLastmodShare": 1,
        "staleShare": 0.2997,
        "staleUrls": 291,
        "modifiedLast7Days": 33,
        "modifiedLast30Days": 96,
        "newestLastmod": "2026-10-01T12:15:28.863Z",
        "oldestLastmod": "2021-10-27T19:00:27.000Z"
    },
    "notes": [],
    "error": null,
    "errorMessage": null
}
```

**Reading the statistics**

- **New URLs** are URLs listed now but not in the saved baseline. Their `firstSeenAt` is the time of the run that saw them first, so the resolution is your schedule: run daily and you know the day a page appeared.
- **Median lag** is the median number of days between a new URL's `lastmod` and the run that first saw it, over the new URLs since the baseline that have a lastmod. It says how fast the sitemap follows publishing (or, when the lag is large, that lastmod is not the publication time).
- **Stale share** is the share of URLs *with a lastmod* whose lastmod is more than 12 months old.
- **Rates** (`newUrlsPerDay`, `newUrlsPerWeek`) are new URLs since the baseline divided by the days tracked, and are `null` until a day has passed.
- **Sections** are the first path segment. Sites that publish posts at the root (`/post-title/`, like a blog on Ghost) get one section per post, so the section table is only useful for sites with a path structure.

### How much does it cost?

This Actor uses **pay per event**:

| Event | Price |
| --- | --- |
| Site checked (its sitemaps were read and compared with the baseline) | **$0.004** |
| Sites that fail (no sitemap found, unreachable, blocked, invalid entry) | **free** |

- 100 sites cost **$0.40**; the default run (3 sites) costs **$0.012**.
- With **Include unchanged sites** off, a site that did not change is still checked and charged, but adds no row.
- Apify also charges a tiny standard start fee per run. Compute is small: a site with 50,000 URLs in a few files takes a minute or two. Large sites with many sitemap files are read one file at a time on purpose.
- Set **Maximum cost per run** in the run options and the Actor stops when it is reached.

### Limitations

- **Only what the sitemap lists.** Pages that are not in a sitemap are not seen. A sitemap can be incomplete, stale or generated lazily; `lastmod` is whatever the site's software says (some sites put the crawl time there for every URL).
- **Large sites are capped**: 50,000 URLs by default (250,000 at most) and 100 sitemap files per site. A cut-short site is marked `truncated`, and **removed URLs are not reported** for it, because the missing URLs may simply not have been read.
- **A sitemap file that fails to load** (timeout, 5xx) does not make its URLs "removed": they are kept as they were and the row says how many files failed.
- **robots.txt is respected**: a sitemap under a disallowed path is not read (`blocked-by-robots`), and a Crawl-delay is honoured up to 10 seconds. Sites that block automated requests (403) come back as free error rows.
- **First seen is the run time**, not the real publication time. Use `lastmod` for that.
- A change of the **path filters or the URL cap** starts a new baseline for the site (reported as `baseline`), so settings changes never look like thousands of removed pages.
- URLs are compared as listed (query strings included); sitemap entries on other hosts are kept.

### FAQ

#### Does it crawl the website?

No. It reads robots.txt and the sitemap files, nothing else. It never requests a page of the site.

#### How does it find the sitemap?

From the `Sitemap:` lines of robots.txt and from `/sitemap.xml` (then `/sitemap_index.xml` and `/sitemap.xml.gz`). If a site keeps its sitemap somewhere else, enter the sitemap URL itself. Sitemap indexes are followed up to four levels deep, and gzip files are unpacked.

#### What does the first run show?

A baseline: the URL count, sections and lastmod-based statistics. New, removed and changed URLs appear from the second run.

#### Can I watch only part of a site?

Yes: use the path filters (for example only `/blog/*`). Changing the filters starts a new baseline.

#### How do I get alerts?

Schedule the Actor, leave **Include unchanged sites** off, and connect the dataset or a webhook to Slack, e-mail or Zapier: a row appears only when something changed.

#### Does it store anything about me?

Only the public URL lists of the sites you monitor, in a named key-value store of your account. No personal data is processed.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a sitemap format or a statistic you need? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/sitemap-change-monitor/changelog.md

# Actor input Schema

## `sites` (type: `array`):

Up to 200 entries. A domain or site URL (example.com, https://www.example.com): the Actor reads robots.txt and /sitemap.xml, follows sitemap indexes and reads gzip files. A URL of a sitemap file (https://example.com/sitemap-news.xml) is read directly.

## `maxUrlsPerSite` (type: `integer`):

The inventory of a site stops at this many URLs (after the path filters). A site cut short this way is marked truncated and its removed URLs are not reported. The baseline of one site must fit in 9 MB compressed, which 250,000 URLs usually do.

## `includePaths` (type: `array`):

Keep only URLs whose path matches one of these patterns, for example /blog/\* or /products/\*. \* matches any characters; the pattern starts at the beginning of the path unless it starts with \*. Leave empty for all URLs.

## `excludePaths` (type: `array`):

Drop URLs whose path matches one of these patterns, for example /tag/\* or \*.pdf. Applied after the include list.

## `maxListedUrls` (type: `integer`):

At most this many new, removed and changed URLs are listed in each site's row (newest lastmod first). The counts are always complete, and the full lists are kept in a record of the monitor's key-value store (diffUrl).

## `includeUnchanged` (type: `boolean`):

Also add a row for sites whose inventory did not change. Off by default, so the dataset (and your alerts) only get rows when something changed. It is switched on in the example input only so a first try, and Apify's daily test, always show a row for every site; turn it off for monitoring.

## `maxSitemapsPerSite` (type: `integer`):

Large sites split their sitemap into many files. The Actor reads at most this many per site, one request at a time, so a run stays polite and short. A site cut short this way is marked truncated.

## `monitorName` (type: `string`):

Name of this monitor's baseline store (letters, digits, spaces, - and \_). Runs with the same name share baselines. Leave empty to derive it from the site list; then adding or removing a site starts a new monitor with new baselines. Set a name to keep history when you edit the list.

## Actor input object example

```json
{
  "sites": [
    "https://www.sitemaps.org",
    "https://blog.apify.com",
    "https://nodejs.org"
  ],
  "maxUrlsPerSite": 50000,
  "maxListedUrls": 1000,
  "includeUnchanged": true,
  "maxSitemapsPerSite": 100
}
```

# Actor output Schema

## `sites` (type: `string`):

No description

## `newUrls` (type: `string`):

No description

## `removedUrls` (type: `string`):

No description

## `changedUrls` (type: `string`):

No description

## `sections` (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 = {
    "sites": [
        "https://www.sitemaps.org",
        "https://blog.apify.com",
        "https://nodejs.org"
    ],
    "maxUrlsPerSite": 50000,
    "includeUnchanged": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/sitemap-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 = {
    "sites": [
        "https://www.sitemaps.org",
        "https://blog.apify.com",
        "https://nodejs.org",
    ],
    "maxUrlsPerSite": 50000,
    "includeUnchanged": True,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/sitemap-change-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "sites": [
    "https://www.sitemaps.org",
    "https://blog.apify.com",
    "https://nodejs.org"
  ],
  "maxUrlsPerSite": 50000,
  "includeUnchanged": true
}' |
apify call offerastudio/sitemap-change-monitor --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

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