What JSON-LD is (and why it matters for AI search)
JSON-LD (JavaScript Object Notation for Linked Data) is a way to embed structured, machine-readable metadata into HTML pages. You drop a <script type="application/ld+json"> block into your <head> (or anywhere in the document) and put a JSON object describing the page inside.
The vocabulary is schema.org — a shared dictionary of types (Organization, Person, Product, Article, FAQPage…) and properties (name, url, description, sameAs, datePublished…). Browsers ignore it. Search engines and AI engines parse it explicitly.
The TL;DR for AI search
Good JSON-LD won't make AI engines cite you. Missing or wrong JSON-LD can make them notcite you, or cite you with the wrong name / wrong product description / wrong url. The asymmetry matters — it's cheap insurance.
Why this matters in 2026 — the AI angle
Three concrete reasons:
- Entity disambiguation."Apple" the company vs Apple the fruit vs Apple the album. JSON-LD declares which entity the page is about with no ambiguity — name, url, sameAs (your social profile URLs), description. AI engines use this to bind your domain to your brand entity in their knowledge graph.
- Property extraction.When ChatGPT, Perplexity, or Google AI Mode answer "what is X", they pull structured facts (founding date, headquarters, pricing, product category) preferentially from JSON-LD over inferring from prose. A clean SoftwareApplication block beats three paragraphs of marketing copy.
- Citation accuracy. When an AI engine cites your page, the displayed brand name + favicon + description often comes from your Organization JSON-LD, not your
<title>tag. If the schema is missing or wrong, your citation looks worse than the competitor with clean schema next to it.
What JSON-LD is not: a ranking lever. Google has consistently said structured data does not boost rankings directly — it makes you eligible for rich result formats (FAQ accordions, video carousels) and helps the model understand the page. Same for AI engines: it's an understanding signal, not a ranking signal.
The 4 schemas worth shipping first
schema.org has 800+ types. Most are noise for an AI search visibility play. Ship these four in this order:
- Organization — on every page (or at least the homepage). Declares who you are. Foundation for everything else.
- SoftwareApplication (for SaaS) or Service (for agencies) or Product (for e-commerce) — on the homepage and key product pages.
- Article / BlogPosting — on each blog post / guide. Most CMS / static-site frameworks do this automatically; verify yours does.
- FAQPage — on dedicated FAQ pages and any page with a meaningful FAQ section. Eligible for the FAQ rich result, and AI engines often pull verbatim answers from this block.
Skip HowTo (Google deprecated the rich result),Event (only if you actually run events), Recipe (recipe sites only), and the long tail.
Organization — the foundation
Goes on every page. Keep the values identical across pages — drift is the #1 cause of entity confusion.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://yoursite.com/#organization",
"name": "Your Brand Name",
"url": "https://yoursite.com",
"logo": "https://yoursite.com/logo.png",
"description": "One sentence describing what you do.",
"sameAs": [
"https://x.com/yourbrand",
"https://www.linkedin.com/company/yourbrand",
"https://github.com/yourbrand"
]
}
</script>Required-in-practice fields:
@context— alwayshttps://schema.org.@type—Organization.@id— stable identifier, your origin +#organization. Lets other blocks reference this entity.name— exactly as you want to be cited.url— your canonical homepage.logo— absolute URL to a high-resolution logo.description— one sentence. Avoid marketing fluff.sameAs— array of your social / canonical profile URLs. The single most important field for entity disambiguation.
SoftwareApplication — for SaaS / apps
Use on your homepage and product pages. The free tier is often declared via offers; aggregate ratings come from your G2 / Capterra equivalent.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"@id": "https://yoursite.com/#software",
"name": "Your Product Name",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"description": "One sentence about what the product does.",
"url": "https://yoursite.com",
"offers": {
"@type": "Offer",
"price": "129",
"priceCurrency": "USD"
},
"publisher": { "@id": "https://yoursite.com/#organization" }
}
</script>Honest note on aggregateRating: only include it if you have real reviews on your own domain (e.g. a testimonials page). Inventing ratings is a Google guidelines violation and the rich result will get removed.
Article / BlogPosting — for content
Most blog frameworks (Next.js + content collections, Hugo, Astro, Ghost, WordPress with Yoast / Rank Math) ship Article schema automatically. Verify yours does — open the rendered HTML on a blog post and search for "@type": "Article" or "BlogPosting".
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Your blog post title",
"description": "Two-sentence summary.",
"url": "https://yoursite.com/blog/your-slug",
"datePublished": "2026-05-13T00:00:00+00:00",
"dateModified": "2026-05-13T00:00:00+00:00",
"author": {
"@type": "Person",
"name": "Author Name",
"url": "https://yoursite.com/about"
},
"publisher": { "@id": "https://yoursite.com/#organization" },
"inLanguage": "en-US"
}
</script>Required-in-practice fields: headline, description, url, datePublished (ISO 8601 with timezone), dateModified, author, publisher. Missing timezone on dates is a common Rich Results Test warning.
FAQPage — for FAQ sections
Use on pages that have a clear FAQ section with question/answer pairs. Only include FAQs that are actually visible on the page — fabricating ones in schema only is a Google guidelines violation.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Question text — as it appears on the page",
"acceptedAnswer": {
"@type": "Answer",
"text": "Plain-text answer — as it appears on the page."
}
}
]
}
</script>Google's 2023 update reduced the FAQ rich result to authoritative government / health sites. The block is still worth shipping for AI engines (ChatGPT, Perplexity) which pull verbatim answers from FAQPage blocks for their own citations.
Where to put the script (every framework)
JSON-LD goes anywhere in the HTML — <head> is conventional, but <body> works too. One block per entity, or one combined block using @graph for sites with multiple entities per page.
Next.js (App Router)
// In your page or layout
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Organization',
// ...
}
export default function Page() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
{/* rest of page */}
</>
)
}WordPress
Yoast SEO, Rank Math, and AIOSEO all generate Organization, Article, and FAQPage JSON-LD automatically. Open the rendered HTML and verify — don't hand-add schema if your plugin already emits it (duplicate blocks cause validation issues).
Webflow / Framer
Add custom JSON-LD via Page Settings → Custom Code → Head code. Paste the raw <script> block. Both platforms ship a basic Organization block via SEO settings; augment if needed.
Static HTML
Just drop the <script> tag into the <head> of every page. For multi-page sites, use a build-time partial / include so updates ship once and propagate everywhere.
Common mistakes
- Drift across pages. Organization
nameorurldiffers between homepage and blog posts. AI engines treat these as different entities. Use a shared partial / component. - Missing
@id. Without stable identifiers, you cannot link Organization, WebSite, and SoftwareApplication entities to each other viapublisher/isPartOfreferences — every block becomes an orphan. - Schema describing content that isn't on the page. FAQ schema for questions not visible. Aggregate ratings without reviews. Both are guideline violations. Search engines may remove eligibility for your domain entirely.
- Bare-date
datePublished. Always use ISO 8601 with timezone:2026-05-13T00:00:00+00:00. Bare2026-05-13gets a Rich Results Test warning and sometimes triggers indexer issues. - Relative URLs in
urlorlogo. schema.org expects absolute URLs. Always include the full origin. - Duplicate blocks. Yoast emits Article schema and you add another by hand. Two blocks → two conflicting facts → the parser picks one arbitrarily.
- JSON typos. Trailing commas, mismatched quotes, unescaped special chars in strings. The block silently fails to parse and your schema is invisible.
How to verify it actually works
Four quick checks, in order:
- View source. Open the rendered HTML in the browser, search for
application/ld+json. Confirm the block is present and the JSON is valid (no trailing commas, no unescaped quotes). - Google Rich Results Test. search.google.com/test/rich-results — paste a URL, see which schemas Google detected and whether they are valid. The single most reliable check.
- Schema.org validator. validator.schema.org — broader coverage than Google's tool. Catches property-type mismatches Google ignores.
- Run a free AI audit. Schema is necessary but not sufficient. To know whether the markup actually affects how AI engines cite your brand, measure it on a buyer-question panel. Free 60-second audit.