# Broken Link & SEO Redirect Audit (`longish_whistle/broken-link-seo-redirect-audit`) Actor

Check URL lists for 404s, redirect chains, noindex directives and canonical tags. Get a repair checklist with evidence, plus optional before/after comparisons. JSON and CSV.

- **URL**: https://apify.com/longish\_whistle/broken-link-seo-redirect-audit.md
- **Developed by:** [Tender Delta](https://apify.com/longish_whistle) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 checked urls

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?

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

## Broken Link & SEO Redirect Audit

**Catch broken destinations and accidental noindex settings before they linger after a website change.**

Paste a URL list and get an actionable checklist: observed HTTP status, redirect path, final destination, title, canonical URL and search-crawler directives. Compare with an earlier run to see what changed.

### Built for focused checks

- **Website migrations:** verify that important old URLs reach the intended destinations.
- **Content teams:** check the URLs in a launch or campaign spreadsheet for 404/410 responses.
- **SEO maintenance:** spot noindex directives, multiple canonical tags and changed page titles in server HTML.

This checks the URLs you provide. It does not discover every link on a website or promise rankings.

### Try it with two URLs

```json
{"urls":["https://example.com/","https://docs.apify.com/"],"maxUrls":2}
```

Two delivered checks cost **$0.004**, plus the displayed Actor start charge. Replace these examples with public URLs you are authorized to check. No proxy subscription or separate API key is needed.

### Understand the result

| Observation | Interpretation |
|---|---|
| 404 or 410 | Destination was not found at check time; review links or restore/redirect it |
| Redirect chain or loop | Inspect the recorded path and simplify routing where appropriate |
| 401, 403, 407 or 429 | Access restricted, **not proof of a broken link** |
| 5xx | Server error observed; it may be temporary |
| noindex\_directive\_observed | A robots directive was found; confirm the intended crawler scope |
| canonical\_not\_declared | Informational finding, not automatically an SEO defect |
| cross\_host\_canonical | Review intent; a cross-domain canonical can be legitimate |
| non\_html\_response | HTTP check completed, but HTML tags were not inspected |

Every delivered row includes the input URL, final URL, observed status, redirect chain, findings, recommendations and check time. Original HTTP evidence stays alongside the advice.

### Compare before and after

The first run writes `SNAPSHOT` to its default key-value store. For the next run, select that store in `previousSnapshotStoreId` and keep URLs and the redirect limit identical. Results show `changeType` and field-level before/after values in `changes`. Enable `changesOnly` to suppress unchanged results.

Your workflow must pass the preceding run's store ID each time. There is no automatic subscription, email alert or shared cross-customer history. Use Apify schedules/API to run the checks at your desired frequency.

### Exports

The dataset provides JSON and standard Apify exports. `OUTPUT-CSV` is a UTF-8 spreadsheet-safe CSV with formula prefixes escaped; JSON retains the original values. `SUMMARY` lists counts, limits and errors. `DIAGNOSTICS` lists unchecked targets and reasons. `DELIVERY` records export completeness; `SNAPSHOT` supports the next comparison.

### Pricing and limits

**$2 per 1,000 checked URLs ($0.002 each)**, plus the displayed Actor start charge. Platform usage is included in this Actor's price; there is no monthly rental. A useful delivered HTTP result is charged whether reachable, broken, access-restricted or a redirect error. It is not priced only per broken link. Robots-blocked targets, DNS failures and timeouts without an HTTP result are recorded as unchecked diagnostics and are not charged as checked URLs. Unchanged results suppressed by changesOnly are not charged as checked URLs. A start charge may apply even when nothing can be checked.

Up to 100 supplied URLs per run (20 by default), up to 8 redirects (5 by default), about a 90-second collection budget, 10-second request timeout and 1.5 MB response limit. Set Apify's maximum charge before starting. Partial coverage is explicitly reported. Snapshots retain up to 10,000 records.

### Deliberate boundaries

Uses public HTTP requests with a truthful TenderDeltaAudit user agent, respects robots.txt and crawl delays, and does not bypass bot protection. Robots errors are handled conservatively and may leave a target unchecked. Requests are spaced by at least 500 ms per origin. Private networks, login credentials, IPv6-only destinations and nonstandard ports are unsupported.

No JavaScript rendering, authenticated pages, whole-site crawling, sitemap discovery, search-index inspection or Core Web Vitals. Title and canonical checks see server HTML only. A reported response time is one request observation, not a user-experience benchmark. A noindex flag can apply to a particular crawler and is not evidence of Google's current index state.

Independent tool by **Tender Delta**. Use the Actor's Issues tab for reproducible problems, with input and a redacted run link. Never include passwords, tokens or private URLs.

# Actor input Schema

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

Paste up to 100 public HTTP/HTTPS URLs. Only these URLs are checked; no whole-site crawl.

## `maxUrls` (type: `integer`):

Limits supplied URLs attempted, not only broken results.

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

Stops and reports chains beyond this limit.

## `changesOnly` (type: `boolean`):

Compare with the selected previous run snapshot. The first run considers every result new.

## `previousSnapshotStoreId` (type: `string`):

Optional store from your own previous run containing SNAPSHOT. Your workflow must pass the preceding run defaultKeyValueStoreId each time. No automatic shared state.

## Actor input object example

```json
{
  "urls": [
    "https://example.com/",
    "https://docs.apify.com/"
  ],
  "maxUrls": 20,
  "maxRedirects": 5,
  "changesOnly": false
}
```

# Actor output Schema

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

No description

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

No description

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

No description

## `files` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("longish_whistle/broken-link-seo-redirect-audit").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("longish_whistle/broken-link-seo-redirect-audit").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 '{}' |
apify call longish_whistle/broken-link-seo-redirect-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,longish_whistle/broken-link-seo-redirect-audit"
        }
    }
}

```

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/axGa0hLvaDmSwpl1F/builds/qFshIZHnGa0rTU6DG/openapi.json
