Websites

Broken link checker

Check the links on a page: dead pages, redirects worth updating, missing #anchors, external domains that no longer exist, insecure resources and empty links. Export the list as CSV.

By using these tools you accept the Terms and the Privacy page.

One page at a time. Plain domains are checked over https://.

How the broken link checker works

The broken link checker reads one page and tests the links in its HTML. It’s for site owners, editors and SEO work: finding 404s before visitors do, redirects worth updating, anchors that jump nowhere and resources that break HTTPS. You can export the results as CSV for a spreadsheet or a ticket.

How same-site links are tested

The page is read up to 1 MB, after up to 5 redirects; it must arrive within 15 seconds. Links are resolved against the page’s <base href> when it has one, and a link counts as same-site when its host matches the page’s, ignoring www., on the same port. Up to 20 same-site pages, the ones linked most often, are requested, at most 5 at a time while external domains are being looked up and 6 after, with up to 8 seconds each. The whole check stops after 25 seconds or 26 link requests: links not reached are listed as not checked, and requests still waiting as couldn’t check. Up to 12 external domains, also the ones linked most often, are looked up in DNS.

Each link gets a HEAD request first, or a GET when its #anchors need checking. Some servers mishandle HEAD, so common error answers, redirects back to the same address and redirects with nowhere to go are confirmed with a GET before they’re reported. Up to 3 redirects in a row are followed while they stay on the site; a redirect to another site is reported, not followed. Cookies set by a link’s own redirects are sent back, as a browser would. Private and reserved addresses, links with a username or password, links over 2,048 characters and zerobounce.ai’s own API addresses are never requested.

Anchors, canonical links and insecure resources

Every #fragment is matched against the id attributes, and <a name> anchors, of its target page. Links to #top and text fragments (#:~:text=) aren’t reported as missing. Other pages on the site are read up to 512 KB; when a page is cut short, an anchor that isn’t found is left unverified instead of reported missing.

If the page’s canonical link points to another address on the same site, that address is requested like any other link, and a canonical that redirects or fails is reported, because search engines may ignore it.

On an https:// page, resources loaded over plain http:// fall into two groups. Scripts, frames and stylesheets are marked “Blocked”, because browsers block them on an https:// page, so whatever they do is broken; forms that post to http:// are marked the same way. Images and media are marked “Not secure”, because browsers upgrade or block them and mark the page as not fully secure.

Reading the verdict

The verdict is red when a link is broken, an external link points to a private or loopback address, an external domain is dead, or the page loads scripts or frames over plain HTTP. It’s amber for redirects to update, missing anchors, refused links, links that couldn’t be checked, insecure images, and javascript:, empty or malformed links. Green means none of those turned up. When not every same-site link was requested, the headline says the result covers only the ones checked.

Exporting and next steps

The CSV export has one row per same-site link, external domain, missing anchor and insecure resource, with columns for scope, URL, result, HTTP status, where it goes, times linked and detail. Cells that start like a spreadsheet formula (=, +, -, @, a tab or a carriage return) get a leading apostrophe, so a spreadsheet won’t run them as formulas, and lines end as RFC 4180 specifies.

An external domain marked as working only means its name resolves. To follow one of those links to its final page, use the redirect trace.

Updated · Maintained by Liviu Tanase

Questions

What does the checker look at?

Every link in the page’s HTML. Links on the same site are requested (up to 20 unique pages), redirects are followed while they stay on the site, and #anchors are matched against the ids on the target page. External links are checked through DNS only. The page itself is also scanned for http:// resources on an https:// page, javascript: and empty links, duplicates, rel attributes and mailto: and tel: links.

Why aren’t external links opened?

Requesting other people’s sites from a shared server would let anyone use this tool to send traffic at a site of their choice. So external links are never fetched: their domains are looked up in DNS, and a domain that doesn’t exist, or has no web address, is reported as dead. Anything beyond that, such as a 404 on another site, isn’t checked.

What’s the difference between broken, refused and couldn’t check?

Broken means the server said the page isn’t there (404, 410, other 4xx and 5xx errors) or the domain doesn’t exist. Refused means 401, 403 or 429: the page may work in a browser but turned this checker away. Couldn’t check means a timeout or connection failure, so nothing is known either way.

Why should I update links that redirect?

Each redirect costs visitors a round trip, and crawlers follow only a limited number of hops in a chain. Pointing the link straight at the final URL is faster and future-proof. Temporary (302 and 307) redirects to sign-in pages are often intentional.

Does it crawl my whole site?

No, it checks one page at a time, and up to 20 unique same-site links on it. JavaScript-rendered links aren’t in the HTML the checker reads, so a single-page app may show few or no links.

Is anything stored?

Not by zerobounce.ai: results are never cached or saved, so every check is fresh. Cloudflare’s request logs record the request, including the address, as the privacy page explains. Each network can run 10 checks a minute.

Why is a link marked “not checked”?

One check requests at most 20 same-site pages (26 requests in all) and stops after 25 seconds; links past either limit are listed as not checked. Links to private or reserved addresses, links with a username or password in them, and zerobounce.ai’s own API addresses are never requested at all. Check the linked page on its own, or follow one link with the redirect trace.

How do I check whether an external link still works?

This checker only confirms that an external link’s domain exists. To follow one external link to its final page, with every redirect and status code, paste it into the redirect trace. The tech stack detector shows what that site runs.