Broken Link Checker: Find Broken Links, Images & Redirects
Pricing
from $0.50 / 1,000 link checkeds
Broken Link Checker: Find Broken Links, Images & Redirects
Crawl a website and check every link, image, script and stylesheet once. Finds 404s, server errors, DNS failures, redirect chains and mixed content, and shows the pages where each broken link appears.
Pricing
from $0.50 / 1,000 link checkeds
Rating
0.0
(0)
Developer
Pavel Tashev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
What does Broken Link Checker do?
Broken Link Checker crawls your website and checks every link, image, script, stylesheet and embed once, then tells you exactly which links are broken and on which pages they appear. Enter a website such as example.com and it finds 404 pages, server errors, dead domains (DNS failures), timeouts, SSL problems, redirect loops, long redirect chains and insecure (mixed content) resources.
Each problem is one row with every page that links to it, the link text, a plain-language explanation and the full redirect chain, so you know what to fix and where. Because it runs on the Apify platform, you get API access, scheduling (weekly site-health checks), webhooks, integrations (Make, Zapier, n8n, Google Sheets, Slack) and run monitoring.
Why use Broken Link Checker?
- SEO and user experience: broken links waste crawl budget and frustrate visitors; redirect chains slow pages down.
- Website migrations and redesigns: verify that nothing broke after moving pages or changing URLs.
- Content audits: find dead outbound links in old blog posts and documentation.
- Fewer false alarms: sites that block bots (HTTP 401/403/429, Cloudflare challenges) are marked possibly-blocked, not broken, and every failed HEAD request is confirmed with a GET before it is reported.
- Scheduled monitoring: run it weekly and get a webhook or email only when new broken links appear.
How to find broken links on a website
- Click Try for free.
- In Websites to check, enter one or more websites or pages (for example
example.com). - Optionally set Maximum pages to crawl per website and Maximum crawl depth.
- Click Start.
- Open the Output tab. Overview lists broken, blocked and redirected links with the pages where they appear; Redirects shows each redirect chain. A summary per website is in the key-value store as
SITE_SUMMARY.
Input
| Field | Description | Default |
|---|---|---|
| Websites to check | Websites, domains or start pages. Pages on the same website are crawled; links to other websites are checked but not crawled | – |
| Maximum pages to crawl per website | Crawl limit; all links on crawled pages are still checked | 500 |
| Maximum crawl depth | Clicks away from the start page (0 = only the start page's links) | 5 |
| Check links to other websites | Check external links too | on |
| Check images, scripts and stylesheets | Also check img (including srcset), script, stylesheets, icons, iframe, video, audio | on |
| Report redirected links | Include working links that redirect, with the chain | on |
| Report all links | Save working links as well | off |
| Detect soft 404 pages | Pages that return 200 but say "not found" in the title count as broken | off |
| Also crawl pages from the sitemap | Add sitemap pages, so orphan pages are checked | off |
| Skip URLs matching | Glob (*/tag/*), text (/cart) or regex between slashes | none |
| Parallel requests | Total parallel checks (same-host requests are limited to half, 4–10) | 10 |
| Request timeout (seconds) | Slower links are reported as timeout | 15 |
| Identify as a web browser | Send a Chrome User-Agent instead of BrokenLinkChecker/1.0 | off |
Example input:
{"startUrls": ["example.com"],"maxPagesPerSite": 1000,"excludePatterns": ["*/tag/*", "/\\?replytocom=/"]}
Output
One item per problem link. Real examples from a run on 15 September 2026 against crawler-test.com (a public test site full of intentional errors):
{"site": "https://crawler-test.com","linkUrl": "https://crawler-test.com/redirects/redirect_1","finalUrl": "https://crawler-test.com/redirects/redirect_target","status": 200,"statusCode": 200,"category": "redirect","message": null,"isExternal": false,"linkType": "a","mixedContent": false,"redirectChain": [{ "url": "https://crawler-test.com/redirects/redirect_1", "status": 301 },{ "url": "https://crawler-test.com/redirects/redirect_target", "status": 200 }],"sourceCount": 1,"sourcePages": [{ "pageUrl": "https://crawler-test.com/", "anchorText": "Redirect 301", "element": "a", "attribute": "href" }],"checkedAt": "2026-09-15T12:07:24.193340+00:00"}
A broken link looks like "status": 404, "category": "broken", "message": "HTTP 404: the page was not found."; a dead domain like "status": "dns-error", "message": "The domain name could not be resolved (DNS failure); the domain may not exist.".
That run crawled 29 pages and checked 414 unique links in 60 seconds: 70 broken, 11 redirects, 5 possibly blocked, 2 mixed-content resources, 13 URLs skipped because robots.txt disallows them.
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Output fields
| Field | Meaning |
|---|---|
category | broken, redirect, possibly-blocked or ok |
status | HTTP status code, or an error: dns-error, timeout, ssl-error, connection-refused, connection-error, too-many-redirects, invalid-redirect, protocol-error, soft-404 |
statusCode, message | Numeric HTTP status (when there was a response) and a plain-language explanation |
linkUrl, finalUrl | Link as found (normalized, without #fragment) and where it ends up after redirects |
redirectChain | Every hop with its status code |
linkType | Element the link came from: a, img, script, link, iframe, source, video, audio, sitemap |
isExternal, mixedContent | Points to another website; http:// resource embedded in an https:// page |
sourcePages, sourceCount | Up to 20 pages containing the link (with anchor text) and the total number of occurrences |
site, checkedAt | Website crawled and check time (UTC) |
SITE_SUMMARY (key-value store) has per website: pages crawled, links checked, broken, redirects, blocked, mixed content, URLs skipped by robots.txt, and the 10 pages with the most broken links.
How much does it cost to check a website for broken links?
This Actor uses pay-per-event pricing: you pay per unique link checked (each URL is checked once per run, however many pages link to it). Crawled pages count as links. Platform compute is included. See the Pricing tab for the price per 1,000 links. A typical 200-page small-business site has 1,000–3,000 unique links.
You can set a maximum cost per run: the Actor stops starting new checks when the budget is reached and still saves everything checked so far.
Tips
- Start small: try 50 pages first to see how many links your site has.
- Big sites: raise Parallel requests to 20–30 and exclude endless URL patterns (calendars, filters,
?sort=), or turn off external links. - Many
possibly-blockedlinks? Social networks and some CDNs block automated checks. Turn on Identify as a web browser, or simply verify those few links manually. - Long crawls: increase the run timeout; the Actor stops starting new checks two minutes before the timeout and saves results.
- Orphan pages: turn on Also crawl pages from the sitemap.
Related tools
More website audit tools:
- Sitemap URL Extractor: list every URL of a website from its sitemaps, or only new and removed pages.
- SEO Audit & Metadata Checker: check titles, meta descriptions, canonicals and other on-page SEO for pages or whole sites.
- Website Tech Stack Detector: detect the CMS, frameworks, analytics and hosting of any website.
FAQ, limitations and support
Does it respect robots.txt? Yes. Pages disallowed for crawlers are not requested and are counted in SITE_SUMMARY. It uses at most 4–10 parallel requests per host with small delays.
Does it run JavaScript? No. It reads the HTML the server sends, like search engines' first pass. Links added only by JavaScript are not found.
What about email and phone links? mailto:, tel: and javascript: links are skipped and never saved.
Why is a working link marked possibly-blocked? The server refused an automated request (401, 403, 429, 999 or a Cloudflare/Akamai challenge). It usually works in a browser.
Something wrong or missing? Open an issue in the Issues tab. Custom website audits and integrations are available on request.
Only check websites you are allowed to crawl.