Your link checker says a link is broken, but it works in your browser
This is the most common complaint about WordPress link checkers. Dozens of links to Amazon, LinkedIn, Instagram or sites behind Cloudflare show up as broken, you click them and they open fine. The links are usually not broken. The other site refused to answer an automated request, and the checker reported the refusal as a failure.
The short answer
| What the checker got | Usually means | Is the link broken? |
|---|---|---|
| 404 Not Found, 410 Gone | The page does not exist | Yes, almost always |
| 403 Forbidden | Bot protection, firewall, or a geo/IP block on your server's address | Usually no |
| 401 Unauthorized | Login required | No (but readers may hit a login wall) |
| 429 Too Many Requests | Rate limit: too many checks too fast | No |
| 999 (LinkedIn) | Not a standard HTTP code; LinkedIn's answer to automated requests | No |
| 400 from Facebook | Facebook rejecting a non-browser request | Usually no |
| 503 from Amazon with a captcha page | Amazon's bot check | No |
| 503 "Just a moment…" or a 403 challenge page | Cloudflare (or similar) browser challenge | No |
| Timeout, DNS failure, 500/502/504 | Site down or slow right now | Maybe. Check again later |
Why this happens
A link checker is a bot by definition. Large sites and anything behind a web application firewall (Cloudflare, Akamai, Sucuri, Imperva, AWS WAF, DataDome, PerimeterX) score each request and challenge or block those that do not look like a real browser: no JavaScript, no cookies, a data-centre IP address, many requests in a short time. Your web host's IP address is exactly that. The firewall answers with 403, 429 or a challenge page. It never says whether the page you linked to exists.
Some sites go further and answer bots with codes that look like server errors (Amazon's 503) or with codes that do not exist (LinkedIn's 999). A checker that treats every non-2xx answer as "broken" will flag all of them.
It also changes over time, which is why reports that were clean for years suddenly fill with one domain: the site in question tightened its bot rules, not your links.
How to check a "broken" link yourself
- Open it in a private browser window (logged out). If the page loads with the content you meant to link, the link is fine.
- If you want to see what the checker sees, run
curl -sI https://the-linkfrom a terminal. A403with headers likeserver: cloudflareorcf-mitigated: challengeconfirms bot protection. - If curl gets
404or410and the browser shows a "page not found" or "product no longer available" page, it really is broken. - For a timeout or 5xx, try again in a few hours. Only treat it as broken if it keeps failing over a day or so.
The opposite problem: "OK" links that are not OK
A 200 OK is not proof either. Social networks may answer 200 with a login page. Online stores often keep a product page up after the product is gone and only show "Currently unavailable" or "This item is no longer available". A status-code checker reports those as fine. If you link to products or social posts, open a sample of them by hand once in a while, or use a tool that reads the page content.
Fixing the noise in your link checker
- Exclude or ignore domains that always block bots (LinkedIn, Instagram, Facebook, X). Most checkers have an exclusion list. The trade-off: real breakage on those domains will not be reported either.
- Mark individual links as fine after you have opened them, rather than ignoring the whole domain.
- Slow down checks (fewer requests at a time, longer pause per domain). This reduces 429s.
- Allow-list your own site: if links to your own pages show 403, your firewall or security plugin is blocking your server's checks of itself. Allow your server's IP in that firewall.
- Use a checker that separates "blocked" from "broken". For example, WPMU DEV documents that its Broken Link Checker cloud engine skips a list of domains that block bots (including LinkedIn, Instagram, Facebook, X and play.google.com). Several newer local checkers show such links in a separate unverified or warning state.
How LinkTender handles it
LinkTender was built around this problem. It reports a link as Broken only for 404/410 (re-confirmed over 24 hours) or for timeouts, server errors and DNS or connection failures that are still failing after retries at 2, 10 and 24 hours. 401, 403, 407, 429, 999, other 4xx answers such as Facebook's 400, and challenge pages from Cloudflare, Akamai, Sucuri, Imperva, DataDome, PerimeterX, AWS WAF and Amazon's captcha are shown as Unverified with a plain-language reason, and are never counted as broken. You open them, and click Mark as fine or Ignore domain. With the Pro add-on it also reads store pages to flag products that are gone or unavailable even when the page returns 200.
Want this done for you, on your own server?
LinkTender is a free WordPress plugin that does all of the above in the background: it finds links in posts, blocks, Elementor, shortcode builders such as Divi and WPBakery, custom fields, comments, menus and widgets (comments and shortcode builders from version 1.1), checks them from your server, marks bot-blocked links Unverified instead of broken, and lets you fix a URL everywhere it appears. No account, no link quota, and nothing is checked until you click Start checking links. Get it free on WordPress.org or read the docs.
Last updated: 13 October 2026