# Automated Change Detection

Automated Change Detection captures meaningful changes to your enrolled pages on a recurring schedule, even when AirOps wasn't in the write path. Detected changes flow into the [Content Updates](/insights/insights/content-updates.md) feed and surface as a category-tagged before/after diff in each page's detail view - so you can connect what changed on a page with how its performance moved.

{% hint style="info" %}
**Early access** - Automated Change Detection is currently available to a limited set of workspaces. Reach out to your AirOps contact if you'd like access.
{% endhint %}

***

## How It Works

AirOps fetches every page in your [Pages](/insights/pages.md) view once a week, compares the new capture against the last successful one, and records a `Page Refreshed` content update when the diff is meaningful. The diff is what powers the **Changes** table in the page detail view.

The check is bidirectional with Content Updates:

* **Logging a Content Update triggers a fresh capture.** Every time you record a publish or refresh through a workflow, the API, or MCP, AirOps captures the page immediately so the diff in the Changes table stays current. This is one of the reasons to keep logging [Content Updates](/insights/insights/content-updates.md) even after Automated Change Detection is enabled.
* **Detected changes are written back as Content Updates.** When the weekly check finds a meaningful change, AirOps records a `Page Refreshed` content update tagged as auto-detected. These appear in the Content Updates feed alongside the ones you log.

***

## What We Track

Every detected change is classified into one of five categories. A single content update can carry multiple categories at once - for example, a blog refresh that rewrites the H1, updates the meta description, and adds a FAQ JSON-LD block tags as `Headings + Metadata + Schema`.

### Schema

Structured data (JSON-LD) that helps AI agents and search crawlers parse your page's meaning, entities, and relationships. A Schema change means a JSON-LD block was added, removed, or modified - for example a `FAQPage`, `Product`, `BreadcrumbList`, or `Article` block.

### Metadata

Page-level signals that influence how search engines and AI tools summarize, route to, and classify your page.

Tracked fields: **title tag, meta description, canonical URL, robots meta, Open Graph type, hreflang.**

### Headings

The page's topical hierarchy - what AI agents and skimmers use to understand the topic and the structure of the answer.

Tracked fields: **H1 through H6**, plus two synthetic roles: **hero heading** (prominent display copy at the top of the page, read like an H1) and **tagline** (supporting display copy that frames the main heading).

### Content

Broad body-copy drift. Detected when the prose has substantially shifted, when content blocks have been rearranged across the page, or when the overall content fingerprint has moved beyond noise. Content changes are detected at the body level rather than per-field, so this category surfaces as a tag without a renderable diff - it signals that the body of the page meaningfully changed without pinning the change to a specific line.

### Structure

How the page is wired and laid out: the internal-link graph, the page skeleton, and **listings** (enumerated regions like product cards, blog post lists, or related-items widgets).

Tracked fields: **internal links, listings, page skeleton.**

***

## What We Filter Out

Not every detected diff becomes a content update. AirOps suppresses changes that don't represent real editorial work:

* **Rotation** - a small set of items cycling in and out of a fixed-size list (recently-viewed widgets, randomized testimonials).
* **Volatile values** - fields known to drift on every fetch (build hashes embedded in canonical URLs, session IDs, timestamps).
* **Templated tail-section noise** - for example, the "Related articles" widget at the bottom of every post being rotated by the CMS when the rest of the page didn't move.
* **Redirected captures** - when a page now redirects elsewhere (often to the brand homepage). The whole "diff" is real but doesn't represent a page edit, so the change is treated as a status event rather than an editorial change.

These filters keep the Changes table focused on actual editorial work, not crawler-detected jitter.

***

## Viewing Detected Changes

### Content Updates tab

Auto-detected changes show up in the [Content Updates](/insights/insights/content-updates.md) feed alongside the ones you log. The **Source** column identifies them, and the **Type** is `Page Refreshed`. Filter, sort, and bulk-delete from there just like any other content update.

### Page detail view - Changes table

The page detail view includes a **Changes** table that lists every detected change for that page in reverse chronological order. Each row is tagged with one or more categories (`Schema`, `Metadata`, `Headings`, `Content`, `Structure`) and expands into a before/after view:

* **Scalar fields** (title, meta description, canonical URL, individual headings, hero, tagline, OG type, robots meta)
* **List fields** (internal links, hreflang, listing items)
* **JSON-LD blocks**

***

## Anti-bot challenges

If anti-bot protection on your site is blocking AirOps from capturing your pages, a banner may appear on the Content Updates dashboard.

This is typically caused by Cloudflare Managed Challenge, Cloudflare Bot Fight Mode, or a similar WAF rule that returns a challenge interstitial to our fetcher instead of the page.

To fix it, allowlist AirOps in your WAF. AirOps identifies itself with this User-Agent on every page-change capture:

```
Mozilla/5.0 (compatible; AirOpsPageChangeTracker/1.0; +https://airops.com)
```

Have your security team add a WAF rule that skips Managed Challenge, Bot Fight Mode, and Browser Integrity Check for requests carrying that User-Agent. If your team needs egress IP details for a stricter allowlist, contact AirOps support.

{% hint style="warning" %}
If anti-bot interstitials persist across multiple consecutive captures, the affected pages are paused and drop out of the auto-detection feed until the block is resolved.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.airops.com/insights/insights/content-updates/automated-change-detection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
