Broken Link Checker - Find 404s and Dead Links avatar

Broken Link Checker - Find 404s and Dead Links

Pricing

from $3.00 / 1,000 website checkeds

Go to Apify Store
Broken Link Checker - Find 404s and Dead Links

Broken Link Checker - Find 404s and Dead Links

Crawl any website and find broken links, 404 errors, redirect chains, timeouts, and SSL failures. Essential for SEO audits, QA, and content maintenance. Export data, run via API, schedule and monitor runs, or integrate with other tools.

Pricing

from $3.00 / 1,000 website checkeds

Rating

0.0

(0)

Developer

NanoScrape

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

3

Monthly active users

10 days ago

Last modified

Share

Broken Link Checker

Find every broken link on any website. 404s, redirects, SSL errors, timeouts.

Point this actor at any domain and it will crawl internal pages, extract every link, image, stylesheet, script and iframe, then check each one over HTTP. You get back a clean dataset of broken links with status codes, redirect chains, response times and precise error classifications, ready for SEO reports, QA sign-off, or agency deliverables.

No browser, no JavaScript rendering, no heavy frameworks. Just fast concurrent HTTP checks at machine speed with a real Chrome TLS fingerprint so Cloudflare-protected pages are not falsely flagged as broken.

Features

  • Internal + external checking. Same-domain crawl plus outbound link validation.
  • Every link type. Anchors, images, stylesheets, scripts, iframes.
  • Smart HEAD to GET fallback. Fast by default, accurate when servers misbehave.
  • Redirect chain capture. See every hop in a 301 to 302 to 200 sequence.
  • Precise error classification. 404, 500, timeout, DNS, SSL, connection reset. Each bucketed.
  • Cloudflare / WAF aware. Pages guarded by Cloudflare, DataDome or PerimeterX are surfaced separately so bot walls do not pollute your broken count.
  • Depth control. Crawl 1 page or 10 levels deep.
  • robots.txt aware. Respects the site's crawl policy.
  • Parallel requests. Configurable concurrency, defaults to 10.
  • Per-site summary. Broken counts, most-broken page, status code breakdown, health flag.
  • Fast and lightweight. Runs at 128 MB RAM with no browser overhead.

Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client, such as Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

Apify MCP server URL:

https://mcp.apify.com?tools=santamaria-automations/broken-link-checker

Example prompt once connected:

"Use broken-link-checker to check https://example.com for broken links. Return results as a table."

Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.

Example Output

Running against a site with a broken image and a redirected outbound link returns records like:

{
"website": "https://example.com",
"url": "https://cdn.example.com/images/hero.png",
"source_page": "https://example.com/",
"link_text": "Hero banner",
"link_type": "image",
"is_internal": false,
"status_code": 404,
"status_category": "client_error",
"error": "",
"response_time_ms": 142,
"redirect_chain": [],
"final_url": "https://cdn.example.com/images/hero.png",
"checked_at": "2026-07-20T10:15:32Z"
}

A redirected link with the full chain:

{
"website": "https://example.com",
"url": "http://oldblog.example.com/post-1",
"source_page": "https://example.com/blog",
"link_text": "Read the original post",
"link_type": "anchor",
"is_internal": false,
"status_code": 200,
"status_category": "ok",
"response_time_ms": 318,
"redirect_chain": [
"https://blog.example.com/posts/post-1"
],
"final_url": "https://blog.example.com/posts/post-1",
"checked_at": "2026-07-20T10:15:33Z"
}

Plus one summary record per website:

{
"website": "https://example.com",
"type": "summary",
"total_links_checked": 842,
"broken_count": 17,
"possibly_protected_count": 2,
"redirect_count": 34,
"timeout_count": 2,
"external_broken": 12,
"internal_broken": 5,
"pages_crawled": 45,
"most_broken_page": "https://example.com/resources",
"broken_by_category": {
"404": 13,
"500": 1,
"ssl_error": 1,
"timeout": 2
},
"site_health_flag": "many_broken",
"scraped_at": "2026-07-20T10:16:02Z"
}

