Why does a link audit report errors that a normal browser never shows?
The page opens fine for you, but the audit says 403, 429, or timeout. Neither is lying. How bot protection, caching, and request headers create the gap, and how to tell real failures from unverified ones.

A crawler's request is not your browser's request
When you open a page, your browser sends a familiar user agent, a full set of accept headers, whatever cookies the site has set, a referer, and it executes JavaScript. It comes from a residential IP address with a normal request rhythm. A crawler sends a different user agent, few or no cookies, often no JavaScript execution, usually from a datacenter IP, at a rate of many requests per minute. Web application firewalls, CDNs, and rate limiters make decisions on exactly these signals. Some respond to unfamiliar traffic with a 403, some with a 429 after a burst, and some serve a 200 challenge page that contains no real content. Related: How a Site Crawl Actually Works
Browsers also quietly recover from problems that a crawler reports faithfully. A browser follows redirects without comment, retries a failed connection, serves a cached copy, and renders a page even when several requests behind it failed. A crawler records what the server returned to that specific request at that specific moment. The two views are both accurate; they are simply answering different questions, and the audit's job is to make the difference legible.
Keep reading: When to Run a Full Link Audit, How a Site Crawl Actually Works, Reading a Redirect Chain Map. See how DeadLinkr helps you on demand link and redirect audits for seo.
Reading each error class honestly
Each class has a typical cause and an appropriate reaction. A 403 usually means a bot or geographic block, though it can also be a page that is genuinely restricted. A 429 means the crawl was faster than that host allows. A 5xx is often temporary overload and deserves a retry after a pause. A timeout may be a slow server or an audit timeout that is too short. A 401 is authentication, which typically means a staging site or a member area. A DNS failure suggests the domain is gone or a resolver hiccup. A connection reset usually points at a firewall dropping the request. Related: When to Run a Full Link Audit
For each row the question is whether the destination is actually broken for visitors or whether the crawler simply could not verify it. Those are different states and should be labeled differently. A report that lumps a rate-limited but healthy page in with a genuine not found trains the team to distrust the whole list. The audit should show the raw status and the response headers, and make it easy to recheck a subset with different settings before anyone edits a link. Related: A Pre Launch Link Checklist
Confirming which errors are real
Recheck the failed URLs with a slower rate, a longer timeout, a browser-like user agent, and a short delay between requests; if practical, recheck from a different network as well. Open a sample in a private browsing window with no cookies. If a URL loads in the private window but fails for the crawler, the issue is bot handling, not a broken link. If it fails in the private window too, it is real. For 200 responses that still look wrong, compare the page title and the response size with what you expect; a tiny page titled with a verification or access phrase is a challenge page, not the content.
For your own site, the fix is permanent: ask your host or check the firewall logs, then allow the audit tool's user agent or IP range through. That removes an entire category of noise from every future run. For other people's sites, do not try to evade their protections. Mark those destinations as unverified, check the important ones by hand, and accept that some external links will remain in an unknown state until a human looks.
Configuring crawls to minimize noise
Most false errors are avoidable with settings. Use per-host concurrency limits and a polite request rate. Set timeouts generous enough for slow servers, typically somewhere between ten and thirty seconds. Retry 5xx, 429, and timeout responses automatically with a backoff. Send a descriptive user agent that includes a contact address, an accept-language header, and sensible accept headers. Handle consent cookies where the site sets one, and respect robots directives. For your own domains, keep the allow rule in place and document it so a hosting change does not silently drop it.
Keep a list of external hosts known to block crawlers and exclude them from the broken totals, so the headline number stays trustworthy for the people reading the report. The report itself should carry three states rather than two: broken, unverified, and ok. That single distinction prevents editors from wasting an afternoon rewriting links that worked all along, and it keeps the audit's credibility intact the next time it reports a failure that really is one. Related: How Broken Links Waste Crawl Budget
- Crawlers and browsers send different signals, and firewalls, rate limiters, and challenge pages respond to those signals.
- A 403, 429, timeout, or challenge page often means the crawler could not verify the link, not that the link is broken.
- Recheck failures slowly with browser-like headers and in a private browser window before editing anything.
- Allow your audit tool through your own firewall, and report three states: broken, unverified, and ok.
A deep link audit whenever you need one
On demand link and redirect audits for SEO. DeadLinkr is built to help you put this into practice.
Run an auditMore from the DeadLinkr blog

When to Run a Full Link Audit

How a Site Crawl Actually Works

Reading a Redirect Chain Map
Get the DeadLinkr playbook
Practical guides on link audits, straight to your inbox as we publish them. No spam, unsubscribe any time.
