Skip to content
AgileLogics

Broken Link Checker

Fetches a page, extracts its links, and checks the first 15 of them for broken (4xx/5xx or unreachable) responses.

How it works

Enter a URL and click Check.

How does the broken link checker decide a link is broken?

It requests each link and looks at the HTTP status code of the response it finally gets. Anything from 200 to 399 is OK; a 4xx client error or 5xx server error is BROKEN; and if no response comes back at all (the domain doesn't resolve, the server times out or refuses the connection, the URL is malformed, or the address is blocked) the link is BROKEN (unreachable) with the reason. One bad link never stops the run: each failure is reported on its own line and the checker moves on.

The page you enter is fetched by our server, which then makes one request per link. Your browser doesn't contact any of the linked sites.

Example run

A product page with a road-shoes link, a link to a discontinued model and an affiliate link that redirects:

OK (200): https://www.example.com/shoes/road
BROKEN (404): https://www.example.com/shoes/old-model
OK (200): https://partner.example.net/sale

The affiliate link returned a 302 first, but the checker followed it and the destination answered 200, so it's OK. That same page also had #reviews and mailto: links, which were skipped. When a page has more than 15 unique links, a final line says so, for example (Checked the first 15 of 87 links found.).

Which links get checked

The checker reads <a> elements and their href attribute, the same kind of link Google says it can reliably crawl (Google: make your links crawlable). It then:

  1. Drops empty hrefs and in-page # links.
  2. Turns relative links into full URLs using the address of the page it ended up on after redirects, following the standard URL resolution rules, so ?page=2 on /blog/post becomes /blog/post?page=2 and ../about climbs one directory.
  3. Skips anything that isn't http or https (mailto:, tel:, javascript: and so on, in any letter case), drops the #fragment part, and removes duplicates, so ten links to the homepage are checked once.
  4. Takes the first 15 in source order. Navigation usually comes first in the HTML, so on a typical page the 15 are mostly menu links. To test links in an article body, run a page with little navigation or check the article's links in batches.

It doesn't look at <img src>, <link>, <script> or CSS URLs, and links added by JavaScript after the page loads aren't in the HTML it reads.

Reading the labels

Label Meaning What to do
OK (200) Link works, possibly after redirects Nothing, unless you want to update a redirected URL to its destination
BROKEN (404) / BROKEN (410) Page not found or gone Fix the URL, link to a replacement, or remove the link
BROKEN (403) / BROKEN (429) Refused or rate-limited Open it in a browser; often a bot block, not a dead link
BROKEN (500)–BROKEN (504) Server error at the target Recheck later; persistent 5xx means a broken page
BROKEN (unreachable): ... Could not resolve The domain has no DNS record Domain probably expired; remove or replace
BROKEN (unreachable): ... Timed out No answer within five seconds Recheck later; a slow target may still work
BROKEN (unreachable): ... Connection refused Nothing listening at that address Server down or wrong port
BROKEN (unreachable): ... Too many redirects (more than 10). Long chain or loop Run it through the redirect checker
NOT CHECKED (time limit reached) The run's time budget ran out first Run the page again, or check that link on its own
BROKEN (unreachable): ... private or reserved address Link points at an internal IP Intranet links can't be tested from outside

Google's crawling documentation describes what happens on its side: for a 404, a URL that was indexed is removed and a newly found one isn't processed, while repeated 5xx errors slow its crawling of the site (Google: HTTP status codes). Broken internal links waste crawl requests on pages that don't exist and leave readers at a dead end.

Limits of a single-page check

  • 15 links per run, checked one after another. Each link gets up to five seconds to answer, and the run spends at most about 20 seconds on link checks in total. Links it didn't reach in that time are listed as NOT CHECKED (time limit reached) rather than silently dropped.
  • Rate limit. The tool endpoint allows 60 runs a minute per visitor.
  • GET requests only. Each link is downloaded like a normal visit, so a server that blocks bots may answer 403 even though people can open the page.
  • IPv4 and IPv6. Hostnames are resolved over both, and a link is refused if any of its addresses is private or reserved.

Fixing what you find

Start with internal links, since those are entirely yours to fix. For a page you've moved, a server-side redirect from the old URL keeps old bookmarks and external links working; the redirect generator writes the .htaccess rule. Then update your own links to point at the new URL directly. Run the redirect checker on anything that looks odd to see each hop, and use open all URLs to open a list of suspect links in browser tabs for a manual look. For pages listed in your sitemap, the sitemap validator confirms the file itself still parses.

Last updated

Frequently asked questions

Why only the first 15 links?
Every link check is its own outbound request from our server, so an uncapped check could turn one click into hundreds of requests. Fifteen keeps a run reasonably quick and fair to other visitors sharing the same rate limit. Links are taken in the order they appear in the HTML, after duplicates are removed.
Does it crawl my whole site?
No. It reads one page, collects the links in its HTML, and checks up to 15 of them. It doesn't follow those links to find more pages. Run it on your most important pages one at a time.
Why is a working link reported as BROKEN (403)?
Some sites refuse requests that don't look like a normal browser, or block traffic from data centres, and answer with 403 or 429. The link may work fine for people. Open it yourself before removing it.
Are mailto and phone number links checked?
No. Only http and https links can be tested this way, so mailto, tel, sms, javascript and data links are skipped whatever their letter case (MAILTO counts too), along with in-page # links. They don't appear in the report at all.
Is a redirected link counted as broken?
No. Each link's redirects are followed (up to ten), and the link is OK if the page it ends on returns a 2xx or 3xx status. Use the redirect checker to see the chain behind a link.