> ## Documentation Index
> Fetch the complete documentation index at: https://docs.37audits.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Lighthouse SEO Auditor

> Runs the Google Lighthouse SEO category on the page and scores it against configurable thresholds

<Info>
  **SEO Auditor** — runs the [Google Lighthouse](https://github.com/GoogleChrome/lighthouse) SEO category against the monitored page and reports its score: below 90 is a warning and below 50 is a failure, both thresholds set per monitored URL. Every audit Lighthouse lists under the score is a check of its own, with Lighthouse's own description and the offending elements.
</Info>

<CardGroup cols={2}>
  <Card title="Same score as PageSpeed" icon="magnifying-glass-chart">
    The score is the one Lighthouse computes, so it matches Chrome DevTools and PageSpeed Insights.
  </Card>

  <Card title="Fast" icon="bolt">
    No performance trace is recorded, so the run finishes seconds after the page loads.
  </Card>
</CardGroup>

This auditor starts a headless Chromium, lets Lighthouse load the page with the desktop preset (or the mobile profile, by preference) and run only its SEO audits, and reads the category score from the report. It tells you whether search engines can crawl, index and understand the page: the SEO score. The check names the lowest-scoring audits of the category, so the report says what to fix first. Lighthouse's SEO audits cover crawlability (robots.txt, meta robots, HTTP status), the title and meta description, canonical and hreflang links, descriptive link text, legible font sizes, tap target sizes and structured data validity.

The Lighthouse SEO auditor is one of four auditors that share one Lighthouse image; the others are Lighthouse Performance, Lighthouse Accessibility, Lighthouse Best Practices and Lighthouse SEO. Enable the ones a URL needs: each runs its own Lighthouse pass.

## How it works

1. **Thresholds** — reads `formFactor`, `warningBelowScore` and `failBelowScore`. When `failBelowScore` is not lower than `warningBelowScore` the audit fails with a single check (`401`) and Lighthouse does not run.
2. **Lighthouse run** — runs the Lighthouse CLI (version pinned in the image, reported in the `100` check) with the `seo` category only, the `desktop` preset or the `mobile` form factor, and the 37AuditsBot user agent. The run has a time budget derived from the audit's remaining time; a page that does not finish loading inside it is an `ERROR` (`500`).
3. **Blocked or unloadable page** — an HTTP 403, 429 or Cloudflare challenge on the document is the platform's blocked response (`590`). Any other Lighthouse runtime error (`NO_FCP`, `PAGE_HUNG`, `DNS_FAILURE`, `ERRORED_DOCUMENT_REQUEST`, …) is an `ERROR` (`500`) that names the error.
4. **Score** — the SEO score (0–100) is compared with the thresholds: below `failBelowScore` is `FAIL` (`400`), from `failBelowScore` up to but excluding `warningBelowScore` is `WARNING` (`300`). A category Lighthouse could not score is an `ERROR` (`501`). At or above `warningBelowScore` the audit succeeds (`200`).
5. **Audits** — every audit Lighthouse lists under the SEO score becomes a check: a scored audit below Lighthouse's pass mark (0.9) is a `FAIL` whose code is 400 plus the audit's fixed number in this auditor's catalog (10 audits, `410`–`420`); an audit Lighthouse reports without a score or leaves to a manual check is an `INFORMATION` with 100 plus that number. An audit a newer Lighthouse adds gets `490` or `190` until the catalog is updated. Hidden Lighthouse audits and audits that do not apply to the page are not reported. These checks keep their own status but never change the result: the score alone decides it.
6. **Report pin** — every result carries an `INFORMATION` check (`100`) with the Lighthouse and Chrome versions, the device profile, the run duration and Lighthouse's benchmark index, because scores are only comparable between runs of the same Lighthouse version.

The Lighthouse navigation is **not** signed with Web Bot Auth: Lighthouse opens its own browser target and its only header hook adds headers to every request of the page, which breaks cross-origin fetches. Allowlist the 37AuditsBot user agent if the site challenges unsigned bots. With Basic auth the `Authorization` header is sent on every request the page makes, third-party origins included, so prefer allowlisting over credentials for a staging site that loads third-party scripts.

## Preferences

| Key | Type | Default | Description |
| - | - | - | - |
| `formFactor` | string | `desktop` | `desktop` (Lighthouse desktop preset: no CPU slowdown, fast network) or `mobile` (Moto G Power emulation, simulated 4G and 4x CPU slowdown, the PageSpeed Insights default). Any other value falls back to `desktop`. |
| `warningBelowScore` | integer (1–100) | `90` | A SEO score below this value produces a `WARNING` (`300`). |
| `failBelowScore` | integer (0–99) | `50` | A SEO score below this value produces a `FAIL` (`400`). Must be lower than `warningBelowScore`. |

An invalid value (missing, fractional, outside 0–100) makes the auditor fall back to that preference's default and log a warning. A fail threshold equal to or above the warning threshold is not an invalid value: it makes the audit fail (`401`) until the thresholds are fixed.

## What it audits

Every row maps to one `checkRule*` method and one `CheckCode`.

| CheckCode | Status | When it fires | Recommendation | Why it matters |
| - | - | - | - | - |
| <a id="37A-LighthouseSeoAuditor-100" />`37A-LighthouseSeoAuditor-100` | `INFORMATION` | Always. Records the Lighthouse and Chrome versions, the device profile, the run duration and the benchmark index: `Lighthouse 12.8.2 on Chrome 138.0.7204.0 audited the page as desktop in 18 s (benchmark index 2186).` | — (recommendation is `null`; nothing for the site to change) | — |
| <a id="37A-LighthouseSeoAuditor-120" />`37A-LighthouseSeoAuditor-120` | `INFORMATION` | Lighthouse leaves audit `structured-data` to a manual check: Structured data is valid. Message: `Check manually: Structured data is valid (Lighthouse SEO audit structured-data; Lighthouse cannot automate it).` | Run the Structured Data Testing Tool ([https://search.google.com/structured-data/testing-tool/](https://search.google.com/structured-data/testing-tool/)) and the Structured Data Linter ([http://linter.structured-data.org/](http://linter.structured-data.org/)) to validate structured data. Learn more about Structured Data ([https://developer.chrome.com/docs/lighthouse/seo/structured-data/](https://developer.chrome.com/docs/lighthouse/seo/structured-data/)). | — |
| <a id="37A-LighthouseSeoAuditor-190" />`37A-LighthouseSeoAuditor-190` | `INFORMATION` | An audit this catalog does not list (added by a newer Lighthouse) is reported without a score or left to a manual check. Message as above, with the audit's own title and id; `inCatalog` is `false` in the data. | Lighthouse's description of the audit, then the first items it found. | — |
| <a id="37A-LighthouseSeoAuditor-501" />`37A-LighthouseSeoAuditor-501` | `ERROR` | Lighthouse ran but gave the SEO category no score (`score: null`). | Re-run the audit; if the SEO score stays empty, check the page for errors during load in Lighthouse's report. | — |
| <a id="37A-LighthouseSeoAuditor-400" />`37A-LighthouseSeoAuditor-400` | `FAIL` | The SEO score is below `failBelowScore`. Message: `Lighthouse SEO score is 42/100 (desktop); the fail threshold is 50.` | Raise the SEO score (`{score}`) by fixing its lowest-scoring audits first: `{audit title} ({display value})`; … | Pages search engines cannot crawl, index or understand get less organic traffic, so fewer people find the site without paid campaigns. |
| <a id="37A-LighthouseSeoAuditor-410" />`37A-LighthouseSeoAuditor-410` | `FAIL` | Lighthouse audit `is-crawlable` scores below 0.9: Page is blocked from indexing. Message: `Page is blocked from indexing: {display value or item count} (Lighthouse SEO audit is-crawlable, desktop).` | Search engines are unable to include your pages in search results if they don't have permission to crawl them. Learn more about crawler directives ([https://developer.chrome.com/docs/lighthouse/seo/is-crawlable/](https://developer.chrome.com/docs/lighthouse/seo/is-crawlable/)). Found: `{up to three offending items}`. | Search engines are unable to include your pages in search results if they don't have permission to crawl them. |
| <a id="37A-LighthouseSeoAuditor-411" />`37A-LighthouseSeoAuditor-411` | `FAIL` | Lighthouse audit `document-title` scores below 0.9: Document doesn't have a `<title>` element. Message: `Document doesn't have a <title> element: {display value or item count} (Lighthouse SEO audit document-title, desktop).` | The title gives screen reader users an overview of the page, and search engine users rely on it heavily to determine if a page is relevant to their search. Learn more about document titles ([https://dequeuniversity.com/rules/axe/4.10/document-title](https://dequeuniversity.com/rules/axe/4.10/document-title)). Found: `{up to three offending items}`. | The title gives screen reader users an overview of the page, and search engine users rely on it heavily to determine if a page is relevant to their search. |
| <a id="37A-LighthouseSeoAuditor-412" />`37A-LighthouseSeoAuditor-412` | `FAIL` | Lighthouse audit `meta-description` scores below 0.9: Document does not have a meta description. Message: `Document does not have a meta description: {display value or item count} (Lighthouse SEO audit meta-description, desktop).` | Meta descriptions may be included in search results to concisely summarize page content. Learn more about the meta description ([https://developer.chrome.com/docs/lighthouse/seo/meta-description/](https://developer.chrome.com/docs/lighthouse/seo/meta-description/)). Found: `{up to three offending items}`. | Meta descriptions may be included in search results to concisely summarize page content. |
| <a id="37A-LighthouseSeoAuditor-413" />`37A-LighthouseSeoAuditor-413` | `FAIL` | Lighthouse audit `http-status-code` scores below 0.9: Page has unsuccessful HTTP status code. Message: `Page has unsuccessful HTTP status code: {display value or item count} (Lighthouse SEO audit http-status-code, desktop).` | Pages with unsuccessful HTTP status codes may not be indexed properly. Learn more about HTTP status codes ([https://developer.chrome.com/docs/lighthouse/seo/http-status-code/](https://developer.chrome.com/docs/lighthouse/seo/http-status-code/)). Found: `{up to three offending items}`. | Pages with unsuccessful HTTP status codes may not be indexed properly. |
| <a id="37A-LighthouseSeoAuditor-414" />`37A-LighthouseSeoAuditor-414` | `FAIL` | Lighthouse audit `link-text` scores below 0.9: Links do not have descriptive text. Message: `Links do not have descriptive text: {display value or item count} (Lighthouse SEO audit link-text, desktop).` | Descriptive link text helps search engines understand your content. Learn how to make links more accessible ([https://developer.chrome.com/docs/lighthouse/seo/link-text/](https://developer.chrome.com/docs/lighthouse/seo/link-text/)). Found: `{up to three offending items}`. | Descriptive link text helps search engines understand your content. |
| <a id="37A-LighthouseSeoAuditor-415" />`37A-LighthouseSeoAuditor-415` | `FAIL` | Lighthouse audit `crawlable-anchors` scores below 0.9: Links are not crawlable. Message: `Links are not crawlable: {display value or item count} (Lighthouse SEO audit crawlable-anchors, desktop).` | Search engines may use `href` attributes on links to crawl websites. Ensure that the `href` attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. Learn how to make links crawlable ([https://support.google.com/webmasters/answer/9112205](https://support.google.com/webmasters/answer/9112205)) Found: `{up to three offending items}`. | Search engines may use href attributes on links to crawl websites. Ensure that the href attribute of anchor elements links to an appropriate destination, so more pages of the site can be discovered. |
| <a id="37A-LighthouseSeoAuditor-416" />`37A-LighthouseSeoAuditor-416` | `FAIL` | Lighthouse audit `robots-txt` scores below 0.9: robots.txt is not valid. Message: `robots.txt is not valid: {display value or item count} (Lighthouse SEO audit robots-txt, desktop).` | If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. Learn more about robots.txt ([https://developer.chrome.com/docs/lighthouse/seo/invalid-robots-txt/](https://developer.chrome.com/docs/lighthouse/seo/invalid-robots-txt/)). Found: `{up to three offending items}`. | If your robots.txt file is malformed, crawlers may not be able to understand how you want your website to be crawled or indexed. |
| <a id="37A-LighthouseSeoAuditor-417" />`37A-LighthouseSeoAuditor-417` | `FAIL` | Lighthouse audit `image-alt` scores below 0.9: Image elements do not have `[alt]` attributes. Message: `Image elements do not have [alt] attributes: {display value or item count} (Lighthouse SEO audit image-alt, desktop).` | Informative elements should aim for short, descriptive alternate text. Decorative elements can be ignored with an empty alt attribute. Learn more about the `alt` attribute ([https://dequeuniversity.com/rules/axe/4.10/image-alt](https://dequeuniversity.com/rules/axe/4.10/image-alt)). Found: `{up to three offending items}`. | Informative elements should aim for short, descriptive alternate text. Decorative elements can be ignored with an empty alt attribute. |
| <a id="37A-LighthouseSeoAuditor-418" />`37A-LighthouseSeoAuditor-418` | `FAIL` | Lighthouse audit `hreflang` scores below 0.9: Document doesn't have a valid `hreflang`. Message: `Document doesn't have a valid hreflang: {display value or item count} (Lighthouse SEO audit hreflang, desktop).` | hreflang links tell search engines what version of a page they should list in search results for a given language or region. Learn more about `hreflang` ([https://developer.chrome.com/docs/lighthouse/seo/hreflang/](https://developer.chrome.com/docs/lighthouse/seo/hreflang/)). Found: `{up to three offending items}`. | hreflang links tell search engines what version of a page they should list in search results for a given language or region. |
| <a id="37A-LighthouseSeoAuditor-419" />`37A-LighthouseSeoAuditor-419` | `FAIL` | Lighthouse audit `canonical` scores below 0.9: Document does not have a valid `rel=canonical`. Message: `Document does not have a valid rel=canonical: {display value or item count} (Lighthouse SEO audit canonical, desktop).` | Canonical links suggest which URL to show in search results. Learn more about canonical links ([https://developer.chrome.com/docs/lighthouse/seo/canonical/](https://developer.chrome.com/docs/lighthouse/seo/canonical/)). Found: `{up to three offending items}`. | Canonical links suggest which URL to show in search results. |
| <a id="37A-LighthouseSeoAuditor-490" />`37A-LighthouseSeoAuditor-490` | `FAIL` | A scored audit this catalog does not list (added by a newer Lighthouse) scores below 0.9. Message: `{Lighthouse title}: {display value or item count} (Lighthouse SEO audit {id}, desktop).` | Lighthouse's description of the audit, then the first offending items. | Lighthouse's description of the audit without its learn-more link. |
| <a id="37A-LighthouseSeoAuditor-300" />`37A-LighthouseSeoAuditor-300` | `WARNING` | The SEO score is below `warningBelowScore` and not below `failBelowScore`. Message: `Lighthouse SEO score is 75/100 (desktop); the warning threshold is 90.` | Raise the SEO score (`{score}`) by fixing its lowest-scoring audits first: `{audit title} ({display value})`; … | Pages search engines cannot crawl, index or understand get less organic traffic, so fewer people find the site without paid campaigns. |
| <a id="37A-LighthouseSeoAuditor-401" />`37A-LighthouseSeoAuditor-401` | `FAIL` | `failBelowScore` is equal to or above `warningBelowScore`; Lighthouse does not run. Message: `failBelowScore (90) must be lower than warningBelowScore (50).` | Set `failBelowScore` below `warningBelowScore` on the auditor's Configuration tab; the defaults are 50 and 90. | With the thresholds inverted no score can be a warning, so the audit would hide regressions until they are already failures. |
| <a id="37A-LighthouseSeoAuditor-500" />`37A-LighthouseSeoAuditor-500` | `ERROR` | Lighthouse could not load the page: the run exceeded its time budget, or Lighthouse reported a runtime error (`NO_FCP`, `PAGE_HUNG`, `DNS_FAILURE`, `ERRORED_DOCUMENT_REQUEST`, …). Message: `Lighthouse could not audit {url}: NO_FCP: The page did not paint any content.` | Make `{url}` load in a browser within the audit's time limit and re-run the audit. Last error was `"{error}"`. | — |
| <a id="37A-LighthouseSeoAuditor-200" />`37A-LighthouseSeoAuditor-200` | `SUCCESS` | The SEO score is at or above `warningBelowScore`. Message: `Lighthouse SEO score is 95/100 (desktop). At or above the warning threshold of 90.` | — | — |
| <a id="37A-LighthouseSeoAuditor-590" />`37A-LighthouseSeoAuditor-590` | `ERROR` | The audited page answered HTTP 403, HTTP 429 or a Cloudflare challenge, so 37AuditsBot was blocked before it could read the page. | Allow 37AuditsBot in your firewall or bot protection: allowlist its user agent, or verify its Web Bot Auth signature. See [https://www.37audits.com/bot](https://www.37audits.com/bot). | While 37AuditsBot is blocked this audit cannot look at the site, so problems on it go unreported. |

The score check carries in `data`: `category`, `score`, `formFactor`, both thresholds, `failingAudits` (up to ten audits of the category below Lighthouse's pass mark, lowest score first, each with `id`, `title`, `score`, `displayValue`), `lighthouseVersion`, `chromeVersion`, `benchmarkIndex`, `elapsedSeconds` and `runWarnings`. Each audit check (`1NN`, `4NN`) adds `auditId`, `auditTitle`, `auditScore` (0–100 or `null`), `scoreDisplayMode`, `displayValue`, `weight`, `group`, `numericValue`, `numericUnit`, `learnMore` (Lighthouse's documentation link), `inCatalog`, `itemCount` and `items` (up to ten rows of Lighthouse's details table: DOM nodes reduced to selector, snippet, label and explanation; source locations to `url:line:column`).

## Output documentation

| Status | Description | Test logic |
| - | - | - |
| **INFORMATION** | Report pin, manual checks and unscored audits | Always one `100` check with the Lighthouse and Chrome versions, device profile, duration and benchmark index; plus one `1NN` check per audit Lighthouse leaves to a manual check or reports without a score. |
| **SUCCESS** | The SEO score is at or above the warning threshold | The score is `>= warningBelowScore`; the message states the score and counts the failing audits. Every result, whatever its status, also carries one `4NN` check per scored audit below 0.9; it never changes the status. |
| **WARNING** | The SEO score is below the warning threshold and not below the fail threshold | One `300` check; the summary states the score. |
| **FAIL** | The SEO score is below the fail threshold, or the thresholds are inverted | One `400` check, or a single `401` check when `failBelowScore >= warningBelowScore`. |
| **ERROR** | Lighthouse could not audit the page or score the category | `500` when the page did not load inside the budget or Lighthouse reported a runtime error; `501` when the category has no score; `590` when the page blocked 37AuditsBot. |

## Risks and considerations

### A score is not a certification

Lighthouse automates the SEO checks a machine can run on one page load (crawlability (robots.txt, meta robots, HTTP status), the title and meta description, canonical and hreflang links, descriptive link text, legible font sizes, tap target sizes and structured data validity). A perfect score means no automated check failed, not that the page is flawless; manual review still finds problems automation cannot.

### Desktop and mobile differ

The two device profiles render the page at different sizes, so the audits that depend on layout can give different results. Pick the profile that matches the audience and keep it, because the scores of the two profiles are not strictly comparable.

### The run is unsigned

The Lighthouse navigation carries the 37AuditsBot user agent but no Web Bot Auth signature. A site that only admits signed bots answers with a challenge, which this audit reports as blocked (`590`).

### The score alone decides the result

Lighthouse weighs its audits into the score, so a page can score 90 with one audit failing. The result follows the score, as Lighthouse's gauge does: that page is a `SUCCESS`. The failing audit is still listed as a `FAIL` check, because the item is what the owner has to fix, but it never changes the status of the result. The check order follows Lighthouse's report: heavier audits first, then the lowest scores.

### Codes are fixed per audit

Each audit keeps its number across Lighthouse upgrades, so a deep link to a code stays valid. An audit a newer Lighthouse adds is reported with `490` (failing) or `190` (informative or manual) and `inCatalog: false` in its data until the catalog in this auditor is extended; an audit Lighthouse removes keeps its number unused.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.