Skip to content
Citable
Structured dataIntermediate · 9 min read

Structured data for AI answers: the schema.org types that matter

Which JSON-LD types tell a machine what a passage is — an answer, a definition, an author — and how to generate them so they never disagree with the page.

Published Updated

Short answer

Structured data for AI answers is JSON-LD that labels what a page contains: Article or TechArticle for provenance (author, datePublished, dateModified, citation), FAQPage for question–answer pairs, DefinedTerm for definitions, Person with sameAs for authors, BreadcrumbList and WebSite for context, and SpeakableSpecification for the direct answer. Google requires no markup for AI features; its value is removing ambiguity, so generate it from the CMS fields that render the visible text.

Key takeaways

  1. 01Google states that no special schema.org markup is needed for AI Overviews or AI Mode; structured data clarifies content rather than ranking it.
  2. 02TechArticle with author, datePublished, dateModified and citation gives a retrieval system provenance it can check without reading the page.
  3. 03FAQPage no longer earns rich results for most sites, but it still exposes question–answer pairs in the exact shape answer engines extract.
  4. 04DefinedTerm and DefinedTermSet make a glossary machine-readable: one term, one definition, one stable @id per entity.
  5. 05Person with sameAs links an author to profiles elsewhere, which is how machines disambiguate names.
  6. 06Generate every JSON-LD value from CMS fields so the markup can never disagree with the visible text.
On this page

What structured data can and cannot do for an answer

Google's documentation for AI features is unusually direct. The page AI features and your website says: "You don't need to create new machine readable files, AI text files, or markup to appear in these features. There's also no special schema.org structured data that you need to add." It adds that the existing best practices for SEO remain relevant. Structured data is therefore not a lever that ranks a page inside AI Overviews or AI Mode, and no other answer engine vendor has published anything that says otherwise.

What structured data does is narrower and still worth doing. A crawler that reads a page sees text. It has to infer that a paragraph is a definition, that a name in the byline is the author, that a list at the foot of the page is the sources. JSON-LD states those things outright, in a vocabulary that search and AI companies already parse, and removes the inference step where machines make mistakes.

Two constraints shape everything below. Google recommends JSON-LD over microdata and RDFa because it is "the easiest solution for website owners to implement and maintain at scale". And Google's structured data policies say: "Don't mark up content that is not visible to readers of the page." Markup describes the page; it never substitutes for it.

Article and TechArticle: provenance a machine can check

The guide What is Answer Engine Optimization argues that retrieval systems lean on the signals they can verify: who wrote a page, when, and on what basis. Article carries all three. TechArticle is the schema.org subtype for technical and how-to material, and it is what this site emits for guides.

Google's Article documentation lists author, author.name, author.url, datePublished, dateModified, headline and image as recommended properties. It asks for dates "in ISO 8601 format" and recommends including a timezone; without one, Google falls back to "the timezone used by Googlebot". Two further properties matter for answers even though Google does not list them:

  • citation — schema.org defines it as "a citation or reference to another creative work, such as another publication, web page, scholarly article, etc." It accepts a CreativeWork or plain text. List the same sources you show at the foot of the page.
  • about — the entities the page is about, ideally as DefinedTerm references with stable @id values, covered below.
json
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "@id": "https://example.com/guides/structured-data-for-ai-answers#article",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://example.com/guides/structured-data-for-ai-answers"
  },
  "headline": "Structured data for AI answers: the schema.org types that matter",
  "description": "Structured data for AI answers is JSON-LD that labels what a page contains …",
  "datePublished": "2026-02-16T09:00:00+01:00",
  "dateModified": "2026-02-16T09:00:00+01:00",
  "inLanguage": "en",
  "author": { "@id": "https://example.com/authors/endrit-krasniqi#person" },
  "publisher": { "@id": "https://example.com/#organization" },
  "isPartOf": { "@id": "https://example.com/#website" },
  "citation": [
    {
      "@type": "CreativeWork",
      "name": "AI features and your website",
      "url": "https://developers.google.com/search/docs/appearance/ai-features",
      "publisher": { "@type": "Organization", "name": "Google Search Central" }
    }
  ],
  "about": [
    {
      "@type": "DefinedTerm",
      "@id": "https://example.com/glossary/json-ld#term",
      "name": "JSON-LD"
    }
  ]
}

