# Broken Link Checker - 404 & Redirect Finder (`ninhothedev/broken-link-checker`) Actor

$0.5/1K 🔥 Broken link checker! Crawl a page's links & flag 404s, redirects & errors. No key. JSON, CSV, Excel or API in seconds. Fix link rot & boost SEO ⚡

- **URL**: https://apify.com/ninhothedev/broken-link-checker.md
- **Developed by:** [ninhothedev](https://apify.com/ninhothedev) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Checker - Find 404s, Redirects & Dead Links

**Crawl any page's links and instantly find broken links (404s), redirects, timeouts and error status codes.** Point the Broken Link Checker at one or more page URLs, and it extracts every `<a href>` link, resolves it to an absolute URL, and checks its live HTTP status. You get one clean row per link with its status code, a `broken` flag, redirect target, anchor text and whether the link is internal or external — perfect for **SEO audits, site maintenance, QA and link-rot detection**. No login, no API key.

### Why use this Broken Link Checker?

- **Find broken links fast** - every link with a status `>= 400` (404, 410, 500...) or a request error/timeout is flagged `broken: true`.
- **Catch silent redirects** - see which links now 301/302 elsewhere and where they land (`redirect_to`), so you can update them before they rot.
- **SEO-ready output** - `status_code`, `ok`, `broken`, `is_internal`, `anchor_text` per link, ready for Google Sheets, Excel, CSV or JSON.
- **Cheap & predictable** - HEAD requests first (GET fallback on 405), caps on links-per-page and total items keep runs fast and low-cost.
- **Datacenter-friendly** - runs on the URLs you give it, no proxies required to get started.

### Use cases

- **SEO audits** - hunt down 404s and dead outbound links that hurt rankings and crawl budget.
- **Site maintenance** - regularly re-check key pages so link rot never goes unnoticed.
- **QA / pre-release checks** - validate that every link on a landing page, docs page or blog post resolves.
- **Link rot detection** - monitor reference-heavy pages (wikis, resource lists, documentation) for links that have gone stale.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `mode` | select | `check` | Operating mode. `check` = page URLs -> checked links. |
| `urls` | array | `["https://en.wikipedia.org/wiki/Web_scraping"]` | Page URLs to crawl for links. |
| `checkExternal` | boolean | `true` | Also check links to other domains. Disable for on-site-only audits. |
| `maxLinksPerPage` | integer | `200` | Max unique links to extract & check per page. |
| `maxItems` | integer | `500` | Max checked links (dataset items) in total. |

#### Example input

```json
{
  "mode": "check",
  "urls": ["https://en.wikipedia.org/wiki/Web_scraping"],
  "checkExternal": true,
  "maxLinksPerPage": 200,
  "maxItems": 500
}
````

### Output

One dataset item per checked link:

```json
{
  "source_page": "https://en.wikipedia.org/wiki/Web_scraping",
  "url": "https://en.wikipedia.org/wiki/ThisPageDoesNotExist",
  "anchor_text": "dead link",
  "status_code": 404,
  "ok": false,
  "broken": true,
  "redirected": false,
  "redirect_to": null,
  "is_internal": true,
  "error": null,
  "source": "broken-link-checker",
  "scraped_at": "2026-07-21T16:00:00+00:00"
}
```

| Field | Description |
|-------|-------------|
| `source_page` | The page the link was found on. |
| `url` | Absolute URL of the link target. |
| `anchor_text` | Visible anchor text of the `<a>`. |
| `status_code` | HTTP status code (null if the request failed). |
| `ok` | True when status is 200-399. |
| `broken` | True when status `>= 400` or the request errored/timed out. |
| `redirected` | True when the final URL differs from the requested one. |
| `redirect_to` | Final URL after following redirects. |
| `is_internal` | True when the link's host matches the source page. |
| `error` | Error message if the request failed. |
| `source` | Always `broken-link-checker`. |
| `scraped_at` | UTC ISO-8601 timestamp. |

### Pricing

Pay per usage. Checking links is lightweight (HEAD requests), so runs are cheap — roughly **$0.5 per 1,000 checked links** depending on page size and response times. Use `maxLinksPerPage` and `maxItems` to cap spend.

### Related actors

- [SEO On-Page Auditor](https://apify.com/ninhothedev/seo-onpage-auditor)
- [Website Link Extractor](https://apify.com/ninhothedev/website-link-extractor)
- [Sitemap URL Extractor](https://apify.com/ninhothedev/sitemap-url-extractor)
- [Redirect Chain Tracer](https://apify.com/ninhothedev/redirect-chain-tracer)

### FAQ

**Does it crawl the whole site?** No — it checks the links found on the exact page URLs you supply. Feed it many URLs (or pair it with the Sitemap URL Extractor) to cover a whole site.

**Does it need a proxy?** No. It operates on the URLs you provide and is datacenter-friendly. For sites that aggressively block bots, add a proxy.

**What counts as broken?** Any link returning HTTP `>= 400`, or one that times out / errors before a response arrives.

***

**Keywords:** broken link checker, 404 checker, dead link finder, link checker, redirect checker, SEO audit tool, link rot, website link checker, broken link finder, HTTP status checker, site maintenance, QA links, crawl links, check links.

# Actor input Schema

## `mode` (type: `string`):

Operating mode. 'check' fetches each input page URL, extracts every <a href> link and checks each link's HTTP status, reporting broken links, redirects and status codes.

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

One or more page URLs to crawl. For each page, every <a href> link is extracted, resolved to an absolute URL and checked. Add the pages whose outbound links you want to audit.

## `checkExternal` (type: `boolean`):

When enabled (default), links pointing to other domains are also checked. Disable to check only internal links (same host as the source page) for a faster, on-site-only audit.

## `maxLinksPerPage` (type: `integer`):

Maximum number of unique links to extract and check from each page. Keeps runs cheap and predictable on link-heavy pages.

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

Maximum number of checked links (dataset items) to produce across all pages before stopping. Caps cost for large jobs.

## Actor input object example

```json
{
  "mode": "check",
  "urls": [
    "https://en.wikipedia.org/wiki/Web_scraping"
  ],
  "checkExternal": true,
  "maxLinksPerPage": 200,
  "maxItems": 500
}
```

# 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 = {
    "urls": [
        "https://en.wikipedia.org/wiki/Web_scraping"
    ],
    "maxLinksPerPage": 200,
    "maxItems": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/broken-link-checker").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 = {
    "urls": ["https://en.wikipedia.org/wiki/Web_scraping"],
    "maxLinksPerPage": 200,
    "maxItems": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/broken-link-checker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://en.wikipedia.org/wiki/Web_scraping"
  ],
  "maxLinksPerPage": 200,
  "maxItems": 500
}' |
apify call ninhothedev/broken-link-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ninhothedev/broken-link-checker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Broken Link Checker - 404 & Redirect Finder",
        "description": "$0.5/1K 🔥 Broken link checker! Crawl a page's links & flag 404s, redirects & errors. No key. JSON, CSV, Excel or API in seconds. Fix link rot & boost SEO ⚡",
        "version": "0.1",
        "x-build-id": "jV3Yic6zJqKqvleb7"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ninhothedev~broken-link-checker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ninhothedev-broken-link-checker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ninhothedev~broken-link-checker/runs": {
            "post": {
                "operationId": "runs-sync-ninhothedev-broken-link-checker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ninhothedev~broken-link-checker/run-sync": {
            "post": {
                "operationId": "run-sync-ninhothedev-broken-link-checker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "urls"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "check"
                        ],
                        "type": "string",
                        "description": "Operating mode. 'check' fetches each input page URL, extracts every <a href> link and checks each link's HTTP status, reporting broken links, redirects and status codes.",
                        "default": "check"
                    },
                    "urls": {
                        "title": "Page URLs to check",
                        "type": "array",
                        "description": "One or more page URLs to crawl. For each page, every <a href> link is extracted, resolved to an absolute URL and checked. Add the pages whose outbound links you want to audit.",
                        "default": [
                            "https://en.wikipedia.org/wiki/Web_scraping"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "checkExternal": {
                        "title": "Check external links",
                        "type": "boolean",
                        "description": "When enabled (default), links pointing to other domains are also checked. Disable to check only internal links (same host as the source page) for a faster, on-site-only audit.",
                        "default": true
                    },
                    "maxLinksPerPage": {
                        "title": "Max links per page",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum number of unique links to extract and check from each page. Keeps runs cheap and predictable on link-heavy pages.",
                        "default": 200
                    },
                    "maxItems": {
                        "title": "Max checked links (total)",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of checked links (dataset items) to produce across all pages before stopping. Caps cost for large jobs.",
                        "default": 500
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
