# Broken Link Checker (`taroyamada/broken-link-checker`) Actor

Find broken website links. No API key / no login. Open Input → leave defaults → Start (1 start URL + shallow crawl ≈ USD 0.008/row): https://console.apify.com/actors/TtS6DPpMnIiaKnVcI/input

- **URL**: https://apify.com/taroyamada/broken-link-checker.md
- **Developed by:** [naoki anzai](https://apify.com/taroyamada) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Broken Link Checker

**What you get:** one row per crawled page with the list of broken links found on it (target URL, status code, anchor text), starting from your URLs and following internal links up to `maxDepth` / `maxPages`.

Sample output from a real run (2026-10-18, default input: https://example.com, 1 row):

| url | status | brokenLinks | checkedAt |
|---|---|---|---|
| https://example.com | success | \[] (no broken links) | 2026-10-18T11:49:39Z |

That run was one Actor start ($0.001) + 1 page row × $0.008 = $0.009. Every crawled page is one billable row, including pages with no broken links, so `maxPages` is your cost cap.

[Open Input (leave defaults → Start)](https://console.apify.com/actors/TtS6DPpMnIiaKnVcI/input)
Paid first-run JSON ≈ **USD 0.008/row** (1 start URL + shallow crawl). Keep reports, exports, and movement options bounded for the first run. Open Console Input (deep link above) and run this JSON.

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 1,
  "maxPages": 5,
  "concurrency": 1,
  "checkExternal": false,
  "timeoutMs": 10000,
  "delivery": "dataset",
  "webhookUrl": "",
  "dryRun": false
}
```

Paste start URL and Start.

### Run the next report

- Turn broken-link findings into a source-linked client handoff with [Site QA Broken Link Report Scraper](https://apify.com/taroyamada/site-qa-broken-link-report-scraper).
- Check focused robots, sitemap, canonical, or crawler-access issues with [Site QA Indexability & AI Crawler Report](https://apify.com/taroyamada/site-qa-indexability-ai-crawler-report-scraper).
- Check whether repeated failures also affect robots, sitemap, canonical, or crawler access with [Technical SEO & AI Crawler Audit](https://apify.com/taroyamada/technical-seo-portfolio-regression-report).

SEO teams, web operations, agencies, and content QA teams use this actor to turn Public websites supplied by the user into a clean dataset for Site QA & Content Intelligence Pack.
Provide focused source inputs, keep the first run small, and expand only after the output shape is useful.
Each emitted row includes source context, timestamps, and fields designed for monitoring, QA, research, or workflow handoff.

### Store Quickstart

Start with one domain and a shallow crawl depth, then expand depth and URL limits after the first broken-link report is useful.

Recommended first run:

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 1,
  "maxPages": 100,
  "delivery": "dataset",
  "dryRun": false
}
```

### Use with Apify MCP

Exact actor: `taroyamada/broken-link-checker`

Sample input JSON:

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 1,
  "maxPages": 5,
  "concurrency": 3,
  "checkExternal": true,
  "timeoutMs": 10000,
  "delivery": "dataset"
}
```

### Input examples

#### Shallow crawl

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 1,
  "maxPages": 100,
  "delivery": "dataset",
  "dryRun": false
}
```

#### Outbound links

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "checkExternal": true,
  "maxDepth": 2,
  "maxPages": 20,
  "delivery": "dataset",
  "dryRun": false
}
```

#### Webhook audit

```json
{
  "startUrls": [
    "https://example.com/docs"
  ],
  "maxDepth": 1,
  "delivery": "webhook",
  "webhookUrl": "https://example.com/webhook",
  "dryRun": false
}
```

### Input Examples

#### Example: Single page link audit

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 1,
  "maxPages": 1
}
```

#### Example: Small site crawl

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 2,
  "maxPages": 20,
  "concurrency": 3
}
```

#### Example: Internal links only

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 2,
  "maxPages": 10,
  "checkExternal": false
}
```

### Sample output

Row from the real run above:

```json
{
  "url": "https://example.com",
  "brokenLinks": [],
  "checkedAt": "2026-10-18T11:49:39.829Z",
  "status": "success",
  "chargedEvent": "apify-default-dataset-item"
}
```

### Output fields

- `url` — page that was crawled
- `brokenLinks` — broken links found on that page (target URL, status code or error, anchor text)
- `status` — `success`, or an error class when the page itself could not be fetched
- `error` — fetch error, if any
- `checkedAt` — when the page was checked

### Pricing and no-change runs

$0.001 per Actor start and $0.008 per crawled page row. Pages with no broken links are still one row, so set `maxPages` to the number of pages you want to pay for.

The default dataset is the billable surface. Dry runs, validation-only runs, missing-key warnings, and unchanged recurring polls should not write payable default-dataset rows.

### Compliance guardrails

- Crawl only supplied public sites with reasonable limits.
- Use for technical SEO, QA, and maintenance workflows.
- Do not use aggressive crawl settings against sites you do not control.
- Do not use provider emblems or wording that implies approval by an upstream data provider.

### See also

- [bulk-url-health-checker](https://apify.com/taroyamada/bulk-url-health-checker)
- [website-content-extractor](https://apify.com/taroyamada/website-content-extractor)
- [article-content-extractor](https://apify.com/taroyamada/article-content-extractor)

### Related Actors

- Hub: [`taroyamada/article-content-extractor`](https://apify.com/taroyamada/article-content-extractor)
- [`taroyamada/article-content-extractor`](https://apify.com/taroyamada/article-content-extractor)
- [`taroyamada/website-content-extractor`](https://apify.com/taroyamada/website-content-extractor)
- [`taroyamada/rss-feed-aggregator`](https://apify.com/taroyamada/rss-feed-aggregator)
- [`taroyamada/google-news-scraper`](https://apify.com/taroyamada/google-news-scraper)
- [`taroyamada/meta-tag-analyzer`](https://apify.com/taroyamada/meta-tag-analyzer)

# Actor input Schema

## `startUrls` (type: `array`):

Leave the prefilled example.com page and click Start for the first broken-link audit. Or enter public pages you want to crawl.

## `maxDepth` (type: `integer`):

How many internal-link hops to follow from the start URLs. Start low for quick audits; maximum is 5.

## `maxPages` (type: `integer`):

Maximum number of source pages to crawl and emit as page-level dataset rows. Empty falls back to 1.

## `concurrency` (type: `integer`):

Number of parallel requests

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

Also check links pointing to external domains.

## `timeoutMs` (type: `integer`):

Request timeout in milliseconds

## `delivery` (type: `string`):

Output mode. Non-dry-run runs always write canonical page-level dataset rows first. Choose webhook to post the final payload only after dataset/PPE output succeeds.

## `webhookUrl` (type: `string`):

Webhook URL to POST the final payload to when delivery=webhook. Not called during dryRun; sent only after dataset/PPE output succeeds.

## `dryRun` (type: `boolean`):

Run the crawl and local output only. Disables dataset pushes and webhook delivery.

## Actor input object example

```json
{
  "startUrls": [
    "https://example.com"
  ],
  "maxDepth": 1,
  "maxPages": 1,
  "concurrency": 1,
  "checkExternal": true,
  "timeoutMs": 10000,
  "delivery": "dataset",
  "dryRun": false
}
```

# 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 = {
    "startUrls": [
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/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 = { "startUrls": ["https://example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/broken-link-checker").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 '{
  "startUrls": [
    "https://example.com"
  ]
}' |
apify call taroyamada/broken-link-checker --silent --output-dataset

```

## MCP server setup

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

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/TtS6DPpMnIiaKnVcI/builds/fIb6QMNt7DROdhdEM/openapi.json
