squirrelscan
GitHub

FAQPage schema: mainEntity, Question and acceptedAnswer

FAQ markup with no mainEntity, or Question entries missing name or acceptedAnswer. squirrel checks the structure on every page that carries it.

What FAQPage schema is

FAQPage is the schema.org type for a page of questions and answers written by the site itself. Its mainEntity holds an array of Question nodes, each with a name holding the question text and an acceptedAnswer holding an Answer with a text. A page where readers submit competing answers is QAPage, not FAQPage.

Google stopped showing FAQ rich results in Search on 7 May 2026 and removed the documentation for the feature, having already restricted it in August 2023 to well-known government and health sites. The markup is still valid schema.org and still describes the page accurately for any other consumer, which is why this rule checks the structure rather than telling you to add it.

What squirrel checks

The rule reads every script[type="application/ld+json"] on the page and keeps the first FAQPage node from the last script that contains one, matching either a plain @type or an @type array. It emits one or two checks:

  • faq-schema: reports at info status with the message No FAQPage schema found when no such node exists. No further checks run.
  • faq-mainEntity: warns with the message FAQPage missing mainEntity and the value Add array of Question items when mainEntity is absent.
  • faq-questions: warns with the message FAQPage has no questions when mainEntity is an empty array. It warns with the message N question(s) missing required properties and the value Each Question needs @type, name, acceptedAnswer when at least one entry lacks any of the three. A mainEntity entry that is a node reference, {"@id": "…#q1"} as Yoast writes it, is read from the node with that @id anywhere in the page’s JSON-LD, in the same @graph or another script. A reference to a node the page does not have is counted as missing its properties.
  • faq-valid: emitted only when at least one entry is valid, passing with the message FAQPage has N valid question(s).

An entry counts as valid only when its @type is exactly the string Question. An entry whose @type is an array containing Question is counted as invalid. A mainEntity holding a single object rather than an array is accepted and treated as one question. Every property test is a truthiness test rather than a presence test, so a property present but empty, 0 or false counts as missing. A mainEntity of "" or 0 therefore reports as missing.

How to fix it

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [{
    "@type": "Question",
    "name": "How long does delivery take?",
    "acceptedAnswer": { "@type": "Answer", "text": "Three to five working days." }
  }]
}
</script>

Put it in the <head> of the FAQ page, and keep every question and answer visible in the page content as well.

JSON-LD wrapped in an @graph array, which is what Yoast, Rank Math and several other generators emit, is read the same as a top-level node: the rule flattens each script before looking for FAQPage.

Rule IDschema/faq
CategoryStructured Data
ScopePer-page
Severitywarning
Weight4/10

Enable / disable

Disable this rule

[rules]
disable = ["schema/faq"]

Disable all Structured Data rules

[rules]
disable = ["schema/*"]

Enable only this rule

[rules]
enable = ["schema/faq"]

enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.

  • schema/json-ld-valid: whether the JSON-LD parses and passes schema.org validation at all.
  • content/heading-hierarchy: the heading structure an FAQ page normally uses for the same questions.
  • ax/llms-txt: the plain-text summary agents read, which often covers the same ground as an FAQ.
  • schema/article: the type to use when the page is a written article rather than a question list.

Structured data findings ship in every audit next to the core SEO, performance and agent experience rules. See Fix SEO issues with AI for how an agent works through a report.

References

Check your site

Run squirrel audit https://example.com and open the Structured Data section of the report. Each FAQ page shows how many questions validated. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close