# SEO Release Guard — Sitemap & Indexability Regression Audit (`abdullah97/seo-release-guard`) Actor

Check sitemap URLs for HTTP errors, noindex and canonical drift; compare successive audits.

- **URL**: https://apify.com/abdullah97/seo-release-guard.md
- **Developed by:** [Abdullah](https://apify.com/abdullah97) (community)
- **Stats:** 2 total users, 1 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/actors/running/actors-in-store.md#pay-per-usage

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

## SEO Release Guard — Sitemap & Indexability Regression Audit

Catch accidental noindex directives, broken sitemap URLs and changed canonical
targets after a site release, migration or theme update.

Built for SEO agencies and web teams that need a repeatable release checklist
with machine-readable differences between audits.

### Start

```
{"demoMode": true}
```

The offline fictional demo includes a newly noindexed product page, a 404 and a
robots-blocked page. Real operation accepts page URLs:

```
{
  "urls": ["https://your-site.example/products/backpack"],
  "maxItems": 100
}
```

Or sitemap URLs:

```
{
  "sitemapUrls": ["https://your-site.example/sitemap.xml"],
  "maxItems": 100
}
```

Use urls OR sitemapUrls. Replace the fictional .example URLs.

### Checks and outputs

- HTTP 404/410, redirects in the URL inventory and final destination.
- noindex/none in head-level robots/googlebot meta tags and applicable
  X-Robots-Tag response headers.
- Missing, conflicting or elsewhere-pointing HTML canonicals.
- Missing title, and title/canonical/noindex/HTTP changes since the last audit.
- New and resolved issues with evidence and a next action.
- JSON dataset, SUMMARY, SNAPSHOT, Markdown REPORT and formula-safe CSV.

Sitemap indexes and XML urlsets are supported. Index loops and duplicates are
bounded. Off-origin sitemap entries are skipped. Each run reads at most 20 unique
sitemap documents. Unsupported or blocked discovery is reported in SUMMARY.
Gzip served using Content-Encoding is supported by the HTTP client; raw .gz
files without a Content-Encoding header are not supported in this version.

### Compare releases

Run before a release and pass its SNAPSHOT as previousSnapshot in the next run.
For automated monitoring, provide an existing stateStoreId that you own and a
unique monitorId, grant storage access, and avoid overlapping runs.
Use separate stores for separate customers.

The baseline retains previous successful observations when a check is inaccessible.
Only the most recent 5,000 observations are retained. Missing URLs from truncated
or changed sitemap inventories are never claimed to be deleted pages.

### Pricing

Proposed launch price: **$2 per 1,000 audited HTML pages or confirmed missing
pages** ($0.002 each), including normal runtime costs. No startup fee or rental.
Event name: page-audited, activated in Apify Publication before sale.

Sitemap documents, skipped duplicates and unverified fetches are not charged.
Confirmed 404/410 pages are billed because they are actionable audit findings.
Unchanged checks are billed once per URL per run. 500 pages cost **$1 per audit**;
four weekly audits cost **$4**. Use the platform maximum charge per run.

### Boundaries

This is a focused check of HTML signals, not a full SEO crawler, Google URL
Inspection replacement, indexation guarantee, uptime monitor or ranking predictor.
robots-blocked URLs are marked unverified; a robots rule does not prove deindexing.
Intentional canonicals and noindex pages may correctly appear as findings.
Review their purpose before editing the site.

The Actor does not render JavaScript, fetch canonical targets, crawl inbound links,
compare page content, inspect HTTP Link-header canonicals, handle all search bots,
or determine Google's selected canonical. It does not submit changes to Google.
No messages are sent; route dataset findings through your own workflow if desired.

Up to 1,000 pages/run, 2 MB per response after decompression, 10-minute crawl
ceiling, bounded redirects/retries, public HTTP(S) ports 80/443 and robots.txt
compliance. No proxies or paid external APIs.

Account plans, optional workflows and dataset reads after completion may incur
separate charges. Demos have no Actor event fee, but platform execution can still
consume usage.

# Actor input Schema

## `demoMode` (type: `boolean`):

Start here to try fictional examples without web requests or Actor event fees. Turn off and supply your own products, feed or URLs for a live audit.

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

Hard item limit per run, including unbillable errors. Duplicates are skipped.

## `previousSnapshot` (type: `object`):

Paste this Actor's previous SNAPSHOT output to compare runs without shared storage.

## `stateStoreId` (type: `string`):

Existing key-value store you own and explicitly grant this Actor read/write access to. Never share between customers.

## `monitorId` (type: `string`):

Required with stateStoreId. Unique per independent monitor; do not overlap runs for the same monitor.

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

Explicit URLs to audit, or use sitemapUrls.

## `sitemapUrls` (type: `array`):

XML urlset or sitemapindex. Follows at most 20 unique sitemap documents; off-origin entries are excluded.

## Actor input object example

```json
{
  "demoMode": true,
  "maxItems": 100
}
```

# Actor output Schema

## `results` (type: `string`):

No description

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

No description

## `snapshot` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `report` (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 = {
    "demoMode": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("abdullah97/seo-release-guard").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 = { "demoMode": True }

# Run the Actor and wait for it to finish
run = client.actor("abdullah97/seo-release-guard").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 '{
  "demoMode": true
}' |
apify call abdullah97/seo-release-guard --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abdullah97/seo-release-guard"
        }
    }
}
```

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/AUYVxg7PxqXNfarNo/builds/Du0Euj0bB8F2Fd6Zp/openapi.json