Reference the author, publisher and website by @id rather than repeating their details in every article, so each node exists once.

up to 40%

visibility boost reported in the GEO benchmark, with adding citations, quotations and statistics among the strongest methods Source: GEO: Generative Engine Optimization (arXiv)

The GEO study measured citations visible in the text, not the citation property; the property makes the same list legible to a parser and does not replace it.

FAQPage after Google retired the rich result

In August 2023 Google's Search Central blog announced that "FAQ (from FAQPage structured data) rich results will only be shown for well-known, authoritative government and health websites", and added: "While you can drop this structured data from your site, there's no need to proactively remove it." For most sites, FAQPage stopped earning a search appearance on that day. On 8 May 2026 Google's documentation changelog added a deprecation notice saying the feature "will no longer appear in Google Search starting May 7, 2026", and the FAQ rich result documentation was removed in June 2026. The search appearance is now gone for every site.

It is still worth emitting, for a different reason. A Question with an acceptedAnswer is the exact unit an answer engine extracts: one question, one self-contained answer, no surrounding context required. Keep the answer text identical to the visible FAQ, and keep each answer between roughly thirty and eighty words so it is quotable on its own.

json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "@id": "https://example.com/guides/structured-data-for-ai-answers#faq",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Is structured data a ranking factor for AI Overviews?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Google's documentation for AI features says there is no special schema.org structured data you need to add …"
      }
    }
  ]
}

Do not use FAQPage to carry questions that are not visibly answered on the page. That is precisely what the content guideline prohibits.

DefinedTerm and DefinedTermSet: one entity, one definition

Language models resolve entities by name, and a name defined in several places, slightly differently each time, is harder to resolve than one defined once. DefinedTerm is schema.org's type for "a word, name, acronym, phrase, etc. with a formal definition"; DefinedTermSet groups terms into a glossary. Each glossary page on this site emits one DefinedTerm with an @id, and the glossary index emits the set:

json
{
  "@context": "https://schema.org",
  "@type": "DefinedTerm",
  "@id": "https://example.com/glossary/speakable#term",
  "name": "Speakable",
  "alternateName": ["SpeakableSpecification"],
  "description": "Speakable is a schema.org property (with the SpeakableSpecification type) that identifies, by CSS selector or XPath, which parts of a page are best suited to be read aloud or quoted verbatim.",
  "url": "https://example.com/glossary/speakable",
  "inDefinedTermSet": { "@id": "https://example.com/glossary#set" }
}

The @id is what makes this useful beyond the glossary. Any guide that discusses the term references the same @id in its about array, so a parser can connect a definition, the pages that use it and the pages that link to it without string matching. The description is the same field that renders as the visible definition; the two cannot diverge.

Person, BreadcrumbList and WebSite: context around the page

Person with sameAs

Author markup only works if the author is unambiguous. sameAs takes URLs that identify the same person elsewhere — a GitHub profile, a personal site, an ORCID record — and Google's Article documentation names sameAs as an alternative to author.url for disambiguating authors. One Person node with an @id, referenced from every article, is enough.

json
{
  "@context": "https://schema.org",
  "@type": "Person",
  "@id": "https://example.com/authors/endrit-krasniqi#person",
  "name": "Endrit Krasniqi",
  "url": "https://example.com/authors/endrit-krasniqi",
  "jobTitle": "Front-end engineer",
  "sameAs": ["https://github.com/Endrit-seek"],
  "worksFor": { "@id": "https://example.com/#organization" }
}

Breadcrumbs tell a crawler where a page sits within the site. Google requires position, name and item on each ListItem, with item optional for the final entry, and at least two items for the rich result. Generate the list from the route rather than by hand: home, section, page.

WebSite

WebSite markup once powered the sitelinks search box. Google's blog announced it would remove that visual element "starting on November 21, 2024", while the WebSite type "continues to be supported" for site names. The site-names documentation requires the markup to be on the home page — "the domain or subdomain level root URI" — with name and url, plus an optional alternateName. Give it an @id and let every article's isPartOf point at it.

json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "https://example.com/#website",
  "url": "https://example.com/",
  "name": "Citable",
  "inLanguage": "en",
  "publisher": { "@id": "https://example.com/#organization" }
}