Cloudflare-protected pages

Some pages return HTTP 403 or 429 to any client that does not look like a full browser, even though real users load them just fine. Naive link checkers count these as broken and inflate the error count. This actor does not.

Requests are issued with a Chrome 124 TLS fingerprint plus the full set of Sec-Ch-Ua and Sec-Fetch headers a real browser sends. That alone recovers most WAF-guarded pages as regular 200 OK responses.

When a page still returns 403 or 429 and the response carries any of the following markers, it is classified as possibly_protected rather than client_error:

  • Body signals: cf-challenge, Cloudflare, Attention Required, Access denied, Just a moment, _cf_chl, datadome, perimeterx, Ray ID:, Please enable JavaScript and cookies, px-captcha
  • Header signals: Cf-Ray, Cf-Cache-Status, Server: cloudflare, Server: datadome, Retry-After on a 429
  • Heuristic: body length under 5 KB on a 403 response

possibly_protected links appear in the output so you can inspect or filter them, but they do NOT count toward broken_count and do NOT change the site_health_flag. A separate possibly_protected_count field on the summary row surfaces the total.

Status classification

status_categoryCounts as broken?Meaning
okno2xx response
redirectno3xx response, tracked in redirect_chain
client_error404 and 410 only4xx response. 401, 403, 429 alone do NOT count as broken
server_erroryes5xx response
timeoutyesRequest exceeded the configured timeout
dns_erroryesHost does not resolve
ssl_erroryesTLS certificate invalid or expired
connection_erroryesConnection refused, reset, or otherwise failed at transport
possibly_protectedno403 / 429 with WAF signatures, surfaced separately

Input Parameters

ParameterTypeDefaultDescription
websitesarrayrequiredStarting URLs to check.
maxDepthinteger2How many levels of internal links to follow.
maxUrlsPerSiteinteger1000Safety cap on unique links per website.
checkExternalbooleantrueAlso validate links to other domains.
followRedirectsbooleantrueFollow 3xx chains up to 10 hops.
respectRobotsTxtbooleantrueHonor the site's robots.txt.
timeoutSecondsinteger15Per-link HTTP timeout.
concurrencyinteger10Parallel link checks.
userAgentstringdefault Chrome UACustom User-Agent header.
includeOKbooleanfalseInclude 200 OK links in output.
proxyConfigurationobjectdisabledOptional Apify proxy.

Use Cases

SEO Audits

Google penalizes sites with broken links and dead outbound references. Run this monthly against your whole site, filter the dataset by status_category = "client_error" or "server_error", and ship a prioritized fix list to your content team.

Content Maintenance

Blog posts and documentation rot over time as linked sources disappear. Point the checker at /blog/ and catch every dead reference before readers do.

Broken backlinks on other sites are gold. They point at pages that used to work. Run the checker against your own 404 log sources and prioritize outreach by the most-broken referring pages.

QA Testing

Pre-launch validation: before you push a new site live, run the checker with maxDepth=5 against staging to catch every broken asset, dead internal link, and misconfigured CDN URL.

Agency Reporting

Automate monthly site health reports for clients. Combine the summary record with a dashboard and you have got a recurring deliverable that catches problems before clients do.

Post-Migration Checks

Site moved to a new CMS? Domain changed? Run the checker immediately after launch and diff against the pre-migration baseline to guarantee no page and no asset was lost in transit.

Competitor Intel

Run the checker against competitor domains and use their broken pages as your opportunity. Broken content means abandoned topics, missing products, or outreach targets.

Pricing

  • $0.001 per run start
  • $0.003 per website checked

Pricing is per website, not per link. Checking 10,000 links on one site costs the same as checking 10. Run it against large domains without worrying about a surprise bill. 100 sites = $0.30.

Issues & Feedback

Found a bug or have a feature request? Please open an issue on the actor page.