# SEO Migration Redirect Auditor & Client Report (`exceptional_nugget/migration-redirect-auditor`) Actor

Check old-to-new URL mappings, redirect chains, broken destinations, canonical tags and noindex directives. Export actionable JSON/CSV results and a printable HTML client report. HTTP-only, no proxy or AI API key required.

- **URL**: https://apify.com/exceptional\_nugget/migration-redirect-auditor.md
- **Developed by:** [LibriHouse](https://apify.com/exceptional_nugget) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 audited url mappings

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/actors/running/actors-in-store.md#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

## SEO Migration Redirect Auditor & Client Report

Verify your old-to-new URL mappings after a website migration. Receive one actionable result per mapping plus a printable HTML report for your client. No browser, proxy, AI API key or database required.

### Quick start

Paste the following into the Actor input. Replace the demo pair with your real migration mappings.

```json
{
  "pairs": [
    { "oldUrl": "https://example.com/", "expectedUrl": "https://example.com/" }
  ],
  "maxRedirects": 5,
  "timeoutSecs": 15,
  "delayMillis": 250
}
```

Supply 1–1000 mappings. URLs must be publicly reachable HTTP(S) URLs using standard ports without embedded credentials. The demo checks a direct page; use an actual old URL to test redirects.

### What you receive

- Exact expected-destination checks, preserving paths and query strings; fragments ignored.
- Every HTTP redirect hop; loops, temporary redirects, missing Location headers and HTTPS downgrades.
- Final HTTP status, canonical URL, page title, HTML/header noindex signals and concrete fixes.
- `pass`, `warning` or `fail` verdict for each mapping. Warnings deserve review.
- `SUMMARY` JSON and `REPORT` HTML in the run's default key-value store. Download the HTML, open it locally and print to PDF if needed.
- Results in the default dataset, exportable as JSON, CSV or Excel from Apify Console.

Results preserve input order and include `pairIndex`. Duplicate mappings are checked separately and may be charged separately. Direct old=expected URLs are allowed for destination health checks.

### Pricing behavior

The source supports the Apify pay-per-event event **`pair-audited`**. Each completed mapping produces one event, including observed HTTP failures (such as 404 or 429) and redirect-rule failures. Network, TLS, DNS and unsafe-target errors produce free diagnostics. Checks stop when no further event fits the run's charge budget.

Pricing is displayed in the Actor’s Pricing tab. At $2 per 1,000 completed mappings ($0.002 each), a 500-mapping run has $1 in event charges. Check the Pricing tab for platform usage treatment before running.

### Limitations

This is an HTTP migration check, not a comprehensive SEO crawler. It does not execute JavaScript, inspect robots.txt, verify Google indexing, detect soft 404s or compare page content. Canonicals in HTTP Link headers are not evaluated. Only UTF-8 HTML with identity encoding is parsed; body inspection is capped at 2 MB. Bot-specific noindex directives are conservatively flagged for review. A clean result does not guarantee search-engine indexability or migration readiness.

Trailing slashes, query ordering and case-sensitive paths remain significant. Expected destinations are compared as supplied after standard URL parsing. We do not independently crawl expected URLs if an old URL goes elsewhere. Access denials and rate limiting are reported separately from ordinary HTTP failures; requests are not automatically retried. Increase the delay or rerun later.

Requests run sequentially with a delay between hops and pairs. Every destination's DNS is validated and pinned to a public IP. Private networks, custom ports, unsafe protocols and URL credentials are rejected. Results stay in the caller's Apify storage; no external analytics or database is used. Do not submit URLs containing secret query parameters or personal data. Storage access and retention follow your Apify account settings.

### Support

Include a run ID, sanitized input, expected behavior and the relevant issue code in your Apify Actor issue. Never share your API token.

# Actor input Schema

## `pairs` (type: `array`):

1–1000 objects with oldUrl and expectedUrl. Public HTTP(S) only; exact destination matching, including query strings. URL fragments are ignored.

## `maxRedirects` (type: `integer`):

Stop long chains to bound costs.

## `timeoutSecs` (type: `integer`):

Includes DNS resolution and body download for each hop.

## `delayMillis` (type: `integer`):

Requests run sequentially. Increase this delay when rate limited.

## Actor input object example

```json
{
  "pairs": [
    {
      "oldUrl": "https://example.com/",
      "expectedUrl": "https://example.com/"
    }
  ],
  "maxRedirects": 5,
  "timeoutSecs": 15,
  "delayMillis": 250
}
```

# Actor output Schema

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

No description

## `report` (type: `string`):

No description

## `summary` (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 = {
    "pairs": [
        {
            "oldUrl": "https://example.com/",
            "expectedUrl": "https://example.com/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("exceptional_nugget/migration-redirect-auditor").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 = { "pairs": [{
            "oldUrl": "https://example.com/",
            "expectedUrl": "https://example.com/",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("exceptional_nugget/migration-redirect-auditor").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 '{
  "pairs": [
    {
      "oldUrl": "https://example.com/",
      "expectedUrl": "https://example.com/"
    }
  ]
}' |
apify call exceptional_nugget/migration-redirect-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,exceptional_nugget/migration-redirect-auditor"
        }
    }
}
```

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/c7jRwEh7u2qYeWVbv/builds/0DwpMtymMsn4c6Cpe/openapi.json