SpeakableSpecification: pointing at the answer

Speakable is the most literal type in this guide: it names the element on the page that contains the passage to read aloud or quote. Google documents it as a beta feature, used by the Google Assistant to answer news queries from publishers writing in English; it recommends "roughly two to three sentences" per section, and says to use either cssSelector or xpath, not both. No answer engine has confirmed that it uses the property. It is nonetheless nearly free if your template already has a short-answer block:

json
"speakable": {
  "@type": "SpeakableSpecification",
  "cssSelector": ["[data-speakable='short-answer']", "[data-speakable='headline']"]
}

The selector targets a data-speakable attribute rather than a class name, so a redesign cannot silently break it.

Generate markup from CMS fields so it never drifts

The common failure with structured data is not missing markup. It is markup that says something the page no longer says: a dateModified nobody updates, an author who has left, an FAQ answer edited in the CMS but not in the JSON-LD. Each of those breaks Google's content guideline, and each is a false statement made to the system you are hoping will quote you.

The fix is architectural. Structured data should be a projection of the same fields that render the visible page, so that nothing is typed twice. On this site the guide template builds its JSON-LD from the Storyblok story in one function, with no literals of its own:

ts
import { absoluteUrl, pathForSlug } from "@/lib/site";
import type { GuideStory } from "@/lib/storyblok/types";

export function guideJsonLd(guide: GuideStory) {
  const c = guide.content;
  const url = absoluteUrl(pathForSlug(guide.full_slug));
  return {
    "@context": "https://schema.org",
    "@type": "TechArticle",
    "@id": `${url}#article`,
    headline: c.title,
    description: c.short_answer,
    datePublished: c.published_at,
    dateModified: c.updated_at || c.published_at,
    author: { "@id": absoluteUrl(`${pathForSlug(c.author.full_slug)}#person`) },
    citation: c.sources.map((s) => ({
      "@type": "CreativeWork",
      name: s.title,
      url: s.url,
    })),
    speakable: {
      "@type": "SpeakableSpecification",
      cssSelector: ["[data-speakable='short-answer']"],
    },
  };
}

The component that renders it escapes <, so a string value can never close the script element early:

tsx
export function JsonLdScript({ data }: { data: object }) {
  const json = JSON.stringify(data).replace(/</g, "\\u003c");
  return <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: json }} />;
}

Because the same short_answer field feeds the visible block, the description property and the speakable selector, editing it in the CMS updates all three at once. That is the property to design for: one source of truth, several projections.

Structured data review for an answer page

  • Every value in the JSON-LD is derived from a CMS field, never typed separately
  • datePublished and dateModified are ISO 8601 with a timezone, and dateModified changes on every edit
  • author is a Person node with @id, url and at least one sameAs
  • citation lists the same sources shown on the page
  • FAQPage answers are identical to the visible FAQ text
  • Glossary terms use DefinedTerm with a stable @id, referenced from about on the pages that use them
  • speakable targets a data attribute, not a styling class
  • BreadcrumbList is generated from the route
  • Output checked in Google's Rich Results Test and the Schema Markup Validator after every template change

Frequently asked questions

Is structured data a ranking factor for AI Overviews?

No. Google's documentation for AI features says there is no special schema.org structured data you need to add and no additional requirements beyond those for Google Search. Structured data can make a page's meaning unambiguous — who wrote it, when, what a passage is — but it does not by itself make a page more likely to be cited.

Should I remove FAQPage markup now that Google's FAQ rich result is gone?

No. Google's 2023 announcement said there is no need to proactively remove it, and its May 2026 deprecation notice did not change that. FAQ rich results were limited to government and health sites in August 2023 and stopped appearing altogether on 7 May 2026, so the search appearance is gone for every site. The markup still describes question–answer pairs in a machine-readable form, which is useful independently of rich results, provided the answers match the visible text exactly.

Which is better for a guide: Article or TechArticle?

TechArticle is a schema.org subtype of Article intended for technical and how-to material, so it is the more precise label for documentation and guides. Google's Article documentation lists Article, NewsArticle and BlogPosting as the types it supports for its Article feature. If that search appearance matters to you, emit Article; if precision matters more, emit TechArticle. Both carry the same author, date and citation properties.

