Schema.org Implementation for AI Discovery
Complete guide to adding structured data that enables AI agents to understand your website's content, entities, and relationships.
Why Schema.org Matters for AI
When an AI agent lands on your website, it faces a challenge: How does it understand what this page is about?
Without Schema.org:
- Agent must parse HTML and guess structure
- Natural language processing required (slow, error-prone)
- Inconsistent interpretation across different AI models
- Key relationships may be missed or misunderstood
With Schema.org:
- ✅ Agent reads structured JSON with explicit entity types
- ✅ Instant understanding of page purpose and content
- ✅ Consistent interpretation across all AI systems
- ✅ Relationships clearly defined (memberOf, author, publisher, etc.)
Digital Karma Impact
Schema.org coverage accounts for 20% of your Digital Karma Score — the single largest signal. Sites with comprehensive Schema.org markup rank significantly higher in AI trust assessments.
Schema.org Basics
What is Schema.org?
Schema.org is a collaborative, community-driven vocabulary for structured data on the Internet. Created by Google, Microsoft, Yahoo, and Yandex, it provides a shared language for describing entities and their relationships.
JSON-LD Format
The recommended format for Schema.org is JSON-LD (JavaScript Object Notation for Linked Data).
Why JSON-LD?
- ✅ Clean separation from HTML markup
- ✅ Easy to generate programmatically
- ✅ Human-readable and maintainable
- ✅ Can be embedded in
<script>tags or external files - ✅ Preferred by Google, AI agents, and knowledge graphs
Basic Structure
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "EntityType",
"propertyName": "propertyValue",
"anotherProperty": {
"@type": "NestedEntityType",
"nestedProperty": "value"
}
}
</script>
Key components:
@context— Always "https://schema.org" for Schema.org vocabulary@type— The entity type (Organization, Article, Product, etc.)- Properties — Attributes defined by Schema.org for that type
@id— Optional unique identifier (usually a URL)
Essential Entity Types
1. Organization
Use for: Your business, project, or entity identity.
Where: Homepage, About page
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://www.aiwebsitesystems.com/#organization",
"name": "AI Website Systems",
"url": "https://www.aiwebsitesystems.com",
"logo": {
"@type": "ImageObject",
"url": "https://www.aiwebsitesystems.com/img/logo.png",
"width": 200,
"height": 60
},
"description": "Comprehensive directory of AI-native website platforms",
"foundingDate": "2024",
"email": "hello@aiwebsitesystems.com",
"sameAs": [
"https://twitter.com/aiwebsitesystems",
"https://github.com/aiwebsitesystems"
],
"memberOf": {
"@type": "Organization",
"@id": "https://www.aiwebsitesystems.com/federation-registry.html#federation",
"name": "Digital Karma Web Federation",
"url": "https://www.aiwebsitesystems.com/federation-registry.html"
}
}
</script>
Important properties:
@id— Unique identifier (use URL + #organization)name— Official organization nameurl— Homepage URLlogo— Brand logo (recommended)description— Brief organizational descriptionsameAs— Social media profiles, external profilesmemberOf— Federation or network membership
2. WebSite
Use for: Site-level metadata and search functionality.
Where: Homepage
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"@id": "https://www.aiwebsitesystems.com/#website",
"name": "AI Website Systems",
"url": "https://www.aiwebsitesystems.com",
"description": "The knowledge base for AI-native web infrastructure",
"publisher": {
"@id": "https://www.aiwebsitesystems.com/#organization"
},
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.aiwebsitesystems.com/directory-page.html?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
</script>
Key features:
potentialAction— Enables Google/AI search functionalitypublisher— References your Organization entity- Helps AI agents understand site-wide navigation
3. WebPage
Use for: Individual page context.
Where: Every page on your site
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https://www.aiwebsitesystems.com/about.html#webpage",
"url": "https://www.aiwebsitesystems.com/about.html",
"name": "About AI Website Systems",
"description": "Learn about our mission to build AI-native web infrastructure",
"isPartOf": {
"@id": "https://www.aiwebsitesystems.com/#website"
},
"about": {
"@id": "https://www.aiwebsitesystems.com/#organization"
},
"datePublished": "2024-01-01T00:00:00Z",
"dateModified": "2026-03-05T10:00:00Z",
"inLanguage": "en-US"
}
</script>
4. Article
Use for: Blog posts, articles, knowledge base entries.
Where: All editorial content
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://www.aiwebsitesystems.com/knowledge-base/what-is-ai-website-system.html#article",
"headline": "What is an AI Website System?",
"description": "Complete guide to AI-native website architecture",
"url": "https://www.aiwebsitesystems.com/knowledge-base/what-is-ai-website-system.html",
"author": {
"@type": "Organization",
"@id": "https://www.aiwebsitesystems.com/#organization"
},
"publisher": {
"@type": "Organization",
"@id": "https://www.aiwebsitesystems.com/#organization"
},
"datePublished": "2026-02-10T10:00:00Z",
"dateModified": "2026-03-05T09:00:00Z",
"articleSection": "Getting Started",
"keywords": ["AI website", "machine-readable", "federation"],
"wordCount": 2500,
"inLanguage": "en-US"
}
</script>
5. SoftwareApplication
Use for: Tools, platforms, applications in your directory.
Where: Product/system pages
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"@id": "https://www.aiwebsitesystems.com/directory-page.html#digital-karma-static",
"name": "Digital Karma Static Sites",
"applicationCategory": "WebApplication",
"description": "Federation v6.1 compliant static site generator",
"url": "https://example.com",
"operatingSystem": "Cross-platform",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "0.92",
"ratingCount": "1",
"bestRating": "1.0",
"worstRating": "0.0"
},
"featureList": [
"Federation v6.1 endpoints",
"Schema.org markup",
"Static file generation"
]
}
</script>
6. ItemList / CollectionPage
Use for: Directories, catalogs, listings.
Where: Directory pages, category pages
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "CollectionPage",
"name": "AI Website Systems Directory",
"description": "Comprehensive catalog of 47 AI-native platforms",
"url": "https://www.aiwebsitesystems.com/directory-page.html",
"mainEntity": {
"@type": "ItemList",
"numberOfItems": 47,
"itemListElement": [
{
"@type": "SoftwareApplication",
"position": 1,
"name": "Digital Karma Static Sites",
"url": "https://example.com"
},
{
"@type": "SoftwareApplication",
"position": 2,
"name": "Joomla Federation Edition",
"url": "https://example2.com"
}
]
}
}
</script>
Advanced Patterns
1. Graph Structure (@id References)
Use @id to reference entities across pages, creating a knowledge graph.
Homepage (defines Organization):
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://yoursite.com/#organization",
"name": "Your Company"
}
About page (references Organization):
{
"@context": "https://schema.org",
"@type": "WebPage",
"about": {
"@id": "https://yoursite.com/#organization"
}
}
AI agents can now understand that the About page describes the same Organization entity defined on the homepage.
2. Multiple Entity Types (@graph)
Define multiple entities in one JSON-LD block:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://yoursite.com/#organization",
"name": "Your Company"
},
{
"@type": "WebSite",
"@id": "https://yoursite.com/#website",
"name": "Your Site",
"publisher": {
"@id": "https://yoursite.com/#organization"
}
},
{
"@type": "WebPage",
"isPartOf": {
"@id": "https://yoursite.com/#website"
},
"about": {
"@id": "https://yoursite.com/#organization"
}
}
]
}
</script>
3. Breadcrumbs
Help AI agents understand site hierarchy:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://yoursite.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Knowledge Base",
"item": "https://yoursite.com/knowledge-base"
},
{
"@type": "ListItem",
"position": 3,
"name": "Schema.org Guide"
}
]
}
Implementation Workflow
Step 1: Entity Audit
Map out the entities on your site:
- What is your primary entity? (Organization, Person, Product)
- What content types do you have? (Articles, Products, Services, Events)
- What relationships exist? (Author → Article, Organization → Product)
Step 2: Choose Templates
Select appropriate Schema.org types for each page:
- Homepage → Organization + WebSite
- About → WebPage + Organization details
- Blog posts → Article
- Product pages → Product or SoftwareApplication
- Directory → ItemList + CollectionPage
Step 3: Generate JSON-LD
Manual method: Copy templates, fill in your data
Programmatic method: Generate from your content management system
Python example:
def generate_article_jsonld(article):
return {
"@context": "https://schema.org",
"@type": "Article",
"@id": f"{article['url']}#article",
"headline": article['title'],
"description": article['description'],
"author": {
"@type": "Organization",
"@id": "https://yoursite.com/#organization"
},
"datePublished": article['created_at'],
"dateModified": article['updated_at']
}
Step 4: Embed in HTML
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
<!-- Schema.org JSON-LD -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Your Article Title"
}
</script>
</head>
<body>
...
</body>
</html>
Step 5: Validate
Use validation tools:
- Google Rich Results Test: search.google.com/test/rich-results
- Schema.org Validator: validator.schema.org
- JSON-LD Playground: json-ld.org/playground
Step 6: Monitor Coverage
Track how many pages have Schema.org markup:
# Check schema coverage
grep -r "application/ld+json" . --include="*.html" | wc -l
# Or use Python
import os
from pathlib import Path
html_files = list(Path('.').rglob('*.html'))
with_schema = sum(1 for f in html_files if 'application/ld+json' in f.read_text())
coverage = with_schema / len(html_files) * 100
print(f"Schema.org coverage: {coverage:.1f}%")
Best Practices
✅ Do's
- ✅ Use
@idto create entity references across pages - ✅ Include all required properties for your chosen type
- ✅ Use ISO 8601 format for dates (2026-03-05T10:00:00Z)
- ✅ Provide URLs as absolute paths (https://...)
- ✅ Validate with Google Rich Results Test
- ✅ Keep JSON-LD in
<head>or near top of<body> - ✅ Use specific types (Article) over generic types (CreativeWork)
- ✅ Add multiple JSON-LD blocks for different entities
❌ Don'ts
- ❌ Don't mark up content that isn't on the page
- ❌ Don't use Schema.org types for SEO keyword stuffing
- ❌ Don't mix formats (JSON-LD + Microdata + RDFa)
- ❌ Don't forget to update timestamps when content changes
- ❌ Don't use relative URLs in Schema.org
- ❌ Don't duplicate entity definitions with different @ids
Common Mistakes
1. Missing @context
❌ Wrong:
{ "@type": "Organization", "name": "Company" }
✅ Correct:
{ "@context": "https://schema.org", "@type": "Organization", "name": "Company" }
2. Inconsistent @id References
❌ Wrong:
// Page 1
{ "@id": "https://site.com/#org" }
// Page 2 (different ID)
{ "@id": "https://site.com/#organization" }
✅ Correct: Use the same @id across all pages
3. Relative URLs
❌ Wrong:
{ "url": "/about.html" }
✅ Correct:
{ "url": "https://yoursite.com/about.html" }
4. Invalid Date Formats
❌ Wrong:
{ "datePublished": "March 5, 2026" }
✅ Correct:
{ "datePublished": "2026-03-05T10:00:00Z" }
Template Library
Ready-to-use templates for common scenarios:
Homepage Template
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://YOURSITE.com/#organization",
"name": "YOUR ORGANIZATION NAME",
"url": "https://YOURSITE.com",
"logo": "https://YOURSITE.com/logo.png",
"description": "YOUR DESCRIPTION",
"sameAs": [
"https://twitter.com/YOURHANDLE",
"https://github.com/YOURHANDLE"
]
},
{
"@type": "WebSite",
"@id": "https://YOURSITE.com/#website",
"name": "YOUR SITE NAME",
"url": "https://YOURSITE.com",
"publisher": {
"@id": "https://YOURSITE.com/#organization"
}
}
]
}
</script>
Article Template
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "ARTICLE TITLE",
"description": "ARTICLE DESCRIPTION",
"url": "https://YOURSITE.com/article.html",
"author": {
"@type": "Organization",
"@id": "https://YOURSITE.com/#organization"
},
"publisher": {
"@type": "Organization",
"@id": "https://YOURSITE.com/#organization"
},
"datePublished": "2026-03-05T10:00:00Z",
"dateModified": "2026-03-05T10:00:00Z"
}
</script>
Download full template library: schema-templates.zip
Next Steps
- Audit your website entities and content types
- Choose appropriate Schema.org types for each page
- Generate JSON-LD using templates above
- Embed in HTML
<head>sections - Validate with Google Rich Results Test
- Calculate your Digital Karma Score (Schema Coverage signal)
- Submit to federation: Join Now