Free SEO Tools

Broken Link Checker Free

Run a capped public crawl to find broken internal and external links from a starting URL.

Broken link report

Run a small crawl to find broken links from a starting page.

What one run covers

The checker loads your starting page, collects every link on it, and tests each one. It then opens other pages on the same site that it found along the way and does the same, until it has read 10 pages or tested 80 different link targets, whichever comes first. Internal and external links share the 80.

How each link is tested

  • Only links written as an a element with an http or https address count. Images, scripts, stylesheets, iframes, mailto: and tel: links are not checked.
  • Each target is tested once, even if 30 pages link to it. The Source column shows the first page where it was found.
  • A #section at the end of a link is dropped, so a jump link is tested as the page it belongs to.
  • The checker sends a HEAD request first and waits up to 7 seconds. If the server answers 403 or 405, which some servers do for HEAD only, it retries with a GET and stops as soon as the status code arrives, so the size of the page never matters.
  • Redirects are followed, up to four. The status shown is where the link finally lands, so a link that redirects to a working page shows 200.
  • Anything below 400 is fine. A status of 400 or above, or no answer at all, makes the row red and counts as broken.
  • Links added by JavaScript after the page loads are not seen, because the checker reads the HTML the server sends.

Choosing the starting URL

Links are tested in the order they appear in the page source, which on most WordPress themes means the header menu first, then the content, then the sidebar and footer. On a homepage with a large mega menu, much of the 80-link budget can go on navigation before the checker reaches a single post.

So pick the start to match the question. To check a post’s outbound links, start on that post. To check the menus and footer, start on the homepage once; those links are the same on every page, so one pass covers them. To check a section, start on its category or hub page, since the pages it visits next are the ones linked earliest from there.

The crawl stays on the origin the starting URL lands on. If you type example.com and the site redirects to https://www.example.com, it crawls https://www.example.com. Links to any other host or protocol, such as an old http:// link on an https site, are tested but not crawled.

Pages crawled counts only pages that loaded. A link that appears in the menu, the content and the footer takes one place in the queue, and a page that fails to load or answers with an error is skipped, with a warning, so the next page in the queue takes its place. To keep the free check fast, it stops after 15 page requests, so a section full of dead pages can still end under 10. If the start page itself cannot be loaded, or is larger than about 900 KB, you get an error message instead of a report. If it loads but answers with an error status, its links are still tested and a warning gives the status.

Reading the report

Pages crawled, Links checked and Broken links are counts. Warnings tells you when a cap cut the run short: Link checks were capped at 80 links, or The crawl was capped at 10 pages. Either one means there are links this run did not test, so start again from a different page to cover more. A warning that some pages could not be loaded means the links on those pages were not tested; the pages themselves are in the table as broken targets.

The table lists every link tested, not only the broken ones, in the order they were checked. Broken targets are in red. Status is the HTTP code, or the error message when there was no code to show. Target is the link’s destination and Source is the page where it was found.

The report does not show the anchor text. To find a link on the source page, open that page, view its source and search for the target address. In the WordPress block editor, Options → Code editor shows the post’s markup, and your browser’s find will jump to the link.

What each status means

Red does not always mean broken for your visitors. Some sites refuse automated requests while serving people normally. Open any doubtful link in a browser before you edit anything.

Status shownWhat it usually meansLikely real?
404 or 410The page is gone or was moved without a redirectYes
401The target needs a login, such as a members area or a client portalFor public visitors, yes; it may be intended
403Bot protection or a firewall refused the request, even after the GET retryOften not; check in a browser
429The site rate-limited the checkerRarely
999A non-standard code LinkedIn and a few other sites send to automated requestsRarely
500 to 504The target server failed or was overloadedSometimes; run the check again later
The domain could not be found. Check the address for typos.A typo in the link, or a domain that has expiredYes
The website took too long to respond.No answer within 7 secondsSometimes
The website’s HTTPS certificate or secure connection could not be verified.An expired or misconfigured certificate; browsers warn visitors tooYes, for most visitors
Too many redirects.More than four redirects before a page answeredPossibly; trace it in the Redirect Checker
Private or local network URLs are not supported.The link points at localhost, an intranet or a private IP, often a leftover from stagingYes, for public visitors

Worked example: one old post, five red rows

Illustrative values. A gardening blog checked a 2024 post that still gets search traffic. The run reported 10 pages crawled, 80 links checked and 5 broken links, plus the warning that link checks were capped at 80.

Internal page renamed

Before: 404 · https://www.example.com/seed-starting-guide/

After: Link updated to https://www.example.com/start-seeds-indoors/