Do ChatGPT, Perplexity or Claude read JSON-LD?

Only Google documents how it treats structured data. OpenAI's, Anthropic's and Perplexity's published crawler documentation covers user agents and robots.txt, not markup. Their crawlers fetch the same HTML that contains your JSON-LD, so the data is available to them, but there is no vendor statement that it influences which pages are cited. Treat it as a low-cost clarity layer, not a guaranteed signal.

Where should the JSON-LD go on the page?

Inside a script element with type application/ld+json, in either the head or the body. Google's documentation says it can read JSON-LD in either location, including when it is injected by JavaScript, but server-rendering it is safer for crawlers with small render budgets. Escape the less-than character in the serialised JSON so a string value can never close the script tag early.

Sources

  1. [1]
    AI features and your website

    Google Search Central · 2025

  2. [2]
  3. [3]
  4. [4]
    Changes to HowTo and FAQ rich results

    Google Search Central Blog · 2023

  5. [5]
  6. [6]
    Farewell, Sitelinks Search Box

    Google Search Central Blog · 2024

  7. [7]
  8. [8]
    DefinedTerm

    Schema.org

Terms used in this guide

JSON-LD
JSON-LD (JSON for Linking Data) is a W3C standard for expressing linked data as ordinary JSON. On the web it is the format Google recommends for Schema.org structured data: a single script block of type application/ld+json that describes the page's entities — article, author, dates, FAQ, definitions — without touching the visible HTML.
Schema.org
Schema.org is a shared vocabulary of types and properties — Article, Person, FAQPage, DefinedTerm and hundreds of others — for describing what a web page is about in a form machines can read. Founded in 2011 by Google, Microsoft, Yahoo and Yandex, it is maintained in the open through a W3C community group and can be written as JSON-LD, Microdata or RDFa.
Structured data
Structured data, in the web context, is machine-readable markup embedded in a page that states explicitly what the page contains — an article, its author, a publication date, a question and its answer — using a shared vocabulary such as Schema.org. It is written as JSON-LD, Microdata or RDFa and lets crawlers and answer engines identify entities and relationships without inferring them from prose.
DefinedTerm
DefinedTerm is a Schema.org type for a word, name, acronym or phrase that has a formal definition. It carries a name, a description that holds the definition, an optional termCode, and an inDefinedTermSet link to the DefinedTermSet — the glossary or classification — it belongs to. It is the natural markup for a glossary entry and tells a machine that a passage is a definition.
Speakable
Speakable is a schema.org property (with the SpeakableSpecification type) that identifies, by CSS selector or XPath, which parts of a page are best suited to be read aloud or quoted verbatim — typically a headline and a short summary. It was introduced for voice assistants and remains the most direct way to tell a machine which passage is the answer.

Written by

Front-end engineer & author of Citable

Endrit Krasniqi is a front-end engineer who builds content platforms with React, Next.js, Nuxt and headless CMSs such as Storyblok. He writes Citable to document, with working code, how websites can be structured so that search engines, answer engines and large language models quote them accurately.

All guides
  • Structured data

    FAQ content that answer engines pick up (and why FAQPage rich results went away)

    FAQ content works for answer engines when each item pairs a question people ask with a self-contained answer of 40–80 words, rendered in the HTML rather than loaded on click, and mirrored in FAQPage JSON-LD from the same fields. Google restricted FAQ rich results in 2023 and withdrew them in May 2026, but FAQPage remains valid schema.org, and question-and-answer pairs are the passages retrieval systems extract.

    8 min read

  • Content

    E-E-A-T for answer engines: authors, dates and sources that machines can verify

    E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) is Google's description of a reliable source, and it is not a ranking factor. For answer engines it translates into signals a machine can verify: a named author with a profile page and Person markup, visible published and updated dates that match the structured data, outbound links to primary sources with a citation list, first-hand evidence, and an About page that says who is responsible.

    8 min read

  • Technical

    Modelling content for answer engines in a headless CMS!

    A headless CMS content model for answer engines makes every Answer Engine Optimization signal a constrained field, not an editorial habit: a required short answer with a maximum length, key takeaways, FAQ items, sources with URL validation, the author as a relation, and published and updated dates. JSON-LD, Markdown and llms.txt are then generated from those fields, so no representation can disagree with the page.

    9 min read