Docs / Reference
Site audit checks
Every issue the crawler reports, its severity, what it means and how to fix it, and how the health score is worked out.
The site audit reports 59 kinds of issue. This list is generated from the crawler's own catalog, so it always matches what an audit can report. The code in each row is the issue type used by the REST API and the MCP tools.
How the health score is worked out
- Every page the crawler tried gets a penalty: 25 points per critical issue, 8 per warning and 1 per notice on that page, capped at 100. Pages blocked by
robots.txtare left out, since the crawler never fetched them. - The score is 100 minus the average penalty, rounded. A site where every page is clean scores 100; one where every page has four critical issues scores 0.
- If no page answered with a success status, the score is 0.
Issues that apply to the whole site, such as a missing sitemap or missing security headers, are reported once, on the start page or the first page of each origin. Checks that compare pages with each other (duplicates, broken internal links, orphan pages) are only as complete as the crawl; orphan pages are reported only when the crawl finished without hitting its page limit.
Critical (4)
Problems that stop pages being crawled, indexed or shown.
| Issue | What it means | How to fix it |
|---|---|---|
Page blocked the crawlerblocked-page | The server answered 401/403 or a bot challenge, so the page content could not be audited. | Allow the crawler user agent or IP in your firewall/WAF, or confirm the page is meant to be private. |
Server error (5xx)server-error | The page returned a 5xx status. Search engines drop URLs that keep failing. | Check server logs for the failing request and fix the application or infrastructure error. |
Missing titlemissing-title | The page has no <title> or it is empty. | Add a unique, descriptive title element. |
Broken internal linkbroken-internal-link | The page links to an internal URL that returns a 4xx or 5xx status. | Update or remove the link, or restore/redirect the target. |
Warnings (32)
Problems that hold pages back.
| Issue | What it means | How to fix it |
|---|---|---|
Broken page (4xx)broken-page | The URL returned a 4xx status such as 404 or 410. | Restore the page, redirect it to the closest equivalent, or remove references to it. |
Page was rate-limitedrate-limited-page | The server kept answering 429 Too Many Requests, so the page was not audited. | Re-run with a larger delay or lower concurrency, or raise the rate limit for the crawler. |
Crawl stopped by rate limitingcrawl-rate-limited | Too many consecutive 429 responses; the crawl gave up early and results are partial. | Re-run with a larger delay, or allowlist the crawler on the server. |
Page could not be fetchedfetch-failed | The request failed before a response arrived (timeout, DNS, connection, TLS, or a refused target). | Check that the URL resolves and responds within the timeout; fix DNS, TLS or server availability. |
Redirect chainredirect-chain | The URL goes through two or more redirects before reaching its destination. | Point the first URL straight at the final destination. |
Redirect loopredirect-loop | Following the redirects returns to a URL already visited, so the page never loads. | Fix the redirect rules so the chain ends at a page returning 200. |
Conflicting canonical signalscanonical-conflict | The HTML canonical and the Link header canonical name different URLs. | Send a single canonical URL, or make both sources agree. |
Multiple canonical tagsmultiple-canonical | The page has more than one rel="canonical" link element; search engines may ignore all of them. | Keep exactly one canonical link element in the head. |
Canonical points to a broken URLcanonical-to-broken | The canonical target returns a 4xx or 5xx status. | Point the canonical at a URL that returns 200. |
Canonical points to a redirectcanonical-to-redirect | The canonical target redirects instead of returning the page directly. | Point the canonical at the final destination URL. |
Canonical points to a non-indexable pagecanonical-to-non-indexable | The canonical target is noindex, blocked by robots.txt, or canonicalised to yet another URL. | Point the canonical at an indexable, self-canonical page. |
Missing meta descriptionmissing-meta-description | The page has no meta description, so search engines pick their own snippet. | Add a meta description summarising the page in 70-160 characters. |
Missing viewport meta tagmissing-viewport | Without a viewport meta tag the page is not rendered as mobile-friendly. | Add <meta name="viewport" content="width=device-width, initial-scale=1">. |
Missing H1missing-h1 | The page has no H1 heading with text. | Add one H1 that states the page topic. |
Multiple H1smultiple-h1 | The page has more than one H1 heading. | Keep a single H1 and demote the others to H2 or lower. |
Thin contentthin-content | The indexable page has very little visible text. | Add useful content, merge the page into a stronger one, or set it to noindex. |
Images without alt attributeimages-missing-alt | One or more images have no alt attribute. | Add descriptive alt text; use alt="" for decorative images. |
No outgoing linksno-outgoing-links | The indexable page has no links, making it a dead end for users and crawlers. | Add navigation or contextual links to related pages. |
Content needs JavaScript renderingjavascript-rendering-suspected | The HTML is an empty app shell, so content checks were skipped for this page. | Server-render or pre-render the page, or run the audit with JavaScript rendering enabled. |
Mixed contentmixed-content | The HTTPS page loads resources over plain HTTP. | Load every resource over HTTPS. |
Duplicate titleduplicate-title | Several indexable pages share the same title. | Give each page a unique title, or canonicalise true duplicates. |
Duplicate meta descriptionduplicate-meta-description | Several indexable pages share the same meta description. | Write a unique description for each page. |
Duplicate contentduplicate-content | Several indexable pages have identical visible text. | Consolidate the pages with a redirect or canonical, or differentiate their content. |
Broken external linkbroken-external-link | The page links to an external URL that returns a 4xx status or does not resolve. | Update or remove the link. |
Orphan pageorphan-page | The page is in the sitemap but no crawled page links to it. | Link to the page from relevant pages, or remove it from the sitemap if it is obsolete. |
Non-indexable URL in sitemapnon-indexable-in-sitemap | The sitemap lists a URL that redirects, errors, is noindex, canonicalised elsewhere, or blocked by robots.txt. | List only indexable, canonical 200 URLs in the sitemap. |
Invalid hreflang valuehreflang-invalid-code | An hreflang value is not a valid language or language-region code. | Use ISO 639-1 language codes with optional ISO 3166-1 region, or x-default. |
Hreflang without return linkhreflang-missing-return-link | The page references an alternate that does not reference it back, so the annotation is ignored. | Add a reciprocal hreflang annotation on the alternate page. |
Hreflang points to a non-200 URLhreflang-broken-target | An hreflang alternate redirects or returns an error. | Point hreflang annotations at final URLs that return 200. |
Invalid JSON-LDstructured-data-parse-error | A JSON-LD block is not valid JSON and is ignored by search engines. | Fix the JSON syntax; validate with a JSON linter or the Rich Results Test. |
Structured data missing required propertiesstructured-data-invalid | A JSON-LD item lacks @context or a property its type requires. | Add the missing properties listed in the issue detail. |
Site served over HTTPinsecure-http | Pages on this origin are served without HTTPS. Reported once per origin. | Serve the site over HTTPS and redirect HTTP to it. |
Notices (23)
Smaller improvements and things worth knowing.
| Issue | What it means | How to fix it |
|---|---|---|
Blocked by robots.txtblocked-by-robots | robots.txt disallows this URL for the crawler, so it was not fetched. | Remove the Disallow rule if the page should be crawled and indexed. |
Slow server responseslow-response | Time to response headers exceeded the slow-response threshold. | Add caching, reduce server work per request, or move closer to users with a CDN. |
Large HTML documentlarge-html | The HTML is unusually large or was cut at the body size limit. | Reduce inline scripts, styles and data; paginate or lazy-load long content. |
Internal links point to redirectsinternal-link-to-redirect | The page links to internal URLs that redirect elsewhere. | Update the links to the final destination URLs. |
Page is noindexnoindex-page | A robots meta tag or X-Robots-Tag header tells search engines not to index the page. | Remove the noindex directive if the page should appear in search results. |
Canonical points to another URLcanonicalized-page | The canonical URL differs from the page URL, so this page is not the indexed version. | Confirm the canonical target is the intended version; otherwise make the canonical self-referencing. |
Title too longtitle-too-long | The title is longer than the recommended maximum and will be truncated in results. | Shorten the title to about 60 characters with the key phrase first. |
Title too shorttitle-too-short | The title is too short to describe the page. | Expand the title to describe the page topic. |
Meta description too longmeta-description-too-long | The meta description exceeds the recommended maximum and will be truncated. | Trim the description to about 160 characters. |
Meta description too shortmeta-description-too-short | The meta description is too short to be a useful snippet. | Expand the description to at least 70 characters. |
Missing lang attributemissing-lang | The <html> element has no lang attribute. | Set lang on the html element, for example <html lang="en">. |
Incomplete Open Graph tagsmissing-open-graph | og:title or og:image is missing, so shared links get a poor preview. | Add og:title, og:description and og:image meta tags. |
Heading levels skippedheading-order-skip | A heading jumps more than one level down (for example H2 to H4). | Use heading levels in order without skipping. |
Page is deep in the sitedeep-page | The page is many clicks away from the start URL. | Link to it from higher-level pages to reduce click depth. |
Indexable page missing from sitemappage-not-in-sitemap | The page is indexable but not listed in any discovered sitemap. | Add the URL to the XML sitemap. |
No XML sitemap foundsitemap-missing | No sitemap was found in robots.txt or at /sitemap.xml. | Publish an XML sitemap and reference it from robots.txt. |
Hreflang without self-referencehreflang-missing-self-reference | The page lists alternates but not itself. | Add an hreflang annotation for the page itself. |
Structured data without @typestructured-data-missing-type | A JSON-LD item has no @type, so it cannot be interpreted. | Add an @type from schema.org to each item. |
Missing Strict-Transport-Security headermissing-hsts | The HTTPS origin does not send HSTS. Reported once per origin. | Send Strict-Transport-Security: max-age=31536000; includeSubDomains. |
Missing Content-Security-Policy headermissing-content-security-policy | No CSP header is sent. Reported once per origin. | Add a Content-Security-Policy header, starting in report-only mode. |
Missing X-Content-Type-Options headermissing-x-content-type-options | The nosniff header is not sent. Reported once per origin. | Send X-Content-Type-Options: nosniff. |
No clickjacking protectionmissing-x-frame-options | Neither X-Frame-Options nor a CSP frame-ancestors directive is sent. Reported once per origin. | Send X-Frame-Options: SAMEORIGIN or Content-Security-Policy: frame-ancestors 'self'. |
Missing Referrer-Policy headermissing-referrer-policy | No Referrer-Policy header is sent. Reported once per origin. | Send Referrer-Policy: strict-origin-when-cross-origin. |