HandyBench

Broken Link Checker

Find dead links on any page before your visitors — or Google — do.

This check runs through this site's own server, so it works for any public URL — no CORS or browser restrictions. To stay within request limits, each run checks up to 24 unique links found on the page — if the page has more, the result below is marked truncated. Redirects are followed (up to 5 hops, each one safety-checked) and count toward the limit; any link the limit cuts off is marked SKIP.

How to use the Broken Link Checker

  1. 1 Enter the page URL and click Check links.
  2. 2 Wait while each link found on the page is checked (up to 24 per run).
  3. 3 Review the broken links, listed first, along with their status codes or errors.

How a scan runs

You give the tool one page. The server downloads it (up to the first 1 MB of HTML), collects the href of every <a> element, and tests each unique destination. Links are made absolute against the page's final URL, so relative paths work, and the #fragment is removed so two links to the same page with different anchors count once.

  • Skipped: mailto:, tel:, javascript:, bare # anchors, empty hrefs, and any scheme that is not http or https.
  • Not collected: images, scripts and stylesheets. Only anchor links are checked.
  • Order: the first 24 unique links in document order are checked, with up to 6 requests in flight at once and an 8-second timeout each. The page itself has a 10-second timeout and may redirect up to 10 times.

HEAD first, GET only when needed

Each link is first requested with HEAD, which asks for headers and no body. If the server answers 405 (Method Not Allowed) or 501 (Not Implemented), the same URL is retried with GET. Redirects are followed one hop at a time, up to 10, and each hop is checked against the server's safety rules before it is requested. A link that redirects to a working page shows its final status, not the 301, while a redirect into a private or internal address is reported as an error and not followed.

Why the cap is exactly 24

The backend runs on a serverless platform that allows about 50 outbound requests per invocation on its free tier. One request fetches your page, and the worst case for each link is two requests (HEAD, then GET), so 1 + 24 × 2 = 49 with no redirects. Because every redirect hop is also a request, the page fetch and all link checks share one pool of 49 requests. If a page has many redirecting or HEAD-refusing links the pool can run out; the remaining links are then marked SKIP with "not checked (request limit)" and are not counted as broken. Re-run to try again. The result always shows links found, links checked and a truncated notice when the page has more.

Reading the results

ShownCounted asTypical cause
200 to 399HealthyPage loads, or redirects to one that does
404 or 410BrokenPage deleted or URL mistyped
403 or 429BrokenSite blocks bots or rate-limits; often fine for people
500 to 599BrokenServer error, possibly temporary
ERR with "Timed out" or "Request failed"BrokenDNS failure, refused connection, TLS error or slow server
ERR with "Too many redirects" or "Redirect blocked"BrokenRedirect loop or chain longer than 10 hops, or a redirect to a disallowed address
SKIP "not checked (request limit)"Not countedThe run used up its request allowance before reaching this link

Broken links are sorted to the top. Any link whose host is blocked by the server's safety rules, such as a private address or non-standard port, appears as ERR with the reason.

Mistakes to avoid

  • Treating every 403 or 429 as dead. Large sites often refuse automated requests, so open the link in a browser before editing it.
  • Assuming a clean result covers the page. Links beyond the first 24 are not tested, so on a long page with a navigation menu the menu can use up the whole budget before the article body is reached.
  • Ignoring redirects. A 301 is counted healthy here, but a long-lived link to a redirecting URL is worth updating to the final address. The HTTP headers checker shows the full chain.

For a fix-it workflow once you have the list, see the guide to finding and fixing broken links.

Examples

  • ▸ A blog post with 40 unique links shows "Links found 40, Links checked 24" and a truncated notice, because only the first 24 in page order are tested.
  • ▸ A link to a deleted page appears at the top of the table with a red 404 badge, while a link whose server timed out shows ERR and "Timed out".
  • ▸ A mailto: link, a tel: link and a #section anchor are skipped entirely and do not count toward the 24.

Frequently asked questions

Why is there a cap of 24 links per run?

It keeps the check fast and reliable within the backend's request budget. The result tells you the total links found versus how many were checked, and flags the result as truncated if the page has more — re-run against a more specific section of the page for full coverage.

What counts as a "broken" link here?

Any link that returns a 4xx or 5xx HTTP status, or that could not be reached at all (timeout, DNS failure, connection error). 2xx and 3xx responses are treated as healthy.

Does this check links across my whole site?

No, it checks the links found on the one page you enter. To audit a whole site, run it page by page, or start from an XML sitemap page and check each URL individually.

A link shows as broken here but works fine in my browser — why?

Some servers block requests without a browser-like user agent, require cookies or login, or vary responses by geography. The check uses a standard HEAD/GET request, so results can occasionally differ from a logged-in browser session.

Does the checker test images, scripts and stylesheets?

No. It only collects the href of anchor (a) links. Links to mailto:, tel:, javascript: and in-page # anchors are skipped, and duplicate links to the same URL (ignoring the #fragment) are checked once.

Why use HEAD requests, and when does it fall back to GET?

A HEAD request returns only the status and headers, so it is faster and lighter on the target site. If a server answers HEAD with 405 or 501, the checker repeats the request as GET. Redirects are followed (up to 10 hops, each one safety-checked), so a link that redirects to a working page is reported as healthy.

What does SKIP / "not checked (request limit)" mean?

Every request the checker makes, including each redirect hop, counts against a fixed allowance per run. If a page has many redirecting links the allowance can run out before the last links are reached; those are marked SKIP and are not counted as broken. Re-run the check, or test the skipped URLs individually.

Related guides