--- title: "Schema and Structured Data for GEO — AI Citation Guide" term: "Schema and Structured Data" description: "FAQPage JSON-LD yields measurable citation lifts in AI responses (2.7x–3.2x across studies). Implementation guide for FAQPage, HowTo, and DefinedTerm schema in MkDocs Material." tags: - geo - workflows - tool-agnostic - technique aliases: - Schema Markup - Structured Data for GEO - JSON-LD for AI last_reviewed: 2026-06-13 maturity: established --- # Schema and Structured Data for GEO > Structured data lifts AI citation rates by pre-packaging content in the Q&A and step formats engines reuse — studies report 2.7x–3.2x FAQPage gains. Related lesson: [Machine-Readable Corpora](https://learn.agentpatterns.ai/geo/machine-readable-corpora/) — this concept features in a hands-on lesson with quizzes. Independent studies report FAQPage citation improvements of 2.7x to 3.2x ([Frase.io](https://www.frase.io/blog/faq-schema-ai-search-geo-aeo); [DEV Community](https://dev.to/wilow445/schemaorg-is-your-secret-weapon-for-ai-citations-heres-the-data-1if3)) because structured data reduces extraction effort during indexing. Schema's primary value has shifted from SEO to AI citation — ChatGPT, Perplexity, Gemini, and Claude process it at indexing time. This site auto-injects Article, FAQPage, HowTo, DefinedTerm, and BreadcrumbList schemas via `hooks/structured_data.py`, plus a site-wide `DefinedTermSet` on the [concepts glossary](../concepts.md). ## What changed: Google vs AI search | Channel | FAQPage / HowTo rich results | Schema citation value | |---------|------------------------------|-----------------------| | Google Search (classic) | Restricted to government/health sites since Aug 2023 | Low for most dev docs | | Google AI Overviews | Processed at index time | High — 3.2x appearance lift (Frase.io) | | ChatGPT | Not rendered live; indexed content used | High — favors Q&A format | | Perplexity | Indexed schema aids entity disambiguation | High — citation footnotes | | Gemini | Renders JavaScript; processes schema | High | Chatbots do not read JSON-LD on live fetch. The benefit accrues at indexing and training. ## The three schema types ### FAQPage Structures Q&A blocks for direct AI extraction. Keep answers 40–80 words — standalone, citable length. ```json { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{ "@type": "Question", "name": "What is an agent harness?", "acceptedAnswer": { "@type": "Answer", "text": "An agent harness is scaffolding that surrounds an AI agent loop — managing context, tool calls, error recovery, and output formatting. It separates infrastructure concerns from reasoning logic." } }] } ``` The hook detects `## FAQ` or `## Frequently Asked Questions` followed by `**Question**` / answer pairs and emits this schema automatically. ### HowTo Converts numbered step lists into extractable blocks — each step is a quotable unit. ```json { "@context": "https://schema.org", "@type": "HowTo", "name": "How to configure prompt caching", "step": [ { "@type": "HowToStep", "position": 1, "text": "Enable the caching header in your API request." }, { "@type": "HowToStep", "position": 2, "text": "Place stable content at the top of the context window." } ] } ``` Auto-detection triggers on ordered lists (`
    `) with 3+ items, restricted to `patterns/` and `techniques/` paths. Extend `_HOWTO_PATHS` in `hooks/structured_data.py` to widen coverage. ### DefinedTerm Machine-readable definitions for named concepts — useful where terms like "agent" are ambiguous across tools. Every coined-concept leaf page emits one `DefinedTerm`, anchored to a single `DefinedTermSet` on `/concepts/`: ```json { "@context": "https://schema.org", "@type": "DefinedTerm", "name": "Harness Engineering", "description": "The discipline of designing agent environments so agents reliably produce correct results.", "alternateName": ["agent environment design", "environment design for agents"], "url": "https://agentpatterns.ai/agent-design/harness-engineering/", "inDefinedTermSet": "https://agentpatterns.ai/concepts/" } ``` The hook maps frontmatter to schema fields automatically: | `DefinedTerm` field | Source | |---|---| | `name` | `term:` frontmatter — the clean moniker — falling back to `title:` (SEO-shaped) | | `description` | `description:` frontmatter (the page's one-line definition) | | `alternateName` | `aliases:` frontmatter — the page's strongest vocabulary-ownership signal | | `url` / `inDefinedTermSet` | canonical page URL / the `/concepts/` glossary | Gated to coined-concept sections (`_DEFINED_TERM_PATHS`) plus `_DEFINED_TERM_ALLOW` exceptions; `articles/`, `tools/`, and `training/` are excluded — they describe terms rather than coin them. ## How this site generates schema The hook runs at `on_post_page` and injects JSON-LD into every page's ``: ```mermaid graph LR A[MkDocs builds page] --> B[on_post_page hook fires] B --> C[Organization schema] B --> D{Is homepage?} D -- yes --> E[WebSite schema] B --> F[Article schema] B --> G[BreadcrumbList schema] B --> H{FAQ heading detected?} H -- yes --> I[FAQPage schema] B --> J{Ordered list 3+ steps and patterns/ or techniques/ path?} J -- yes --> K[HowTo schema] B --> M{Coined-concept section?} M -- yes --> N[DefinedTerm schema] C & E & F & G & I & K & N --> L[Inject before head close] ``` No per-page config — add an FAQ section and schema appears; a coined-concept page emits a `DefinedTerm` with no config at all (and a cleaner one if you set `term:`). ## Writing for schema auto-detection To trigger each schema type, write in the shape the hook detects: - FAQPage — a `## FAQ` (or `## Frequently Asked Questions`) heading with `**Question?**` lines followed by paragraph answers. Keep answers 40–80 words and standalone. - HowTo — an ordered list of 3+ steps under `patterns/` or `techniques/`. Write each step as a self-contained sentence, since the hook extracts it as a standalone `HowToStep.text`. - DefinedTerm — nothing in the body. Set `term:` to the bare moniker when `title:` is a headline (otherwise `name` falls back to the SEO title), keep `description:` a one-line definition, and list every searchable alternate name under `aliases:`. ## When this backfires Schema lifts citation rates in aggregate, but fails under specific conditions: - Stale schema after edits — if body text drifts from the auto-generated schema (for example, FAQ answers edited outside the `**Question**` / answer format), engines see contradictory signals and may deprioritize the page. - Thin or low-authority domains — lift is relative to baseline authority. Schema accelerates the [existing topical-authority signal](topical-authority.md). It does not manufacture credibility. - Wrong type for content shape — HowTo on conceptual explanations, or FAQPage on unrelated Q&A, causes schema–content mismatch that validators flag and engines may penalize. - Indexing pipeline changes — benefit accrues at indexing time. If a provider downweights structured data, pages relying on the lift lose it with no on-page change. ## Testing schema | Tool | Purpose | URL | |------|---------|-----| | Google Rich Results Test | Validates Google-supported rich results (Article, BreadcrumbList) | https://search.google.com/test/rich-results | | Schema Markup Validator | Validates all schema.org types without Google restrictions | https://validator.schema.org/ | | [Google Search Console](gsc-search-console-monitoring.md) | Monitors rich result impressions and errors post-deployment | https://search.google.com/search-console | Run locally: ```bash mkdocs build --strict # Paste a built page's into the Schema Markup Validator ``` ## Sources - [FAQPage Structured Data — Google Search Central](https://developers.google.com/search/docs/appearance/structured-data/faqpage) — spec and eligibility - [DefinedTerm — Schema.org](https://schema.org/DefinedTerm) — official spec - [DefinedTermSet for Industry Terminology — DEV](https://dev.to/mark_mcneece_365i/using-schemaorgs-definedtermset-for-industry-terminology-a-case-study-1mm2) — fragment `@id` and TermSet linking - [Schema.org Is Your Secret Weapon for AI Citations — DEV](https://dev.to/wilow445/schemaorg-is-your-secret-weapon-for-ai-citations-heres-the-data-1if3) — FAQPage +45%, HowTo +38% - [FAQ Schema for AI Search, GEO and AEO — Frase.io](https://www.frase.io/blog/faq-schema-ai-search-geo-aeo) — 3.2x AI Overview lift - [Schema Markup and AI in 2025 — Searchviu](https://www.searchviu.com/en/schema-markup-and-ai-in-2025-what-chatgpt-claude-perplexity-gemini-really-see/) — JSON-LD ignored on live fetch; benefits at indexing - [Structured Data in MkDocs](https://v-schipka.github.io/posts/schema-in-mkdocs/) — MkDocs Material approach - [Structured Data for SEO and GEO — Digidop](https://www.digidop.com/blog/structured-data-secret-weapon-seo) — GPT-4 accuracy 16% → 54% ## FAQ **How much do independent studies say FAQPage schema improves AI citation rates?** Independent studies report FAQPage schema lifting AI citation appearances by 2.7x to 3.2x compared to unstructured pages ([Frase.io](https://www.frase.io/blog/faq-schema-ai-search-geo-aeo); [DEV Community](https://dev.to/wilow445/schemaorg-is-your-secret-weapon-for-ai-citations-heres-the-data-1if3)), because structured data reduces extraction effort during indexing. Schema's primary value has shifted from Google rich results to this AI-citation effect — cited by ChatGPT, Perplexity, Gemini, and Claude at indexing time, not on live fetch. **Does ChatGPT or Perplexity read a page's JSON-LD when they visit it live?** No. ChatGPT, Perplexity, and most AI engines do not parse a page's JSON-LD during a live fetch — the hook-injected schema is processed at indexing and training time instead, not the moment they visit the page. Gemini is the exception: it renders JavaScript and processes schema in real time, unlike the others. **What exact heading and format triggers automatic FAQPage schema on this site?** Write a `## FAQ` (or `## Frequently Asked Questions`) heading followed by bold-paragraph questions and plain-text answer paragraphs — the same `**Question**` / answer pattern this page uses. The `hooks/structured_data.py` hook scans for that exact shape at build time and emits a `FAQPage` JSON-LD block automatically; no frontmatter flag or manual schema authoring is required. **Why does adding schema markup not fix citation problems on a low-authority page?** Schema markup amplifies an existing signal rather than creating one — its citation lift is relative to a page's baseline authority. On a thin or low-authority page, adding FAQPage or HowTo JSON-LD accelerates whatever [topical authority](topical-authority.md) the page already has, but it does not manufacture credibility the page lacks. ## Key Takeaways - Schema's payoff is now AI citation, not Google rich results — benefit accrues at indexing time, not on live fetch. - This site auto-injects FAQPage, HowTo, and DefinedTerm schema from page structure and frontmatter — no per-page config. - Match the schema type to content shape; mismatched types (HowTo on prose, stale FAQ answers) can deprioritize a page. ## Related - [GEO for Technical Docs](geo-for-technical-docs.md) — schema type selection checklist and per-format GEO priorities - [How AI Engines Cite](how-ai-engines-cite.md) — citation mechanisms schema markup targets - [Answer-First Writing](answer-first-writing.md) — content structure that complements schema auto-detection - [SEO vs GEO](seo-vs-geo.md) — how structured data signals differ between traditional SEO and AI citation optimization - [llms.txt](llms-txt.md) — complementary machine-readable format for AI discoverability - [AI Crawler Policy](ai-crawler-policy.md) — controlling which crawlers index your structured data - [Measuring GEO Performance](measuring-geo-performance.md) — tracking schema citation lift - [What Is GEO](what-is-geo.md) — foundational concepts behind generative engine optimization