A practical guide to Schema.org JSON-LD: what to mark up, examples, validation steps, and common mistakes for AI and search visibility.
Structured data is one of those topics that sounds more complicated than it is. At its core, it's just a way to tell machines "this is who we are, this is what this page is about."
We've seen sites add basic Schema.org markup in an afternoon and see immediate improvements in how AI systems represent them. It's not magic, but it removes guesswork.
If you're short on time:
Organization, WebSite, and BreadcrumbListArticle or BlogPosting to your blog postsWhat structured data can actually do for you:
What it won't do:
New to all this? Start here: What is AI-readiness?.
Think about it from the AI's perspective. It's processing millions of pages, trying to figure out:
Without structured data, AI has to guess. With it, you're giving explicit answers. We've found that sites with good schema tend to be represented more accurately in AI responses—fewer "hallucinated" company descriptions, correct product names, right dates.
There are technically three ways to add structured data (JSON-LD, Microdata, RDFa), but everyone recommends JSON-LD these days. Why? It lives in a <script> tag, separate from your HTML. Cleaner, easier to maintain, harder to break.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Example Company",
"url": "https://example.com"
}
</script>
You don't need to implement everything Schema.org offers. Here's what we recommend starting with—and what we use on this site.
This is your "who we are" markup. Put it on your homepage, or better yet, include it globally.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Example Company",
"url": "https://example.com",
"logo": "https://example.com/logo.png"
}
Tells machines "this is a website, here's its name." You can add SearchAction if you have site search, but don't fake it—only add it if there's a real, crawlable search URL.
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Example Site",
"url": "https://example.com"
}
This one's underrated. It tells AI exactly where a page sits in your site hierarchy. We add this to every page.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Blog",
"item": "https://example.com/blog"
},
{
"@type": "ListItem",
"position": 2,
"name": "Structured Data",
"item": "https://example.com/blog/structured-data-for-ai"
}
]
}
For blog posts and articles. The key fields are headline, author, and dates. This is what you're reading right now—and yes, we have BlogPosting schema on this page.
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Structured Data for AI: A Practical Guide",
"description": "A practical guide to Schema.org JSON-LD.",
"author": {
"@type": "Organization",
"name": "Example Team"
},
"datePublished": "2025-01-21",
"dateModified": "2025-01-21"
}
FAQ schema can get you those expandable FAQ rich results in Google. But here's the catch: the questions and answers must be visible on the page. If you mark up hidden content, that's a spam signal.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is AI-readiness?",
"acceptedAnswer": {
"@type": "Answer",
"text": "AI-readiness is how well AI systems can access and understand your website."
}
}
]
}
We started with just Organization and WebSite. Added the rest over time. You don't need perfect schema on day one.
This is important: only mark up information that is:
Google explicitly warns against marking up invisible content.
The most common mistake we see? Outdated schema. Someone added it once, then changed the page content but forgot to update the JSON-LD. Now the schema says one thing and the page says another.
Invisible content markup If users can't see it, don't mark it up. Google treats this as spam.
Stale data That product price from 2023? That event date from last year? Update or remove it.
Broken nesting Schema has relationships—author belongs to article, article belongs to website. Mess up the nesting and it all falls apart.
Copy-paste without customizing We've seen sites with "example.com" still in their schema. Check your URLs.
Before you ship, validate:
We run all three whenever we add new schema.
Not a silver bullet, but one of the easiest wins for AI Visibility.