Broken Link Checker: Find 404s & Dead Links on Any Website avatar

Broken Link Checker: Find 404s & Dead Links on Any Website

Pricing

from $0.40 / 1,000 url checkeds

Go to Apify Store
Broken Link Checker: Find 404s & Dead Links on Any Website

Broken Link Checker: Find 404s & Dead Links on Any Website

Crawl any website and find broken links: 404s, 5xx errors, dead domains, timeouts, broken images and redirect chains, with the exact page and anchor text where each bad link appears. Bulk sites, CSV export, scheduled checks.

Pricing

from $0.40 / 1,000 url checkeds

Rating

0.0

(0)

Developer

Datawright Labs

Datawright Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Share

Find every broken link on a website in one run. Enter a domain, and this broken link checker crawls its pages, checks every internal and external link (and optionally every image, script and stylesheet), and gives you a clean list of 404s, 410s, 5xx server errors, dead domains (DNS failures), timeouts, TLS errors and redirect chains, each with the exact pages and anchor text where the bad link appears, so you know what to fix and where.

No browser, no install, no desktop crawler licence: it's a fast HTTP link checker that runs in the cloud, handles many websites per run, exports to CSV, Excel, JSON or Google Sheets, and can run on a schedule to catch new dead links before your visitors (and Google) do.

  • 🕷️ Crawls your site from any start URL (same host, www. ignored), up to your page and depth limits, respecting robots.txt.
  • 🔗 Checks every link it finds: internal links, outbound/external links, and optionally images, scripts and CSS (broken image checker).
  • 🚦 Classifies each URL: broken (404, 410, 5xx, DNS lookup failed, connection refused, timeout, bad TLS certificate, malformed URL), blocked (401/403/429/999: the site refused automated checks, verify by hand), redirect (works, but via 1+ redirects) or ok.
  • 📍 Shows where each broken link is: foundOn lists the source pages with anchor text, plus a total foundOnCount, so you can fix the most-linked dead URLs first.
  • 🔁 Redirect audit: final URL and hop count for every redirected link, to clean up redirect chains and update internal links.
  • 🧾 A SUMMARY record with pages crawled per site, counts per status and the pages with the most broken links.
  • ⚡ Fast and light: header-only checks, parallel requests with a per-host politeness limit, automatic retries for timeouts, 429s and 5xx.

Use cases

  • SEO audits: broken internal links waste crawl budget and leak link equity; dead outbound links hurt user trust.
  • Website migrations & redesigns: verify every old URL still resolves or redirects after a relaunch.
  • Content maintenance: find dead references in old blog posts, docs and knowledge bases.
  • Agencies: run one job across all client sites every week and send the report to Sheets or Slack.
  • Link building / outreach: find broken outbound links on other sites (broken link building).

