> ## 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.

# FAQ

> Crawls the site for a FAQ page, by FAQPage structured data or an FAQ heading, first with plain fetches and then in a real browser.

<Info>
  **SEO Auditor** — crawls the audited site, page by page, until it meets a page that carries `FAQPage` structured data or an FAQ heading, and fails when none of the first 500 pages does.
</Info>

<CardGroup cols={2}>
  <Card title="Visitors" icon="comments">
    A FAQ page answers the questions people ask before they buy, sign up or write to support.
  </Card>

  <Card title="Search and AI" icon="magnifying-glass">
    `FAQPage` structured data lets search engines and AI assistants quote your answers directly.
  </Card>
</CardGroup>

A FAQ page is where a site answers, in one place, the questions its visitors keep asking: pricing, delivery, returns, compatibility, cancellation. Marked up with [FAQPage](https://schema.org/FAQPage) structured data, those answers can also surface as rich results and in AI answers. This auditor checks that such a page exists and is reachable from the audited URL.

## How it works

1. **Start URL** — the audited URL is normalized (a missing scheme becomes `https://`, the fragment is dropped). A URL that cannot be parsed, or has no host, ends the audit with `502`.
2. **Plain-fetch crawl** — the start page is fetched as 37AuditsBot. A block (HTTP 403, HTTP 429 or a Cloudflare challenge) ends the audit with `590`; any other failure (timeout, DNS, TLS, HTTP 4xx/5xx, or a non-HTML answer) ends it with `500`. From there the crawl is breadth first, following only `<a href>` links whose host is exactly the start host (no subdomains), skipping `mailto:`, `tel:` and `javascript:` links, and silently skipping later pages that fail, answer HTTP 4xx/5xx or are not HTML. It stops at 500 pages.
3. **Detection** — every crawled page is a FAQ page when it has a `<script type="application/ld+json">` whose `@type` is `FAQPage` (also inside an array), an element with `itemtype` pointing at `schema.org/FAQPage`, or an `h1`–`h4` heading that reads "FAQ", "FAQs", "Frequently Asked Questions", "Perguntas Frequentes" or "Dúvidas Frequentes".
4. **Browser crawl** — only when the plain-fetch crawl finds nothing is the same crawl run in a headless Chromium, so sites that build their pages or their navigation with JavaScript are judged on the rendered DOM. A browser that fails to run, even after one relaunch, ends the audit with `501`.
5. **Verdict** — the first page recognized as a FAQ page is `SUCCESS` (`200`), naming the page, the detector and the crawl that found it. When both crawls are exhausted or hit the page limit, the audit is `FAIL` (`400`).

## What it audits

Every row maps to one `checkRule*` method and one `CheckCode`, in the order the auditor runs them. CheckCode suffixes use status ranges: `200` success, `400–499` fail, `500–599` error.

| CheckCode | Status | When it fires | Recommendation | Why it matters |
| - | - | - | - | - |
| <a id="37A-FAQAuditor-200" />`37A-FAQAuditor-200` | `SUCCESS` | A crawled page carries FAQPage JSON-LD, FAQPage microdata or an FAQ heading. Message: Found a FAQ page at `{faqUrl}` (`{detector}`) after crawling `{pagesCrawled}` pages of `{host}` with plain fetches / in a browser. | — | — |
| <a id="37A-FAQAuditor-400" />`37A-FAQAuditor-400` | `FAIL` | The plain-fetch crawl and the browser crawl were both exhausted, or hit the 500-page limit, without meeting a FAQ page. | Publish a FAQ page on `{host}`, linked from the pages reachable from `{url}`, and mark it up with FAQPage structured data (JSON-LD "@type": "FAQPage" or schema.org/FAQPage microdata) or a "Frequently Asked Questions" heading. | A FAQ page answers the questions visitors ask before they buy or sign up, cuts support requests and, with FAQPage structured data, can win rich results and AI answers in search; without one those questions go unanswered and visitors leave. |
| <a id="37A-FAQAuditor-500" />`37A-FAQAuditor-500` | `ERROR` | The start page could not be fetched (timeout, DNS, TLS), answered HTTP 4xx/5xx other than a block, or is not `text/html`. | Make sure `{url}` answers with an HTML page over HTTP 2xx, then run the audit again. Last error: `{error}`. | — |
| <a id="37A-FAQAuditor-501" />`37A-FAQAuditor-501` | `ERROR` | The plain-fetch crawl found no FAQ page and the browser crawl failed to run, even after one relaunch. | Make sure `{url}` loads in a headless Chromium browser, then run the audit again. Last error: `{error}`. | — |
| <a id="37A-FAQAuditor-502" />`37A-FAQAuditor-502` | `ERROR` | The start URL cannot be parsed or has no host. | Audit an absolute http(s) URL with a host name, such as [https://example.com/](https://example.com/), instead of "`{url}`". Last error: `{error}`. | — |
| <a id="37A-FAQAuditor-590" />`37A-FAQAuditor-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. |

Every check carries `startUrl`, `host`, `pagesCrawled`, `maxPages` and `method` (`jsoup` for the plain-fetch crawl, `playwright` for the browser crawl) in its data; the success check adds `faqUrl` and `detector` (`json-ld`, `microdata` or `heading`), and the failure adds `pagesCrawledWithJsoup` and `pagesCrawledWithBrowser`.

## Output documentation

| Status | Description | Test logic |
| - | - | - |
| **SUCCESS** | The site has a FAQ page | A crawled page has FAQPage JSON-LD, FAQPage microdata or an FAQ heading (`200`). |
| **FAIL** | No FAQ page was found | Both crawls exhausted or at the 500-page limit without a FAQ page (`400`). |
| **ERROR** | The auditor could not finish the crawl | Start page unreachable, HTTP 4xx/5xx or not HTML (`500`); browser crawl failed (`501`); invalid start URL (`502`); site blocked 37AuditsBot (`590`). |

This auditor emits no `WARNING` or `INFORMATION` checks.

## Risks and considerations

### Why a FAQ page matters

* Visitors who cannot find an answer to a pre-sale question rarely ask; they leave. A FAQ page keeps them on the site and lowers the volume of repetitive support requests.
* `FAQPage` structured data makes the answers machine readable, so search engines and AI assistants can show them in rich results and direct answers, which drives qualified traffic.

### How the crawl behaves

* Only links on the exact start host are followed. A FAQ hosted on `help.example.com` or `support.example.com` is not found when the audited URL is `www.example.com`; audit the help site separately.
* Each crawl visits at most 500 pages, breadth first from the start URL. On a large site a FAQ page that sits deep in the navigation may never be reached; link it from the home page or the footer.
* The plain-fetch crawl reads the HTML the server sends. Sites whose navigation or content is built by JavaScript are covered by the browser crawl, which is slower: the audit can take several minutes on such sites.
* A heading alone is enough to pass. The auditor does not judge the questions or the answers, nor whether the structured data is valid; use a structured data validator for that.

### Changes from the previous version

* An invalid start URL, or one without a host, is now `ERROR` (`502`) instead of `FAIL`.
* A start page that cannot be fetched, answers HTTP 4xx/5xx or is not HTML is now `ERROR` (`500`); it used to be skipped silently, so the audit ended in `FAIL` with zero pages crawled.
* A browser crawl that fails to run is now `ERROR` (`501`); the audit used to return the `FAIL` of the plain-fetch crawl instead.
* The "no FAQ page" verdict now carries a check (`400`) with the pages crawled by each crawl, the host and the limit; it used to be a bare `FAIL` response with no check.


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