Complete blog schema reference skill

- Schema Types: Use Only When Eligible

by AgriciDaniel·MIT license·★ 2,219 Stars on the repo·GitHub ↗

Use now

Files of Complete blog schema reference

AgriciDaniel/main1 file
schema-stack.md
Show the full text723 lines

Complete Blog Schema Reference

Contents

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 item URL

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-2 for 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 @id references 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
1# Complete Blog Schema Reference
2 
3## Contents
4 
5- [Why Schema Matters](#why-schema-matters)
6- [BlogPosting Schema](#blogposting-schema)
7- [Person Schema](#person-schema)
8- [Organization Schema](#organization-schema)
9- [BreadcrumbList Schema](#breadcrumblist-schema)
10- [FAQPage Schema](#faqpage-schema)
11- [ImageObject Schema](#imageobject-schema)
12- [VideoObject Schema](#videoobject-schema)
13- [Speakable Schema](#speakable-schema)
14- [Stable @id Patterns](#stable-id-patterns)
15- [Schema Types: Use Only When Eligible](#schema-types-use-only-when-eligible)
16- [ProfilePage Schema (Author Pages)](#profilepage-schema-author-pages)
17- [JSON-LD @graph Pattern](#json-ld-graph-pattern)
18- [Schema Validation Checklist](#schema-validation-checklist)
19 
20## Why Schema Matters
21 
22Article schema with author Person, publisher Organization, and BreadcrumbList
23is the priority schema family for blog content in 2026. FAQ and HowTo rich
24results are no longer broadly available for general blog content, so standard
25article entities carry more of the SEO and AI-citation load. Complete schema
26graphs may increase AI citation likelihood, but exact lifts are directional and
27unverified. Schema must appear in HTML source, not injected via JavaScript,
28because most AI crawlers do not execute JS.
29 
30Still rich-result-eligible for eligible blog content in 2026: Article,
31BreadcrumbList, Video, Product, Review, and Event. FAQPage and HowTo remain
32valid schema.org types, but general blogs should not expect FAQ or HowTo visual
33rich results.
34 
35---
36 
37## BlogPosting Schema
38 
39The priority schema family for every blog post is Article. `BlogPosting` remains
40acceptable as an Article-family implementation, but the required shape is the
41same: author Person, publisher Organization, dates, headline, and canonical page
42metadata in a single structured entity.
43 
44### Full Property Reference
45 
46**Note:** Google states "there are no required properties" for Article or
47BlogPosting structured data. All properties below are recommended. `@context`
48and `@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```json
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 
110Used 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```json
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 
161Represents 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```json
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 
211Provides navigation hierarchy to search engines and AI systems. Improves
212how pages appear in search results and helps crawlers understand site structure.
213 
214### ItemListElement Pattern
215 
216Each breadcrumb item requires `@type`, `position`, `name`, and `item` (URL).
217 
218### Complete BreadcrumbList Example
219 
220```json
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,
265primarily showing it only for well-known, authoritative government and health
266sites. General blogs should not expect FAQ rich results. This is rich-result
267eligibility guidance, not a statement that FAQPage schema is invalid.
268 
269However, the markup can remain as optional entity support: LLMs parse your
270page's **visible FAQ text**, and Q&A-formatted content can improve
271extractability for citation. Google says there is "no need to proactively
272remove" existing FAQPage markup and it "does not cause problems for Search."
273Implement for AI/LLM entity value only, not rich results.
274 
275### Structure
276 
277```
278FAQPage
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```json
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 
334Used 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```json
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 
370Used for YouTube videos embedded in blog posts. YouTube has the strongest
371AI 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```json
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 
421Speakable support is limited and should not be a default schema recommendation
422for normal blog pages. Use it only when the target surface explicitly supports
423Speakable markup and the selected text is visible on the page.
424 
425### Implementation Options
426 
427Use `cssSelector` (preferred) or `xPath` to identify speakable content sections.
428 
429### Speakable Example with CSS Selectors
430 
431```json
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```json
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 
474Every schema entity needs a stable, unique `@id` that remains consistent across
475page loads and site rebuilds. This allows search engines to build entity graphs
476and 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 
500Instead of embedding a full Person object in every BlogPosting, reference the
501@id and define the Person once in the @graph:
502 
503```json
504"author": {
505 "@id": "https://example.com/author/sarah-chen#person"
506}
507```
508 
509---
510 
511## Schema Types: Use Only When Eligible
512 
513These entries separate Google rich-result eligibility from schema.org validity.
514Using unsupported rich-result markup does not cause penalties, but it can waste
515implementation effort and may trigger validation warnings. FAQPage is different:
516the markup can remain for visible Q&A entity support even when a general blog is
517not 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 
542Supported in 2026. Add to author bio/team pages to strengthen E-E-A-T signals
543and improve eligibility for author entity understanding.
544 
545```json
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 
574Combine all schema entities in a single `<script type="application/ld+json">`
575tag using the `@graph` array. This is the recommended approach for pages with
576multiple 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```json
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