Broken Link Checker: Find Broken Links, Images & Redirects avatar

Broken Link Checker: Find Broken Links, Images & Redirects

Pricing

from $0.50 / 1,000 link checkeds

Go to Apify Store
Broken Link Checker: Find Broken Links, Images & Redirects

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

Pavel Tashev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

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.

  • 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.
  1. Click Try for free.
  2. In Websites to check, enter one or more websites or pages (for example example.com).
  3. Optionally set Maximum pages to crawl per website and Maximum crawl depth.
  4. Click Start.
  5. 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

FieldDescriptionDefault
Websites to checkWebsites, 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 websiteCrawl limit; all links on crawled pages are still checked500
Maximum crawl depthClicks away from the start page (0 = only the start page's links)5
Check links to other websitesCheck external links tooon
Check images, scripts and stylesheetsAlso check img (including srcset), script, stylesheets, icons, iframe, video, audioon
Report redirected linksInclude working links that redirect, with the chainon
Report all linksSave working links as welloff
Detect soft 404 pagesPages that return 200 but say "not found" in the title count as brokenoff
Also crawl pages from the sitemapAdd sitemap pages, so orphan pages are checkedoff
Skip URLs matchingGlob (*/tag/*), text (/cart) or regex between slashesnone
Parallel requestsTotal parallel checks (same-host requests are limited to half, 4–10)10
Request timeout (seconds)Slower links are reported as timeout15
Identify as a web browserSend a Chrome User-Agent instead of BrokenLinkChecker/1.0off

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

FieldMeaning
categorybroken, redirect, possibly-blocked or ok
statusHTTP status code, or an error: dns-error, timeout, ssl-error, connection-refused, connection-error, too-many-redirects, invalid-redirect, protocol-error, soft-404
statusCode, messageNumeric HTTP status (when there was a response) and a plain-language explanation
linkUrl, finalUrlLink as found (normalized, without #fragment) and where it ends up after redirects
redirectChainEvery hop with its status code
linkTypeElement the link came from: a, img, script, link, iframe, source, video, audio, sitemap
isExternal, mixedContentPoints to another website; http:// resource embedded in an https:// page
sourcePages, sourceCountUp to 20 pages containing the link (with anchor text) and the total number of occurrences
site, checkedAtWebsite 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.

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-blocked links? 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.

More website audit tools:

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.