Structured data that AI crawlers actually use
Which schema.org types matter for AI answers, what each one needs to say, and copy-paste JSON-LD for Organization, WebSite, Article, FAQPage and Product.
What structured data is for
A page tells a human what it is through layout, typography and context. A machine gets none of that. Structured data is a small JSON block in the <head> that says, unambiguously: this is an Article, written by this person, published by this organisation, on this date, about this thing. Every crawler reads the same JSON the same way, which is more than can be said for the rest of the page.
The AI visibility check lists the schema types it found. “None” is the common result, and the fix is below.
The five types that matter, and what each must say
Organization and WebSite — every site, once
Who runs the site and what it is called. Put this on the home page at least; sites usually include it on every page in the same @graph.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Example Ltd",
"url": "https://example.com/",
"logo": "https://example.com/logo.png",
"sameAs": ["https://www.linkedin.com/company/example"]
},
{
"@type": "WebSite",
"@id": "https://example.com/#site",
"url": "https://example.com/",
"name": "Example",
"publisher": { "@id": "https://example.com/#org" }
}
]
}
</script>Article — guides, posts, news
Headline, author, dates, publisher. The dates matter: crawlers use dateModified to judge whether a page is current, and a page with no date is treated as no fresher than its oldest copy.
{
"@type": "Article",
"headline": "How to fix a slow LCP",
"author": { "@type": "Person", "name": "Jose Pollman" },
"publisher": { "@id": "https://example.com/#org" },
"datePublished": "2026-08-01",
"dateModified": "2026-08-25",
"mainEntityOfPage": "https://example.com/guide/lcp"
}FAQPage — only where the questions are visible on the page
Question-and-answer pairs that appear on the page, marked up so a crawler can lift the answer directly. This is the type most directly useful to answer engines, and the one most abused — mark up only questions a visitor can actually see.
{
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Does blocking GPTBot remove my site from ChatGPT?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. GPTBot only collects training data. ChatGPT search uses OAI-SearchBot."
}
}]
}Product — anything with a price
Name, image, description, brand, and an Offer with price, currency and availability. Shopping answers in every AI product lean on exactly these fields.
{
"@type": "Product",
"name": "Freight scale FS-200",
"image": "https://example.com/fs200.jpg",
"description": "Platform scale, 200 kg capacity, 50 g resolution.",
"brand": { "@type": "Brand", "name": "Example" },
"offers": {
"@type": "Offer",
"price": "249.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"url": "https://example.com/fs200"
}
}Where it goes
One <script type="application/ld+json"> in the <head>, server-rendered — if it is injected by JavaScript after load, non-rendering crawlers never see it (the JavaScript-only content guide covers that). Use @graph to put several types in one block and @id references to link them, as in the first example.
On WordPress, a theme’s header.php or a small plugin that hooks wp_head is the manual route. On Shopify, the theme’s theme.liquid; most themes already emit Product and Organization. On a framework site, the layout component.
Check it worked
Run the page through Google’s Rich Results Test for parse errors, then re-run the AI visibility check: the “Structured data” row should list the types you added, and the “structured data” item should drop out of the next steps.
Common questions
- Does structured data make AI cite my page?
- Not by itself, and anyone claiming a direct effect is guessing. What it does is remove ambiguity: a crawler deciding what a page is, who published it and whether it answers a question gets the answer in a format every parser reads identically. AI Overviews and Bing/Copilot are built on search indexes where structured data has documented effects on how a page is understood. Treat it as labelling, not ranking.
- JSON-LD or microdata?
- JSON-LD. Google recommends it, it lives in one script block instead of being woven through the markup, and it survives redesigns. There is no reason to write microdata in 2026.
- How many types should a page have?
- As many as are true and no more. A blog post is an Article on a WebSite published by an Organization — three types, one @graph. Adding FAQPage to a page with no visible questions, or Product to a page you cannot buy from, is the kind of thing that gets structured data ignored altogether.
- How do I check it parsed?
- Google's Rich Results Test and the Schema.org validator both take a URL and show the parsed graph and any errors. The AI visibility check lists the types it found under 'Structured data'; if it says none and you added some, the JSON is malformed — usually a trailing comma.
Check a page against this
Enter any public URL. You’ll get the one thing stopping AI crawlers from reading the page (if anything is), then a crawler-by-crawler table and what the HTML actually tells a machine.
Other guides
- How to fix a slow LCP — Your main image or headline takes too long to appear.
- How to fix layout shift — Content jumps around while the page loads.
- How to fix slow INP — Taps and clicks take a moment to do anything.
- How to fix a slow server response — Your server is slow to start replying at all.
- How to eliminate render-blocking CSS and JS — CSS and JS files stop anything appearing on screen.
- Why you're seeing "no field data" — Google has no real-visitor data for your site yet.
- How to fix oversized and outdated images — Your images weigh far more than they need to.
- How to cut unused JavaScript — You ship JavaScript this page never runs.
- How to fix your cache headers — Returning visitors re-download files they already have.
- Why your score is different on every run — The score is different every time you test.
- Fast on desktop, slow on mobile — Desktop looks fine; the phone test says otherwise.
- Why Search Console still shows the old numbers — You fixed it weeks ago and Search Console hasn't noticed.
- How to stop plugins loading on every page — A form plugin's CSS on pages with no form — times every plugin.
- Which AI crawlers to allow in robots.txt — You block training bots and accidentally block the ones that cite you.
- Your firewall is blocking AI crawlers — robots.txt allows everyone, yet AI crawlers get a 403 before they read a byte.
- Your content only exists after JavaScript runs — The server sends an empty shell and a script fills it in — AI crawlers see nothing.
- llms.txt — what it is, what it isn't, and a template — A cheap bet, not a fix — here's the honest evidence and a template.