The guide was a page, not a post, so WordPress did not redirect the old slug. The link in the post was updated, and a 301 from the old address was added for links elsewhere.

External page removed

Before: 404 · https://supplier.example.org/products/tomato-cage

After: Link updated to the supplier’s current product page

Found by searching the supplier’s site. When nothing equivalent exists, remove the link or cite another source.

Domain gone

Before: The domain could not be found. Check the address for typos. · https://old-garden-forum.example/

After: Link removed

An expired domain can be registered by anyone later, so a link to it can end up pointing at something you would never endorse. Remove these promptly.

Bot protection, not a broken link

403 · https://www.big-retailer.example/item/48213

Opened normally in a browser. Left as it is.

Social profile, not a broken link

999 · https://www.linkedin.com/in/example-author

LinkedIn answers automated requests with 999. Left as it is.

Three real problems and two false alarms. The 80-link cap also meant the footer of later pages was never reached, so a second run from the homepage covered the site-wide links.

What to fix first

Google has said for years that 404s on their own do not hurt how the rest of a site ranks. The cost of a broken link falls on readers who hit a dead end, and on links you control that no longer pass anyone anywhere. Work in this order:

  1. 1.Internal links in menus, headers and footers, because they break on every page at once.
  2. 2.Internal links in posts and pages that get traffic. Point them at the current URL rather than relying on a redirect.
  3. 3.External links to dead domains, for the reason in the worked example.
  4. 4.External links that return 404 or 410 in posts people still read: replace the source or remove the link.
  5. 5.Everything ambiguous, such as 403, 429, 999 and timeouts: open each in a browser and act only on the ones that fail there too.

A link that redirects is not reported, because it still works. If you want internal links to point straight at final URLs, check them separately in the Redirect Checker, or look at the internal link structure with the Internal Link Checker.

Confirming the fix

Clear the page and CDN caches first, then repeat the run from the same starting URL so the same pages and links are tested. Rows you fixed should now be gone from the red list, and the Broken links count should only include the ones you decided to leave.

For an internal URL you redirected, run the old address through the Redirect Checker as well, so you know it lands on the new page in one hop. For URLs listed in Search Console’s Not found (404) report, use Validate fix only once every example URL either works or is meant to stay gone. Pages you deleted on purpose can stay listed there; Google rechecks them less and less often.

On a site that changes often, run the same three checks every few months: the homepage, the busiest post and the newest post.

When a red row can wait

Not every red row deserves an edit today. Bot blocks (403, 429 and 999) that open fine in a browser and a single 5xx that clears on a second run can be ignored. So can a 401 on a link meant for logged-in members.

Old comments with dead commenter websites, and posts that no one reads and that you plan to merge or retire, sit at the bottom of the list. If a post is about to be retired, redirect or delete the post rather than repairing its links.

The checker tests every link, including ones marked nofollow or sponsored, because a dead link frustrates a reader whatever its rel value. Those attributes change nothing about how urgent the fix is.

FAQ about the Broken Links

How deep does this checker crawl?

Up to 10 pages on the same site as the page the starting URL lands on, and up to 80 unique links across them, internal and external together. It is a spot check of one area of the site, so choose the starting page with care and run it again from other pages to cover more.

Why check external links?

Because they break without warning when other sites reorganize, and readers blame your page for the dead end. A link to an expired domain is the worst case: whoever registers it next decides what your readers land on.

Why is a link marked broken when it opens fine in my browser?

Many sites block automated requests. A 403, 429 or LinkedIn’s 999 usually means the site refused the checker, not that the page is gone. Timeouts are also often false alarms. Act on a row only if the page fails in a browser too.

Does it check images, scripts and stylesheets?

No. It tests links in a elements only. A missing image or script shows up in your browser’s developer tools on the Network tab, and Search Console’s URL Inspection lists page resources that could not be loaded.

Do broken links hurt my rankings?

Not directly, according to Google; a 404 is a normal part of the web. They do hurt readers, and broken internal links waste the paths Google uses to find and understand your pages. Fix the ones in navigation and in posts that get traffic first.

Should I fix the link or add a redirect?

For links on your own site, fix the link so it points at the current URL. Add a 301 as well when the old URL may be linked from other sites, bookmarked or shared, so those visitors still arrive.

Why does a redirected link show as OK?

The checker follows up to four redirects and reports where the link ends. A link that lands on a working page is not broken. If you want to see the chain, run the link through the Redirect Checker.

Why did it only crawl one page?

Usually because the start page’s menu and links are built by JavaScript, so the HTML the server sends has no internal links to follow. It also happens when the internal links use another host or protocol than the page the starting URL lands on, such as http:// links on an https site, and when every linked page failed to load, which the warnings tell you.