Complete blog schema reference skill
- Schema Types: Use Only When Eligible
by AgriciDaniel·MIT license·★ 2,219 Stars on the repo·GitHub ↗
Files of Complete blog schema reference
AgriciDaniel/
Show the full text723 lines
Complete Blog Schema Reference
Contents
- Why Schema Matters
- BlogPosting Schema
- Person Schema
- Organization Schema
- BreadcrumbList Schema
- FAQPage Schema
- ImageObject Schema
- VideoObject Schema
- Speakable Schema
- Stable @id Patterns
- Schema Types: Use Only When Eligible
- ProfilePage Schema (Author Pages)
- JSON-LD @graph Pattern
- Schema Validation Checklist
Why Schema Matters
Article schema with author Person, publisher Organization, and BreadcrumbList is the priority schema family for blog content in 2026. FAQ and HowTo rich results are no longer broadly available for general blog content, so standard article entities carry more of the SEO and AI-citation load. Complete schema graphs may increase AI citation likelihood, but exact lifts are directional and unverified. Schema must appear in HTML source, not injected via JavaScript, because most AI crawlers do not execute JS.
Still rich-result-eligible for eligible blog content in 2026: Article, BreadcrumbList, Video, Product, Review, and Event. FAQPage and HowTo remain valid schema.org types, but general blogs should not expect FAQ or HowTo visual rich results.
BlogPosting Schema
The priority schema family for every blog post is Article. BlogPosting remains
acceptable as an Article-family implementation, but the required shape is the
same: author Person, publisher Organization, dates, headline, and canonical page
metadata in a single structured entity.
Full Property Reference
Note: Google states "there are no required properties" for Article or
BlogPosting structured data. All properties below are recommended. @context
and @type are required by the JSON-LD spec itself.
| Property | Status | Type | Description |
|---|---|---|---|
@context |
JSON-LD required | URL | Always "https://schema.org" |
@type |
JSON-LD required | String | "Article" or "BlogPosting" |
@id |
Recommended | URI | Stable identifier: {siteUrl}/blog/{slug}#article |
headline |
Recommended | String | Post title, max 110 characters |
description |
Recommended | String | Meta description, 150-160 characters |
datePublished |
Recommended | ISO 8601 | Original publish date |
dateModified |
Recommended | ISO 8601 | Last content update date |
author |
Recommended | Person | Author entity (use @id reference) |
publisher |
Recommended | Organization | Site/company entity (use @id reference) |
image |
Recommended | ImageObject or URL | Featured image, min 1200x630px |
mainEntityOfPage |
Recommended | WebPage | The page URL |
wordCount |
Recommended | Integer | Total word count of article body |
articleSection |
Recommended | String | Category/topic (e.g., "SEO") |
keywords |
Recommended | String or Array | Comma-separated or array of keywords |
inLanguage |
Recommended | String | BCP 47 language code (e.g., "en-US") |
url |
Recommended | URL | Canonical URL of the post |
thumbnailUrl |
Optional | URL | Smaller preview image |
articleBody |
Optional | String | Full text (usually omitted for size) |
Complete Article/BlogPosting Example
{
"@context": "https://schema.org",
"@type": "Article",
"@id": "https://example.com/blog/technical-seo-guide#article",
"headline": "Complete Guide to Technical SEO in 2026",
"description": "Technical SEO has evolved beyond Core Web Vitals. 72% of top-ranking pages now use structured data. Here's how to optimize your site for both traditional search and AI systems.",
"datePublished": "2026-01-15T08:00:00Z",
"dateModified": "2026-02-10T14:30:00Z",
"author": {
"@id": "https://example.com/author/sarah-chen#person"
},
"publisher": {
"@id": "https://example.com#organization"
},
"image": {
"@type": "ImageObject",
"url": "https://example.com/images/blog/technical-seo-guide.jpg",
"width": 1200,
"height": 630,
"caption": "Technical SEO optimization workflow diagram"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/technical-seo-guide"
},
"wordCount": 3200,
"articleSection": "SEO",
"keywords": ["technical SEO", "structured data", "Core Web Vitals", "schema markup"],
"inLanguage": "en-US"
}
Person Schema
Used for author attribution in BlogPosting and on dedicated author pages.
Full Property Reference
| Property | Required | Type | Description |
|---|---|---|---|
@type |
Yes | String | Always "Person" |
@id |
Yes | URI | Stable: {siteUrl}/author/{slug}#person |
name |
Yes | String | Full name |
jobTitle |
Yes | String | Current professional title |
url |
Yes | URL | Author page URL |
image |
Yes | URL | Professional headshot |
sameAs |
Yes | Array | Social profile URLs (LinkedIn, Twitter, GitHub, personal site) |
worksFor |
Recommended | Organization | Current employer |
alumniOf |
Optional | CollegeOrUniversity | Educational background |
description |
Recommended | String | Brief professional bio |
knowsAbout |
Optional | Array | Expertise topics |
Complete Person Example
{
"@type": "Person",
"@id": "https://example.com/author/sarah-chen#person",
"name": "Sarah Chen",
"jobTitle": "Content Strategist",
"url": "https://example.com/author/sarah-chen",
"image": "https://example.com/images/authors/sarah-chen.jpg",
"description": "Content strategist with 8 years of experience in B2B SaaS, specializing in data-driven blog optimization.",
"sameAs": [
"https://linkedin.com/in/sarahchen",
"https://twitter.com/sarahchen",
"https://sarahchen.com"
],
"worksFor": {
"@type": "Organization",
"name": "Example Corp",
"url": "https://example.com"
},
"alumniOf": {
"@type": "CollegeOrUniversity",
"name": "UC Berkeley"
},
"knowsAbout": ["SEO", "Content Strategy", "B2B SaaS Marketing"]
}
Organization Schema
Represents the publishing entity. Referenced by every BlogPosting via the
publisher property.
Full Property Reference
| Property | Required | Type | Description |
|---|---|---|---|
@type |
Yes | String | "Organization" or "LocalBusiness" |
@id |
Yes | URI | Stable: {siteUrl}#organization |
name |
Yes | String | Company/brand name |
url |
Yes | URL | Homepage URL |
logo |
Yes | ImageObject | Company logo (min 112x112px, max 600px wide) |
sameAs |
Recommended | Array | Social media profile URLs |
contactPoint |
Recommended | ContactPoint | Support/contact info |
description |
Optional | String | Brief company description |
founder |
Optional | Person | Company founder |
foundingDate |
Optional | Date | When the company was founded |
Complete Organization Example
{
"@type": "Organization",
"@id": "https://example.com#organization",
"name": "Example Corp",
"url": "https://example.com",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/images/logo.png",
"width": 300,
"height": 60
},
"sameAs": [
"https://twitter.com/examplecorp",
"https://linkedin.com/company/examplecorp",
"https://github.com/examplecorp"
],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer support",
"email": "[email protected]",
"url": "https://example.com/contact"
}
}
BreadcrumbList Schema
Provides navigation hierarchy to search engines and AI systems. Improves how pages appear in search results and helps crawlers understand site structure.
ItemListElement Pattern
Each breadcrumb item requires @type, position, name, and item (URL).
Complete BreadcrumbList Example
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://example.com/blog"
},
{
"@type": "ListItem",
"position": 3,
"name": "SEO",
"item": "https://example.com/blog/category/seo"
},
{
"@type": "ListItem",
"position": 4,
"name": "Complete Guide to Technical SEO in 2026",
"item": "https://example.com/blog/technical-seo-guide"
}
]
}
Rules
- Always start with Home (position 1)
- Include category/topic level if applicable
- Final item is the current page
- Positions must be sequential integers starting at 1
- Every item except the last must have an
itemURL
FAQPage Schema
Important: Google reduced FAQ rich-result visibility in August 2023, primarily showing it only for well-known, authoritative government and health sites. General blogs should not expect FAQ rich results. This is rich-result eligibility guidance, not a statement that FAQPage schema is invalid.
However, the markup can remain as optional entity support: LLMs parse your page's visible FAQ text, and Q&A-formatted content can improve extractability for citation. Google says there is "no need to proactively remove" existing FAQPage markup and it "does not cause problems for Search." Implement for AI/LLM entity value only, not rich results.
Structure
FAQPage
└── mainEntity (array)
└── Question
├── name (the question text)
└── acceptedAnswer
└── Answer
└── text (the answer text, 40-60 words)
Complete FAQPage Example
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How does technical SEO affect AI visibility?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Technical SEO directly determines whether AI crawlers can access and extract your content. Since AI crawlers do not execute JavaScript, server-side rendered HTML with structured data markup is essential. Sites with proper technical SEO and accessible content structure are significantly more likely to earn AI citations."
}
},
{
"@type": "Question",
"name": "What is the most important schema type for blog posts?",
"acceptedAnswer": {
"@type": "Answer",
"text": "BlogPosting schema is the foundation for blog content. It provides structured metadata about the article including author, dates, and content classification. Combined with Person and Organization schemas, it creates a complete entity graph that search engines and AI systems use to evaluate content authority."
}
},
{
"@type": "Question",
"name": "Do AI search engines use schema markup?",
"acceptedAnswer": {
"@type": "Answer",
"text": "AI search engines can use schema markup to identify entities and relationships, but exact citation lifts are unverified. For blogs in 2026, prioritize Article or BlogPosting, Person author, Organization publisher, and BreadcrumbList. Add FAQPage only for visible Q&A entity support, not Google rich results."
}
}
]
}
Guidelines
- 3-5 FAQ items per page (not excessive)
- Answers should be 40-60 words (concise, extractable)
- Questions should match real user queries (People Also Ask style)
- Do not duplicate content already in the main article body
- Each answer should be self-contained and useful without context
ImageObject Schema
Used within BlogPosting for featured images and inline article images.
Properties
| Property | Required | Type | Description |
|---|---|---|---|
@type |
Yes | String | "ImageObject" |
url |
Yes | URL | Full image URL |
width |
Yes | Integer | Width in pixels |
height |
Yes | Integer | Height in pixels |
caption |
Recommended | String | Descriptive caption |
creditText |
Recommended | String | Photographer or source credit |
copyrightHolder |
Optional | Person/Organization | Rights holder |
license |
Optional | URL | Link to license (e.g., Creative Commons) |
Complete ImageObject Example
{
"@type": "ImageObject",
"url": "https://example.com/images/blog/seo-workflow-diagram.jpg",
"width": 1200,
"height": 630,
"caption": "Technical SEO audit workflow showing the 7-step process from crawl analysis to implementation",
"creditText": "Example Corp Design Team",
"copyrightHolder": {
"@type": "Organization",
"name": "Example Corp"
}
}
VideoObject Schema
Used for YouTube videos embedded in blog posts. YouTube has the strongest AI visibility correlation (0.737). Each embedded video gets its own VideoObject.
Properties
| Property | Required | Type | Description |
|---|---|---|---|
@type |
Yes | String | "VideoObject" |
@id |
Yes | URI | {siteUrl}/blog/{slug}#video-{index} |
name |
Yes | String | Video title |
description |
Yes | String | First 200 chars of video description |
thumbnailUrl |
Yes | URL | https://img.youtube.com/vi/{id}/hqdefault.jpg |
uploadDate |
Yes | ISO 8601 | Video publish date |
contentUrl |
Yes | URL | https://www.youtube.com/watch?v={id} |
embedUrl |
Yes | URL | https://www.youtube.com/embed/{id} |
duration |
Recommended | ISO 8601 | Duration (e.g., PT10M30S) |
interactionStatistic |
Recommended | InteractionCounter | View count |
publisher |
Optional | Organization | Channel name and URL |
Complete VideoObject Example
{
"@type": "VideoObject",
"@id": "https://example.com/blog/seo-guide#video-1",
"name": "Complete Guide to Technical SEO in 2026",
"description": "Learn the essential technical SEO strategies for 2026 including Core Web Vitals optimization, structured data, and AI search readiness.",
"thumbnailUrl": "https://img.youtube.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
"uploadDate": "2026-01-20T00:00:00Z",
"contentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ",
"duration": "PT12M45S",
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": { "@type": "WatchAction" },
"userInteractionCount": 25000
}
}
Guidelines
- Only generate for YouTube videos actually embedded in the post
- Use
#video-1,#video-2for sequential @id fragments - Duration must be ISO 8601 format (PT prefix, M for minutes, S for seconds)
- Extract metadata from embed noscript text or YouTube Data API
Speakable Schema
Speakable support is limited and should not be a default schema recommendation for normal blog pages. Use it only when the target surface explicitly supports Speakable markup and the selected text is visible on the page.
Implementation Options
Use cssSelector (preferred) or xPath to identify speakable content sections.
Speakable Example with CSS Selectors
{
"@type": "WebPage",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [
".article-summary",
".faq-answer",
"h1",
".key-takeaway"
]
}
}
Speakable Example with XPath
{
"@type": "WebPage",
"speakable": {
"@type": "SpeakableSpecification",
"xPath": [
"/html/head/title",
"/html/body//article/p[1]",
"/html/body//div[@class='key-takeaway']"
]
}
}
Guidelines
- Point to concise, self-contained text sections
- Ideal sections: article summaries, FAQ answers, key takeaways
- Avoid pointing to entire articles (too long for voice)
- Each speakable section should be under 2-3 sentences
- Content must make sense when read aloud without visual context
Stable @id Patterns
Every schema entity needs a stable, unique @id that remains consistent across
page loads and site rebuilds. This allows search engines to build entity graphs
and AI systems to deduplicate references.
Standard Patterns
| Entity | @id Pattern | Example |
|---|---|---|
| Blog Post | {siteUrl}/blog/{slug}#article |
https://example.com/blog/seo-guide#article |
| Author | {siteUrl}/author/{slug}#person |
https://example.com/author/sarah-chen#person |
| Organization | {siteUrl}#organization |
https://example.com#organization |
| WebPage | {siteUrl}/blog/{slug} |
https://example.com/blog/seo-guide |
| BreadcrumbList | {siteUrl}/blog/{slug}#breadcrumb |
https://example.com/blog/seo-guide#breadcrumb |
| FAQPage | {siteUrl}/blog/{slug}#faq |
https://example.com/blog/seo-guide#faq |
| VideoObject | {siteUrl}/blog/{slug}#video-{N} |
https://example.com/blog/seo-guide#video-1 |
Rules
- Use the fragment identifier (
#) to differentiate entities on the same page - Never use random IDs, timestamps, or build hashes
- Keep patterns consistent across every page on the site
- The URL portion must match the canonical URL
- Use
@idreferences to link entities instead of embedding duplicates
Referencing by @id
Instead of embedding a full Person object in every BlogPosting, reference the @id and define the Person once in the @graph:
"author": {
"@id": "https://example.com/author/sarah-chen#person"
}
Schema Types: Use Only When Eligible
These entries separate Google rich-result eligibility from schema.org validity. Using unsupported rich-result markup does not cause penalties, but it can waste implementation effort and may trigger validation warnings. FAQPage is different: the markup can remain for visible Q&A entity support even when a general blog is not eligible for FAQ rich results.
| Type | Deprecated | Date | Notes |
|---|---|---|---|
| HowTo | Rich result not broadly available | 2023 | Use visible step content plus Article schema for general blogs |
| SpecialAnnouncement | Watch item | Unknown | Use only when a primary Google source confirms support for the target page |
| ClaimReview | Rich-result simplification | 2025 | Use only for eligible fact-check content with clear methodology |
| Practice Problem | Watch item | Unknown | Use only for eligible education pages |
| Dataset | Valid schema, specialized surface | Unknown | Use for actual datasets; do not mark ordinary articles as Dataset |
| Sitelinks Search Box | Not recommended for blogs | Unknown | Google generally generates sitelinks algorithmically |
| Q&A | Valid for community Q&A where appropriate | Unknown | Do not use for editorial FAQ pages; use FAQPage for visible editorial Q&A |
What to Use Instead
| Deprecated Type | Alternative |
|---|---|
| HowTo | Use standard Article or BlogPosting with clear step headings (H2/H3) |
| Q&A | Use FAQPage for editorial Q&A; no replacement for community Q&A |
| SpecialAnnouncement | Use standard Article or NewsArticle |
| ClaimReview | No direct replacement for blogs; use Author entity with credentials |
ProfilePage Schema (Author Pages)
Supported in 2026. Add to author bio/team pages to strengthen E-E-A-T signals and improve eligibility for author entity understanding.
{
"@context": "https://schema.org",
"@type": "ProfilePage",
"dateCreated": "2024-01-01T00:00:00Z",
"dateModified": "2026-04-01T00:00:00Z",
"mainEntity": {
"@type": "Person",
"@id": "https://example.com/author/jane-smith#person",
"name": "Jane Smith",
"url": "https://example.com/author/jane-smith",
"jobTitle": "Senior Content Strategist",
"description": "Jane writes about SEO and content marketing with 8 years of experience.",
"image": {
"@type": "ImageObject",
"url": "https://example.com/images/jane-smith.jpg"
},
"sameAs": [
"https://linkedin.com/in/janesmith",
"https://twitter.com/janesmith"
]
}
}
JSON-LD @graph Pattern
Combine all schema entities in a single <script type="application/ld+json">
tag using the @graph array. This is the recommended approach for pages with
multiple schema types.
Benefits
- Single script tag instead of multiple scattered blocks
- Entities reference each other via
@id - Easier to maintain and validate
- Cleaner HTML source
Complete @graph Example (Blog Post Page)
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com#organization",
"name": "Example Corp",
"url": "https://example.com",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/images/logo.png",
"width": 300,
"height": 60
},
"sameAs": [
"https://twitter.com/examplecorp",
"https://linkedin.com/company/examplecorp"
]
},
{
"@type": "Person",
"@id": "https://example.com/author/sarah-chen#person",
"name": "Sarah Chen",
"jobTitle": "Content Strategist",
"url": "https://example.com/author/sarah-chen",
"image": "https://example.com/images/authors/sarah-chen.jpg",
"sameAs": [
"https://linkedin.com/in/sarahchen",
"https://twitter.com/sarahchen"
],
"worksFor": {
"@id": "https://example.com#organization"
}
},
{
"@type": "Article",
"@id": "https://example.com/blog/technical-seo-guide#article",
"headline": "Complete Guide to Technical SEO in 2026",
"description": "Technical SEO has evolved beyond Core Web Vitals. 72% of top-ranking pages now use structured data. Here's how to optimize your site for both traditional search and AI systems.",
"datePublished": "2026-01-15T08:00:00Z",
"dateModified": "2026-02-10T14:30:00Z",
"author": {
"@id": "https://example.com/author/sarah-chen#person"
},
"publisher": {
"@id": "https://example.com#organization"
},
"image": {
"@type": "ImageObject",
"url": "https://example.com/images/blog/technical-seo-guide.jpg",
"width": 1200,
"height": 630,
"caption": "Technical SEO optimization workflow diagram"
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/technical-seo-guide"
},
"wordCount": 3200,
"articleSection": "SEO",
"keywords": ["technical SEO", "structured data", "schema markup"],
"inLanguage": "en-US"
},
{
"@type": "BreadcrumbList",
"@id": "https://example.com/blog/technical-seo-guide#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://example.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://example.com/blog"
},
{
"@type": "ListItem",
"position": 3,
"name": "Complete Guide to Technical SEO in 2026",
"item": "https://example.com/blog/technical-seo-guide"
}
]
},
{
"@type": "FAQPage",
"@id": "https://example.com/blog/technical-seo-guide#faq",
"mainEntity": [
{
"@type": "Question",
"name": "How does technical SEO affect AI visibility?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Technical SEO directly determines whether AI crawlers can access and extract your content. Server-side rendered HTML with structured data is essential since AI crawlers do not execute JavaScript."
}
},
{
"@type": "Question",
"name": "What schema types should every blog post have?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Every blog post should have Article or BlogPosting, Person author, Organization publisher, and BreadcrumbList schemas at minimum. Add FAQPage only for visible Q&A content and AI citation support, not Google rich results."
}
}
]
}
]
}
Schema Validation Checklist
| Check | Pass | Fail |
|---|---|---|
| JSON-LD in HTML source (not JS-injected) | In <head> or <body> tag |
Loaded via JavaScript |
| Valid JSON syntax | Passes JSON.parse() | Syntax errors |
@context is https://schema.org |
Exact match | Missing or HTTP |
| @id uses stable fragment pattern | Consistent across builds | Random or missing |
| dateModified matches actual update | Within 24 hours of last edit | Stale or fabricated |
| Author @id matches author page | Same URI used everywhere | Inconsistent references |
| Image URLs are absolute | Start with https:// |
Relative paths |
| Eligibility checked for optional types | Type is valid for the visible content and target surface | Ineligible rich-result markup used as a default |
| Complete schema graph per page | Article/BlogPosting + Person + Organization + BreadcrumbList minimum | Missing priority entity baseline |
| Validates in the right tool | Schema.org Validator for schema validity; Rich Results Test only for eligible Google rich-result types | Errors present |
Validation Tools
- Schema.org Validator: https://validator.schema.org
- Google Rich Results Test: https://search.google.com/test/rich-results for eligible Google rich-result types
- JSON-LD Playground: https://json-ld.org/playground/
| 1 | # Complete Blog Schema Reference |
| 2 | |
| 3 | ## Contents |
| 4 | |
| 5 | [Why Schema Matters] |
| 6 | [BlogPosting Schema] |
| 7 | [Person Schema] |
| 8 | [Organization Schema] |
| 9 | [BreadcrumbList Schema] |
| 10 | [FAQPage Schema] |
| 11 | [ImageObject Schema] |
| 12 | [VideoObject Schema] |
| 13 | [Speakable Schema] |
| 14 | [Stable @id Patterns] |
| 15 | [Schema Types: Use Only When Eligible] |
| 16 | [ProfilePage Schema (Author Pages)] |
| 17 | [JSON-LD @graph Pattern] |
| 18 | [Schema Validation Checklist] |
| 19 | |
| 20 | ## Why Schema Matters |
| 21 | |
| 22 | Article schema with author Person, publisher Organization, and BreadcrumbList |
| 23 | is the priority schema family for blog content in 2026. FAQ and HowTo rich |
| 24 | results are no longer broadly available for general blog content, so standard |
| 25 | article entities carry more of the SEO and AI-citation load. Complete schema |
| 26 | graphs may increase AI citation likelihood, but exact lifts are directional and |
| 27 | unverified. Schema must appear in HTML source, not injected via JavaScript, |
| 28 | because most AI crawlers do not execute JS. |
| 29 | |
| 30 | Still rich-result-eligible for eligible blog content in 2026: Article, |
| 31 | BreadcrumbList, Video, Product, Review, and Event. FAQPage and HowTo remain |
| 32 | valid schema.org types, but general blogs should not expect FAQ or HowTo visual |
| 33 | rich results. |
| 34 | |
| 35 | |
| 36 | |
| 37 | ## BlogPosting Schema |
| 38 | |
| 39 | The priority schema family for every blog post is Article. `BlogPosting` remains |
| 40 | acceptable as an Article-family implementation, but the required shape is the |
| 41 | same: author Person, publisher Organization, dates, headline, and canonical page |
| 42 | metadata in a single structured entity. |
| 43 | |
| 44 | ### Full Property Reference |
| 45 | |
| 46 | **Note:** Google states "there are no required properties" for Article or |
| 47 | BlogPosting structured data. All properties below are recommended. `@context` |
| 48 | and `@type` are required by the JSON-LD spec itself. |
| 49 | |
| 50 | | Property | Status | Type | Description | |
| 51 | |----------|--------|------|-------------| |
| 52 | | `@context` | JSON-LD required | URL | Always `"https://schema.org"` | |
| 53 | | `@type` | JSON-LD required | String | `"Article"` or `"BlogPosting"` | |
| 54 | | `@id` | Recommended | URI | Stable identifier: `{siteUrl}/blog/{slug}#article` | |
| 55 | | `headline` | Recommended | String | Post title, max 110 characters | |
| 56 | | `description` | Recommended | String | Meta description, 150-160 characters | |
| 57 | | `datePublished` | Recommended | ISO 8601 | Original publish date | |
| 58 | | `dateModified` | Recommended | ISO 8601 | Last content update date | |
| 59 | | `author` | Recommended | Person | Author entity (use @id reference) | |
| 60 | | `publisher` | Recommended | Organization | Site/company entity (use @id reference) | |
| 61 | | `image` | Recommended | ImageObject or URL | Featured image, min 1200x630px | |
| 62 | | `mainEntityOfPage` | Recommended | WebPage | The page URL | |
| 63 | | `wordCount` | Recommended | Integer | Total word count of article body | |
| 64 | | `articleSection` | Recommended | String | Category/topic (e.g., "SEO") | |
| 65 | | `keywords` | Recommended | String or Array | Comma-separated or array of keywords | |
| 66 | | `inLanguage` | Recommended | String | BCP 47 language code (e.g., "en-US") | |
| 67 | | `url` | Recommended | URL | Canonical URL of the post | |
| 68 | | `thumbnailUrl` | Optional | URL | Smaller preview image | |
| 69 | | `articleBody` | Optional | String | Full text (usually omitted for size) | |
| 70 | |
| 71 | ### Complete Article/BlogPosting Example |
| 72 | |
| 73 | |
| 74 | { |
| 75 | "@context": "https://schema.org", |
| 76 | "@type": "Article", |
| 77 | "@id": "https://example.com/blog/technical-seo-guide#article", |
| 78 | "headline": "Complete Guide to Technical SEO in 2026", |
| 79 | "description": "Technical SEO has evolved beyond Core Web Vitals. 72% of top-ranking pages now use structured data. Here's how to optimize your site for both traditional search and AI systems.", |
| 80 | "datePublished": "2026-01-15T08:00:00Z", |
| 81 | "dateModified": "2026-02-10T14:30:00Z", |
| 82 | "author": { |
| 83 | "@id": "https://example.com/author/sarah-chen#person" |
| 84 | }, |
| 85 | "publisher": { |
| 86 | "@id": "https://example.com#organization" |
| 87 | }, |
| 88 | "image": { |
| 89 | "@type": "ImageObject", |
| 90 | "url": "https://example.com/images/blog/technical-seo-guide.jpg", |
| 91 | "width": 1200, |
| 92 | "height": 630, |
| 93 | "caption": "Technical SEO optimization workflow diagram" |
| 94 | }, |
| 95 | "mainEntityOfPage": { |
| 96 | "@type": "WebPage", |
| 97 | "@id": "https://example.com/blog/technical-seo-guide" |
| 98 | }, |
| 99 | "wordCount": 3200, |
| 100 | "articleSection": "SEO", |
| 101 | "keywords": ["technical SEO", "structured data", "Core Web Vitals", "schema markup"], |
| 102 | "inLanguage": "en-US" |
| 103 | } |
| 104 | |
| 105 | |
| 106 | |
| 107 | |
| 108 | ## Person Schema |
| 109 | |
| 110 | Used for author attribution in BlogPosting and on dedicated author pages. |
| 111 | |
| 112 | ### Full Property Reference |
| 113 | |
| 114 | | Property | Required | Type | Description | |
| 115 | |----------|----------|------|-------------| |
| 116 | | `@type` | Yes | String | Always `"Person"` | |
| 117 | | `@id` | Yes | URI | Stable: `{siteUrl}/author/{slug}#person` | |
| 118 | | `name` | Yes | String | Full name | |
| 119 | | `jobTitle` | Yes | String | Current professional title | |
| 120 | | `url` | Yes | URL | Author page URL | |
| 121 | | `image` | Yes | URL | Professional headshot | |
| 122 | | `sameAs` | Yes | Array | Social profile URLs (LinkedIn, Twitter, GitHub, personal site) | |
| 123 | | `worksFor` | Recommended | Organization | Current employer | |
| 124 | | `alumniOf` | Optional | CollegeOrUniversity | Educational background | |
| 125 | | `description` | Recommended | String | Brief professional bio | |
| 126 | | `knowsAbout` | Optional | Array | Expertise topics | |
| 127 | |
| 128 | ### Complete Person Example |
| 129 | |
| 130 | |
| 131 | { |
| 132 | "@type": "Person", |
| 133 | "@id": "https://example.com/author/sarah-chen#person", |
| 134 | "name": "Sarah Chen", |
| 135 | "jobTitle": "Content Strategist", |
| 136 | "url": "https://example.com/author/sarah-chen", |
| 137 | "image": "https://example.com/images/authors/sarah-chen.jpg", |
| 138 | "description": "Content strategist with 8 years of experience in B2B SaaS, specializing in data-driven blog optimization.", |
| 139 | "sameAs": [ |
| 140 | "https://linkedin.com/in/sarahchen", |
| 141 | "https://twitter.com/sarahchen", |
| 142 | "https://sarahchen.com" |
| 143 | ], |
| 144 | "worksFor": { |
| 145 | "@type": "Organization", |
| 146 | "name": "Example Corp", |
| 147 | "url": "https://example.com" |
| 148 | }, |
| 149 | "alumniOf": { |
| 150 | "@type": "CollegeOrUniversity", |
| 151 | "name": "UC Berkeley" |
| 152 | }, |
| 153 | "knowsAbout": ["SEO", "Content Strategy", "B2B SaaS Marketing"] |
| 154 | } |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | ## Organization Schema |
| 160 | |
| 161 | Represents the publishing entity. Referenced by every BlogPosting via the |
| 162 | `publisher` property. |
| 163 | |
| 164 | ### Full Property Reference |
| 165 | |
| 166 | | Property | Required | Type | Description | |
| 167 | |----------|----------|------|-------------| |
| 168 | | `@type` | Yes | String | `"Organization"` or `"LocalBusiness"` | |
| 169 | | `@id` | Yes | URI | Stable: `{siteUrl}#organization` | |
| 170 | | `name` | Yes | String | Company/brand name | |
| 171 | | `url` | Yes | URL | Homepage URL | |
| 172 | | `logo` | Yes | ImageObject | Company logo (min 112x112px, max 600px wide) | |
| 173 | | `sameAs` | Recommended | Array | Social media profile URLs | |
| 174 | | `contactPoint` | Recommended | ContactPoint | Support/contact info | |
| 175 | | `description` | Optional | String | Brief company description | |
| 176 | | `founder` | Optional | Person | Company founder | |
| 177 | | `foundingDate` | Optional | Date | When the company was founded | |
| 178 | |
| 179 | ### Complete Organization Example |
| 180 | |
| 181 | |
| 182 | { |
| 183 | "@type": "Organization", |
| 184 | "@id": "https://example.com#organization", |
| 185 | "name": "Example Corp", |
| 186 | "url": "https://example.com", |
| 187 | "logo": { |
| 188 | "@type": "ImageObject", |
| 189 | "url": "https://example.com/images/logo.png", |
| 190 | "width": 300, |
| 191 | "height": 60 |
| 192 | }, |
| 193 | "sameAs": [ |
| 194 | "https://twitter.com/examplecorp", |
| 195 | "https://linkedin.com/company/examplecorp", |
| 196 | "https://github.com/examplecorp" |
| 197 | ], |
| 198 | "contactPoint": { |
| 199 | "@type": "ContactPoint", |
| 200 | "contactType": "customer support", |
| 201 | "email": "[email protected]", |
| 202 | "url": "https://example.com/contact" |
| 203 | } |
| 204 | } |
| 205 | |
| 206 | |
| 207 | |
| 208 | |
| 209 | ## BreadcrumbList Schema |
| 210 | |
| 211 | Provides navigation hierarchy to search engines and AI systems. Improves |
| 212 | how pages appear in search results and helps crawlers understand site structure. |
| 213 | |
| 214 | ### ItemListElement Pattern |
| 215 | |
| 216 | Each breadcrumb item requires `@type`, `position`, `name`, and `item` (URL). |
| 217 | |
| 218 | ### Complete BreadcrumbList Example |
| 219 | |
| 220 | |
| 221 | { |
| 222 | "@type": "BreadcrumbList", |
| 223 | "itemListElement": [ |
| 224 | { |
| 225 | "@type": "ListItem", |
| 226 | "position": 1, |
| 227 | "name": "Home", |
| 228 | "item": "https://example.com" |
| 229 | }, |
| 230 | { |
| 231 | "@type": "ListItem", |
| 232 | "position": 2, |
| 233 | "name": "Blog", |
| 234 | "item": "https://example.com/blog" |
| 235 | }, |
| 236 | { |
| 237 | "@type": "ListItem", |
| 238 | "position": 3, |
| 239 | "name": "SEO", |
| 240 | "item": "https://example.com/blog/category/seo" |
| 241 | }, |
| 242 | { |
| 243 | "@type": "ListItem", |
| 244 | "position": 4, |
| 245 | "name": "Complete Guide to Technical SEO in 2026", |
| 246 | "item": "https://example.com/blog/technical-seo-guide" |
| 247 | } |
| 248 | ] |
| 249 | } |
| 250 | |
| 251 | |
| 252 | ### Rules |
| 253 | |
| 254 | Always start with Home (position 1) |
| 255 | Include category/topic level if applicable |
| 256 | Final item is the current page |
| 257 | Positions must be sequential integers starting at 1 |
| 258 | Every item except the last must have an `item` URL |
| 259 | |
| 260 | |
| 261 | |
| 262 | ## FAQPage Schema |
| 263 | |
| 264 | **Important**: Google reduced FAQ rich-result visibility in August 2023, |
| 265 | primarily showing it only for well-known, authoritative government and health |
| 266 | sites. General blogs should not expect FAQ rich results. This is rich-result |
| 267 | eligibility guidance, not a statement that FAQPage schema is invalid. |
| 268 | |
| 269 | However, the markup can remain as optional entity support: LLMs parse your |
| 270 | page's **visible FAQ text**, and Q&A-formatted content can improve |
| 271 | extractability for citation. Google says there is "no need to proactively |
| 272 | remove" existing FAQPage markup and it "does not cause problems for Search." |
| 273 | Implement for AI/LLM entity value only, not rich results. |
| 274 | |
| 275 | ### Structure |
| 276 | |
| 277 | |
| 278 | FAQPage |
| 279 | └── mainEntity (array) |
| 280 | └── Question |
| 281 | ├── name (the question text) |
| 282 | └── acceptedAnswer |
| 283 | └── Answer |
| 284 | └── text (the answer text, 40-60 words) |
| 285 | |
| 286 | |
| 287 | ### Complete FAQPage Example |
| 288 | |
| 289 | |
| 290 | { |
| 291 | "@context": "https://schema.org", |
| 292 | "@type": "FAQPage", |
| 293 | "mainEntity": [ |
| 294 | { |
| 295 | "@type": "Question", |
| 296 | "name": "How does technical SEO affect AI visibility?", |
| 297 | "acceptedAnswer": { |
| 298 | "@type": "Answer", |
| 299 | "text": "Technical SEO directly determines whether AI crawlers can access and extract your content. Since AI crawlers do not execute JavaScript, server-side rendered HTML with structured data markup is essential. Sites with proper technical SEO and accessible content structure are significantly more likely to earn AI citations." |
| 300 | } |
| 301 | }, |
| 302 | { |
| 303 | "@type": "Question", |
| 304 | "name": "What is the most important schema type for blog posts?", |
| 305 | "acceptedAnswer": { |
| 306 | "@type": "Answer", |
| 307 | "text": "BlogPosting schema is the foundation for blog content. It provides structured metadata about the article including author, dates, and content classification. Combined with Person and Organization schemas, it creates a complete entity graph that search engines and AI systems use to evaluate content authority." |
| 308 | } |
| 309 | }, |
| 310 | { |
| 311 | "@type": "Question", |
| 312 | "name": "Do AI search engines use schema markup?", |
| 313 | "acceptedAnswer": { |
| 314 | "@type": "Answer", |
| 315 | "text": "AI search engines can use schema markup to identify entities and relationships, but exact citation lifts are unverified. For blogs in 2026, prioritize Article or BlogPosting, Person author, Organization publisher, and BreadcrumbList. Add FAQPage only for visible Q&A entity support, not Google rich results." |
| 316 | } |
| 317 | } |
| 318 | ] |
| 319 | } |
| 320 | |
| 321 | |
| 322 | ### Guidelines |
| 323 | |
| 324 | 3-5 FAQ items per page (not excessive) |
| 325 | Answers should be 40-60 words (concise, extractable) |
| 326 | Questions should match real user queries (People Also Ask style) |
| 327 | Do not duplicate content already in the main article body |
| 328 | Each answer should be self-contained and useful without context |
| 329 | |
| 330 | |
| 331 | |
| 332 | ## ImageObject Schema |
| 333 | |
| 334 | Used within BlogPosting for featured images and inline article images. |
| 335 | |
| 336 | ### Properties |
| 337 | |
| 338 | | Property | Required | Type | Description | |
| 339 | |----------|----------|------|-------------| |
| 340 | | `@type` | Yes | String | `"ImageObject"` | |
| 341 | | `url` | Yes | URL | Full image URL | |
| 342 | | `width` | Yes | Integer | Width in pixels | |
| 343 | | `height` | Yes | Integer | Height in pixels | |
| 344 | | `caption` | Recommended | String | Descriptive caption | |
| 345 | | `creditText` | Recommended | String | Photographer or source credit | |
| 346 | | `copyrightHolder` | Optional | Person/Organization | Rights holder | |
| 347 | | `license` | Optional | URL | Link to license (e.g., Creative Commons) | |
| 348 | |
| 349 | ### Complete ImageObject Example |
| 350 | |
| 351 | |
| 352 | { |
| 353 | "@type": "ImageObject", |
| 354 | "url": "https://example.com/images/blog/seo-workflow-diagram.jpg", |
| 355 | "width": 1200, |
| 356 | "height": 630, |
| 357 | "caption": "Technical SEO audit workflow showing the 7-step process from crawl analysis to implementation", |
| 358 | "creditText": "Example Corp Design Team", |
| 359 | "copyrightHolder": { |
| 360 | "@type": "Organization", |
| 361 | "name": "Example Corp" |
| 362 | } |
| 363 | } |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | ## VideoObject Schema |
| 369 | |
| 370 | Used for YouTube videos embedded in blog posts. YouTube has the strongest |
| 371 | AI visibility correlation (0.737). Each embedded video gets its own VideoObject. |
| 372 | |
| 373 | ### Properties |
| 374 | |
| 375 | | Property | Required | Type | Description | |
| 376 | |----------|----------|------|-------------| |
| 377 | | `@type` | Yes | String | `"VideoObject"` | |
| 378 | | `@id` | Yes | URI | `{siteUrl}/blog/{slug}#video-{index}` | |
| 379 | | `name` | Yes | String | Video title | |
| 380 | | `description` | Yes | String | First 200 chars of video description | |
| 381 | | `thumbnailUrl` | Yes | URL | `https://img.youtube.com/vi/{id}/hqdefault.jpg` | |
| 382 | | `uploadDate` | Yes | ISO 8601 | Video publish date | |
| 383 | | `contentUrl` | Yes | URL | `https://www.youtube.com/watch?v={id}` | |
| 384 | | `embedUrl` | Yes | URL | `https://www.youtube.com/embed/{id}` | |
| 385 | | `duration` | Recommended | ISO 8601 | Duration (e.g., `PT10M30S`) | |
| 386 | | `interactionStatistic` | Recommended | InteractionCounter | View count | |
| 387 | | `publisher` | Optional | Organization | Channel name and URL | |
| 388 | |
| 389 | ### Complete VideoObject Example |
| 390 | |
| 391 | |
| 392 | { |
| 393 | "@type": "VideoObject", |
| 394 | "@id": "https://example.com/blog/seo-guide#video-1", |
| 395 | "name": "Complete Guide to Technical SEO in 2026", |
| 396 | "description": "Learn the essential technical SEO strategies for 2026 including Core Web Vitals optimization, structured data, and AI search readiness.", |
| 397 | "thumbnailUrl": "https://img.youtube.com/vi/dQw4w9WgXcQ/hqdefault.jpg", |
| 398 | "uploadDate": "2026-01-20T00:00:00Z", |
| 399 | "contentUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", |
| 400 | "embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ", |
| 401 | "duration": "PT12M45S", |
| 402 | "interactionStatistic": { |
| 403 | "@type": "InteractionCounter", |
| 404 | "interactionType": { "@type": "WatchAction" }, |
| 405 | "userInteractionCount": 25000 |
| 406 | } |
| 407 | } |
| 408 | |
| 409 | |
| 410 | ### Guidelines |
| 411 | |
| 412 | Only generate for YouTube videos actually embedded in the post |
| 413 | Use `#video-1`, `#video-2` for sequential @id fragments |
| 414 | Duration must be ISO 8601 format (PT prefix, M for minutes, S for seconds) |
| 415 | Extract metadata from embed noscript text or YouTube Data API |
| 416 | |
| 417 | |
| 418 | |
| 419 | ## Speakable Schema |
| 420 | |
| 421 | Speakable support is limited and should not be a default schema recommendation |
| 422 | for normal blog pages. Use it only when the target surface explicitly supports |
| 423 | Speakable markup and the selected text is visible on the page. |
| 424 | |
| 425 | ### Implementation Options |
| 426 | |
| 427 | Use `cssSelector` (preferred) or `xPath` to identify speakable content sections. |
| 428 | |
| 429 | ### Speakable Example with CSS Selectors |
| 430 | |
| 431 | |
| 432 | { |
| 433 | "@type": "WebPage", |
| 434 | "speakable": { |
| 435 | "@type": "SpeakableSpecification", |
| 436 | "cssSelector": [ |
| 437 | ".article-summary", |
| 438 | ".faq-answer", |
| 439 | "h1", |
| 440 | ".key-takeaway" |
| 441 | ] |
| 442 | } |
| 443 | } |
| 444 | |
| 445 | |
| 446 | ### Speakable Example with XPath |
| 447 | |
| 448 | |
| 449 | { |
| 450 | "@type": "WebPage", |
| 451 | "speakable": { |
| 452 | "@type": "SpeakableSpecification", |
| 453 | "xPath": [ |
| 454 | "/html/head/title", |
| 455 | "/html/body//article/p[1]", |
| 456 | "/html/body//div[@class='key-takeaway']" |
| 457 | ] |
| 458 | } |
| 459 | } |
| 460 | |
| 461 | |
| 462 | ### Guidelines |
| 463 | |
| 464 | Point to concise, self-contained text sections |
| 465 | Ideal sections: article summaries, FAQ answers, key takeaways |
| 466 | Avoid pointing to entire articles (too long for voice) |
| 467 | Each speakable section should be under 2-3 sentences |
| 468 | Content must make sense when read aloud without visual context |
| 469 | |
| 470 | |
| 471 | |
| 472 | ## Stable @id Patterns |
| 473 | |
| 474 | Every schema entity needs a stable, unique `@id` that remains consistent across |
| 475 | page loads and site rebuilds. This allows search engines to build entity graphs |
| 476 | and AI systems to deduplicate references. |
| 477 | |
| 478 | ### Standard Patterns |
| 479 | |
| 480 | | Entity | @id Pattern | Example | |
| 481 | |--------|-------------|---------| |
| 482 | | Blog Post | `{siteUrl}/blog/{slug}#article` | `https://example.com/blog/seo-guide#article` | |
| 483 | | Author | `{siteUrl}/author/{slug}#person` | `https://example.com/author/sarah-chen#person` | |
| 484 | | Organization | `{siteUrl}#organization` | `https://example.com#organization` | |
| 485 | | WebPage | `{siteUrl}/blog/{slug}` | `https://example.com/blog/seo-guide` | |
| 486 | | BreadcrumbList | `{siteUrl}/blog/{slug}#breadcrumb` | `https://example.com/blog/seo-guide#breadcrumb` | |
| 487 | | FAQPage | `{siteUrl}/blog/{slug}#faq` | `https://example.com/blog/seo-guide#faq` | |
| 488 | | VideoObject | `{siteUrl}/blog/{slug}#video-{N}` | `https://example.com/blog/seo-guide#video-1` | |
| 489 | |
| 490 | ### Rules |
| 491 | |
| 492 | Use the fragment identifier (`#`) to differentiate entities on the same page |
| 493 | Never use random IDs, timestamps, or build hashes |
| 494 | Keep patterns consistent across every page on the site |
| 495 | The URL portion must match the canonical URL |
| 496 | Use `@id` references to link entities instead of embedding duplicates |
| 497 | |
| 498 | ### Referencing by @id |
| 499 | |
| 500 | Instead of embedding a full Person object in every BlogPosting, reference the |
| 501 | @id and define the Person once in the @graph: |
| 502 | |
| 503 | |
| 504 | "author": { |
| 505 | "@id": "https://example.com/author/sarah-chen#person" |
| 506 | } |
| 507 | |
| 508 | |
| 509 | |
| 510 | |
| 511 | ## Schema Types: Use Only When Eligible |
| 512 | |
| 513 | These entries separate Google rich-result eligibility from schema.org validity. |
| 514 | Using unsupported rich-result markup does not cause penalties, but it can waste |
| 515 | implementation effort and may trigger validation warnings. FAQPage is different: |
| 516 | the markup can remain for visible Q&A entity support even when a general blog is |
| 517 | not eligible for FAQ rich results. |
| 518 | |
| 519 | | Type | Deprecated | Date | Notes | |
| 520 | |------|------------|------|-------| |
| 521 | | HowTo | Rich result not broadly available | 2023 | Use visible step content plus Article schema for general blogs | |
| 522 | | SpecialAnnouncement | Watch item | Unknown | Use only when a primary Google source confirms support for the target page | |
| 523 | | ClaimReview | Rich-result simplification | 2025 | Use only for eligible fact-check content with clear methodology | |
| 524 | | Practice Problem | Watch item | Unknown | Use only for eligible education pages | |
| 525 | | Dataset | Valid schema, specialized surface | Unknown | Use for actual datasets; do not mark ordinary articles as Dataset | |
| 526 | | Sitelinks Search Box | Not recommended for blogs | Unknown | Google generally generates sitelinks algorithmically | |
| 527 | | Q&A | Valid for community Q&A where appropriate | Unknown | Do not use for editorial FAQ pages; use FAQPage for visible editorial Q&A | |
| 528 | |
| 529 | ### What to Use Instead |
| 530 | |
| 531 | | Deprecated Type | Alternative | |
| 532 | |----------------|-------------| |
| 533 | | HowTo | Use standard Article or BlogPosting with clear step headings (H2/H3) | |
| 534 | | Q&A | Use FAQPage for editorial Q&A; no replacement for community Q&A | |
| 535 | | SpecialAnnouncement | Use standard Article or NewsArticle | |
| 536 | | ClaimReview | No direct replacement for blogs; use Author entity with credentials | |
| 537 | |
| 538 | |
| 539 | |
| 540 | ## ProfilePage Schema (Author Pages) |
| 541 | |
| 542 | Supported in 2026. Add to author bio/team pages to strengthen E-E-A-T signals |
| 543 | and improve eligibility for author entity understanding. |
| 544 | |
| 545 | |
| 546 | { |
| 547 | "@context": "https://schema.org", |
| 548 | "@type": "ProfilePage", |
| 549 | "dateCreated": "2024-01-01T00:00:00Z", |
| 550 | "dateModified": "2026-04-01T00:00:00Z", |
| 551 | "mainEntity": { |
| 552 | "@type": "Person", |
| 553 | "@id": "https://example.com/author/jane-smith#person", |
| 554 | "name": "Jane Smith", |
| 555 | "url": "https://example.com/author/jane-smith", |
| 556 | "jobTitle": "Senior Content Strategist", |
| 557 | "description": "Jane writes about SEO and content marketing with 8 years of experience.", |
| 558 | "image": { |
| 559 | "@type": "ImageObject", |
| 560 | "url": "https://example.com/images/jane-smith.jpg" |
| 561 | }, |
| 562 | "sameAs": [ |
| 563 | "https://linkedin.com/in/janesmith", |
| 564 | "https://twitter.com/janesmith" |
| 565 | ] |
| 566 | } |
| 567 | } |
| 568 | |
| 569 | |
| 570 | |
| 571 | |
| 572 | ## JSON-LD @graph Pattern |
| 573 | |
| 574 | Combine all schema entities in a single `<script type="application/ld+json">` |
| 575 | tag using the `@graph` array. This is the recommended approach for pages with |
| 576 | multiple schema types. |
| 577 | |
| 578 | ### Benefits |
| 579 | |
| 580 | Single script tag instead of multiple scattered blocks |
| 581 | Entities reference each other via `@id` |
| 582 | Easier to maintain and validate |
| 583 | Cleaner HTML source |
| 584 | |
| 585 | ### Complete @graph Example (Blog Post Page) |
| 586 | |
| 587 | |
| 588 | { |
| 589 | "@context": "https://schema.org", |
| 590 | "@graph": [ |
| 591 | { |
| 592 | "@type": "Organization", |
| 593 | "@id": "https://example.com#organization", |
| 594 | "name": "Example Corp", |
| 595 | "url": "https://example.com", |
| 596 | "logo": { |
| 597 | "@type": "ImageObject", |
| 598 | "url": "https://example.com/images/logo.png", |
| 599 | "width": 300, |
| 600 | "height": 60 |
| 601 | }, |
| 602 | "sameAs": [ |
| 603 | "https://twitter.com/examplecorp", |
| 604 | "https://linkedin.com/company/examplecorp" |
| 605 | ] |
| 606 | }, |
| 607 | { |
| 608 | "@type": "Person", |
| 609 | "@id": "https://example.com/author/sarah-chen#person", |
| 610 | "name": "Sarah Chen", |
| 611 | "jobTitle": "Content Strategist", |
| 612 | "url": "https://example.com/author/sarah-chen", |
| 613 | "image": "https://example.com/images/authors/sarah-chen.jpg", |
| 614 | "sameAs": [ |
| 615 | "https://linkedin.com/in/sarahchen", |
| 616 | "https://twitter.com/sarahchen" |
| 617 | ], |
| 618 | "worksFor": { |
| 619 | "@id": "https://example.com#organization" |
| 620 | } |
| 621 | }, |
| 622 | { |
| 623 | "@type": "Article", |
| 624 | "@id": "https://example.com/blog/technical-seo-guide#article", |
| 625 | "headline": "Complete Guide to Technical SEO in 2026", |
| 626 | "description": "Technical SEO has evolved beyond Core Web Vitals. 72% of top-ranking pages now use structured data. Here's how to optimize your site for both traditional search and AI systems.", |
| 627 | "datePublished": "2026-01-15T08:00:00Z", |
| 628 | "dateModified": "2026-02-10T14:30:00Z", |
| 629 | "author": { |
| 630 | "@id": "https://example.com/author/sarah-chen#person" |
| 631 | }, |
| 632 | "publisher": { |
| 633 | "@id": "https://example.com#organization" |
| 634 | }, |
| 635 | "image": { |
| 636 | "@type": "ImageObject", |
| 637 | "url": "https://example.com/images/blog/technical-seo-guide.jpg", |
| 638 | "width": 1200, |
| 639 | "height": 630, |
| 640 | "caption": "Technical SEO optimization workflow diagram" |
| 641 | }, |
| 642 | "mainEntityOfPage": { |
| 643 | "@type": "WebPage", |
| 644 | "@id": "https://example.com/blog/technical-seo-guide" |
| 645 | }, |
| 646 | "wordCount": 3200, |
| 647 | "articleSection": "SEO", |
| 648 | "keywords": ["technical SEO", "structured data", "schema markup"], |
| 649 | "inLanguage": "en-US" |
| 650 | }, |
| 651 | { |
| 652 | "@type": "BreadcrumbList", |
| 653 | "@id": "https://example.com/blog/technical-seo-guide#breadcrumb", |
| 654 | "itemListElement": [ |
| 655 | { |
| 656 | "@type": "ListItem", |
| 657 | "position": 1, |
| 658 | "name": "Home", |
| 659 | "item": "https://example.com" |
| 660 | }, |
| 661 | { |
| 662 | "@type": "ListItem", |
| 663 | "position": 2, |
| 664 | "name": "Blog", |
| 665 | "item": "https://example.com/blog" |
| 666 | }, |
| 667 | { |
| 668 | "@type": "ListItem", |
| 669 | "position": 3, |
| 670 | "name": "Complete Guide to Technical SEO in 2026", |
| 671 | "item": "https://example.com/blog/technical-seo-guide" |
| 672 | } |
| 673 | ] |
| 674 | }, |
| 675 | { |
| 676 | "@type": "FAQPage", |
| 677 | "@id": "https://example.com/blog/technical-seo-guide#faq", |
| 678 | "mainEntity": [ |
| 679 | { |
| 680 | "@type": "Question", |
| 681 | "name": "How does technical SEO affect AI visibility?", |
| 682 | "acceptedAnswer": { |
| 683 | "@type": "Answer", |
| 684 | "text": "Technical SEO directly determines whether AI crawlers can access and extract your content. Server-side rendered HTML with structured data is essential since AI crawlers do not execute JavaScript." |
| 685 | } |
| 686 | }, |
| 687 | { |
| 688 | "@type": "Question", |
| 689 | "name": "What schema types should every blog post have?", |
| 690 | "acceptedAnswer": { |
| 691 | "@type": "Answer", |
| 692 | "text": "Every blog post should have Article or BlogPosting, Person author, Organization publisher, and BreadcrumbList schemas at minimum. Add FAQPage only for visible Q&A content and AI citation support, not Google rich results." |
| 693 | } |
| 694 | } |
| 695 | ] |
| 696 | } |
| 697 | ] |
| 698 | } |
| 699 | |
| 700 | |
| 701 | |
| 702 | |
| 703 | ## Schema Validation Checklist |
| 704 | |
| 705 | | Check | Pass | Fail | |
| 706 | |-------|------|------| |
| 707 | | JSON-LD in HTML source (not JS-injected) | In `<head>` or `<body>` tag | Loaded via JavaScript | |
| 708 | | Valid JSON syntax | Passes JSON.parse() | Syntax errors | |
| 709 | | @context is `https://schema.org` | Exact match | Missing or HTTP | |
| 710 | | @id uses stable fragment pattern | Consistent across builds | Random or missing | |
| 711 | | dateModified matches actual update | Within 24 hours of last edit | Stale or fabricated | |
| 712 | | Author @id matches author page | Same URI used everywhere | Inconsistent references | |
| 713 | | Image URLs are absolute | Start with `https://` | Relative paths | |
| 714 | | Eligibility checked for optional types | Type is valid for the visible content and target surface | Ineligible rich-result markup used as a default | |
| 715 | | Complete schema graph per page | Article/BlogPosting + Person + Organization + BreadcrumbList minimum | Missing priority entity baseline | |
| 716 | | Validates in the right tool | Schema.org Validator for schema validity; Rich Results Test only for eligible Google rich-result types | Errors present | |
| 717 | |
| 718 | ### Validation Tools |
| 719 | |
| 720 | **Schema.org Validator**: https://validator.schema.org |
| 721 | **Google Rich Results Test**: https://search.google.com/test/rich-results for eligible Google rich-result types |
| 722 | **JSON-LD Playground**: https://json-ld.org/playground/ |
| 723 |
Discussion
Browse more free Claude skills.