How to use it

  1. Paste one or more websites into Websites to check (e.g. https://example.com).
  2. Set Max pages to crawl per site (start with 50-200) and, optionally, turn on Check images, scripts and stylesheets.
  3. Click Start. Open the Broken & blocked links view, or download CSV/Excel.

Input example

{
"startUrls": ["https://example.com", "https://blog.example.org"],
"maxPagesPerSite": 500,
"checkExternalLinks": true,
"checkResources": true,
"outputMode": "problemsAndRedirects",
"excludePatterns": ["/tag/", "?replytocom="]
}

To check the links on a single page only, set maxDepth to 0.

Output example

{
"url": "https://example.com/old-pricing",
"status": "broken",
"httpStatus": 404,
"error": null,
"isInternal": true,
"linkType": "page",
"site": "example.com",
"foundOnCount": 3,
"foundOn": [
{ "pageUrl": "https://example.com/blog/launch", "anchorText": "see our pricing", "tag": "a" },
{ "pageUrl": "https://example.com/faq", "anchorText": "pricing page", "tag": "a" }
],
"firstFoundOn": "https://example.com/blog/launch",
"anchorText": "see our pricing",
"finalUrl": null,
"redirectCount": 0,
"contentType": "text/html",
"responseTimeMs": 182,
"checkedAt": "2026-10-20T01:00:00.000Z"
}

Rows are sorted with broken links first, then blocked, then redirects, each by number of occurrences.

You pay $0.0005 per unique URL checked ($0.50 per 1,000), whether it's a crawled page or a link target. Every URL is checked once per run even if it appears on hundreds of pages. Excluded URLs, robots.txt-disallowed URLs and mailto:/tel: links are free. No start fee.

JobUnique URLs checked (typical)Cost
One page's links (maxDepth: 0)~50-150~$0.03-0.08
Small site, 50 pages~500~$0.25
1,000 unique URLs1,000$0.50
Blog/docs site, 500 pages + images~5,000~$2.50
Weekly check of 10 small client sites~5,000/week~$10/month
  • Apify's free plan includes $5 of monthly credit, i.e. about 10,000 link checks a month for free.
  • Paid Apify plans get automatic discounts: Silver -10%, Gold and above -20%.
  • Set Max pages to crawl per site and Maximum cost per run to hard-cap spend; the Actor stops cleanly at the limit.
This ActorFree online checkersDesktop SEO crawlersSite-audit SaaS
No install, runs in the cloud✅✅❌✅
Pages per scanas many as you setoften capped (e.g. a few hundred)large, limited by your PC / licenceby plan
Internal + external + image links✅partial✅✅
Source page + anchor text per broken link✅sometimes✅✅
Many sites per run, API, schedules, webhooks✅❌❌partial
CSV / Excel / JSON / Google Sheets✅rarely✅✅
Cost model$0.50 per 1,000 URLs, no subscriptionfree with capsannual licencemonthly subscription

Use it as an API (Python, JavaScript, cURL, MCP)

Every Apify Actor is also a REST API, so you can run this broken link checker from your own code, CI pipeline, a no-code tool or an AI agent.

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("datawright-labs/broken-link-checker").call(run_input={"startUrls": ["https://example.com"], "maxPagesPerSite": 100})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["status"], item["url"], item["firstFoundOn"])

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('datawright-labs/broken-link-checker').call({ startUrls: ['https://example.com'], maxPagesPerSite: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL (run and get results in one request)

curl -X POST "https://api.apify.com/v2/acts/datawright-labs~broken-link-checker/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls": ["https://example.com"], "maxPagesPerSite": 100}'

AI agents (MCP)

Add https://mcp.apify.com/?tools=datawright-labs/broken-link-checker to Claude, Cursor or any MCP client and the agent can run it as a tool.

Results can also go straight to Google Sheets, Slack, Make, Zapier, n8n or a webhook via Apify integrations, and you can run it on a Schedule (e.g. every Monday) to monitor for new broken links.

FAQ

Enter your domain and run the Actor. It crawls your pages, tests every link, and lists each broken one with the page and anchor text where it appears. Download the list as CSV or Excel and fix the links in your CMS.

A link whose target returns HTTP 4xx (except 401/403/429, which are reported as blocked) or 5xx after retries, or that fails with a network error: DNS lookup failed (dead domain), connection refused/reset, timeout or an invalid TLS certificate. Malformed href values are reported too.

Sites like LinkedIn (status 999), some CDNs and bot-protected pages refuse automated requests even though the page works in a browser. They are listed separately so you can verify them by hand instead of chasing false positives. Enabling Apify Proxy can reduce them.

Does it check images and other assets?

Yes, turn on Check images, scripts and stylesheets to also verify <img>, <script> and stylesheet URLs (broken image checker).

Does it render JavaScript?

No. It reads the HTML your server returns, like a search-engine crawler's first pass. Links that only exist after client-side rendering are not seen. Most CMS, blog, docs and e-commerce sites serve their links in the HTML.

Can I check only one page?

Yes. Set Max crawl depth to 0 to check all links on the start page(s) only.

Will it overload my server?

No. It sends at most Parallel requests per host (default 8) requests to one host at a time, uses header-only checks for link targets, and respects robots.txt.

Can I schedule it and get alerts?

Yes. Create an Apify Schedule (daily or weekly) and connect Slack, email, Google Sheets or a webhook integration to receive new results.

More tools from Datawright Labs

Made by Datawright Labs: reliable, fairly priced web data tools. Questions or a missing feature? Open an issue on the Issues tab; we usually reply within a day.