Broken Link Checker: Crawl Sites, Find Dead Links
Pricing
from $1.40 / 1,000 page crawleds
Broken Link Checker: Crawl Sites, Find Dead Links
Crawls whole websites and checks every link, image and optional script or stylesheet. Reports 404s, server errors, dead domains, timeouts and redirect chains with the exact page and anchor text, plus mixed content and links to localhost or staging hosts. Pay per crawled page.
Pricing
from $1.40 / 1,000 page crawleds
Rating
0.0
(0)
Developer
Batu T.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Security
Limited permissionsShare
Broken Link Checker: 404s, Redirects, Mixed Content
Crawl a whole website and check every link on it: pages, images and, if you want, scripts and stylesheets. You get one row per problem with the exact page it sits on and the anchor text, so you can fix it in minutes. Plus one summary per website with the numbers and the worst offenders.
What it finds
| status | meaning |
|---|---|
broken | the link answers 4xx or 5xx (404 Not Found, 410 Gone, 500 Server Error ...) |
dns-error | the domain does not exist any more |
connection-error | connection refused or reset, TLS certificate errors |
timeout | no answer within the timeout |
too-many-redirects | redirect loops and chains longer than the limit |
invalid-url | malformed href in the HTML |
redirect | works, but via 301/302/307/308; finalUrl and the full redirectChain show where it ends |
blocked | the server refused the bot (429 rate limit, or 401/403/999 on external sites). Check these by hand |
skipped | disallowed by robots.txt (only listed with output "All checked links") |
Extra flags in issues:
mixed-content: an http image, script or stylesheet on an https pagestaging-host: links to localhost, private IPs,.local/.testhosts, tunnels or subdomains likestaging.,dev.,preview.
Output
One item per problem link occurrence:
| field | example |
|---|---|
sourcePage | https://www.example.de/kontakt |
linkUrl | https://www.example.de/alte-seite |
href | /alte-seite (as written in the HTML) |
anchorText | Zur Anfahrt (alt text for images) |
element | a, img, script, link |
isExternal | false |
status, statusCode | broken, 404 |
finalUrl, redirectChain | after redirects: ["301 http://example.de/x", "301 https://example.de/x"] |
issues | ["mixed-content"] |
error | HTTP 404, Domain does not resolve (ENOTFOUND) |
countOnPage | how often this link appears on that page |
Plus one item with type: "summary" per website: pagesCrawled, linksFound, linksChecked, ok, broken, brokenInternal, externalBroken, redirects, blocked, timeouts, mixedContent, stagingLinks, pagesWithProblems, topBrokenUrls and topRedirects (each with occurrences and example pages), robotsTxt, stoppedBy, durationSecs. The summaries are also saved as SUMMARY in the key-value store.
Filter the dataset by type = link or summary when you export to CSV or Excel.
How it checks
- Crawls pages on the start host (www and non-www count as one site, subdomains optional), breadth first, up to
maxPagesPerSite. Links on crawled pages are all checked, also those the page limit stops it from opening. - HEAD request first; GET when the server rejects or mishandles HEAD (400, 403, 404, 405, 429, 5xx, empty response). This avoids the false 405s and 404s that simpler checkers report.
- Redirects are followed one by one, so you see every hop and loops are detected.
- Every unique external URL is checked once per run, even across several websites.
- At most 5 parallel requests per host, one slower retry on 429, honest user agent, robots.txt respected (also for redirect targets).
Output: problems only (default) or every checked link.Report redirects: all, only for links to your own site, or none (wa.me or link shortener redirects are usually intended).Exclude URLs matchingskips URLs by regular expression, for examplelinkedin\.comor\?sort=.Only crawl URLs matchinglimits the crawl to a section such as/blog/.
Pricing
You pay per crawled page (an HTML page of your site that was opened and checked). Link checks, images and external URLs are included. Start URLs that fail (invalid, not reachable, not HTML, disallowed by robots.txt) are not charged; they appear as a summary item with an error.
Limits
- No JavaScript rendering: links that only appear after client-side rendering are not found. Server-rendered sites, WordPress, Next.js static export and most CMS sites work fine.
- Some sites (LinkedIn, Instagram, sites behind bot protection) refuse automated requests. Those links are reported as
blocked, notbroken. A proxy can be set as fallback for them. - No login, no forms, no cookies. Sites that need a cookie to load may show as redirect loops.
Input example
{ "startUrls": ["https://www.example.de/"], "maxPagesPerSite": 200, "checkScriptsAndStyles": true }
FAQ
What am I charged for? One event per crawled HTML page of your website. Checking links, images and external URLs is included. Start URLs that fail are not charged and show up as a summary item with an error. When your charge limit is reached, the crawl stops and the summary says stoppedBy: "charge limit".
What happens when maxPagesPerSite is reached? The crawler stops opening new pages, but every link found on the pages it already crawled is still checked. The summary then says stoppedBy: "maxPagesPerSite".
Do I need a proxy? No. Requests go out directly by default. If you configure a proxy, the default fallback strategy retries links that answer 401, 403, 429 or 999 or fail to connect once through the proxy; the always strategy sends every request through it.
Why is a link blocked and not broken? Rate limits (429) and bot refusals from other websites (401, 403, 999) say nothing about whether the page exists, so they are listed as blocked for a manual check instead of being counted as broken.
Does it render JavaScript or log in? No. It reads the HTML the server sends, without login, forms or cookies. Links that only appear after client-side rendering are not found.
Use with AI agents (MCP)
This Actor works as a tool for Claude, ChatGPT, Cursor and other MCP clients through the Apify MCP server. Add only this Actor:
https://mcp.apify.com?tools=webify-lab/broken-link-checker
On first use the server signs you in with OAuth. Alternatively send the header Authorization: Bearer <APIFY_TOKEN>. Agents on the default Apify MCP setup can also find this Actor with search-actors and run it with call-actor. Pricing is the same as in Apify Console: you pay per result.