Implement JSON-LD structured data that earns rich snippets in Google,
powers knowledge panels, and grounds AI search answers with verified
structured information. Covers Article, Product, FAQ, HowTo,
+BreadcrumbList, Organization, WebSite, and recent Schema.org additions (Credential, Error) — see Version note below.
+
+VERSION NOTE
−BreadcrumbList, Organization, and WebSite schemas.
+- This skill has been updated for Schema.org v30.0 (published 2026-03-19). Notable additions and changes in v30.0 include: new classes Credential and Error (with property errorCode); changes to Quantity (now inherits from DataType); new and extended properties such as jobDuration and floorLevel; extended range of previousStartDate to include DateTime; CompoundPriceSpecification now accepts PriceSpecification children; and added EU Digital Product Passport examples. Always check https://schema.org/version/latest or the release listing (https://schema.org/docs/releases.html) for the authoritative change log.
## When to use
−- Adding structured data to any content page for rich snippet eligibility
+- Adding structured data to any content page for rich snippet eligibility or to improve understanding by search engines and AI
- Building product pages that need price, rating, and availability snippets
+- Creating FAQ sections that should be discoverable (note: FAQ rich results visibility has been restricted by Google — see Edge cases)
−- Creating FAQ sections that should expand in Google search results
+- Writing how-to guides that may benefit from step-by-step structured markup (HowTo rich results have device constraints — see Edge cases)
−- Writing how-to guides that benefit from step-by-step rich results
- Setting up organization-level schema for knowledge panels
+- Marking up credentials or certificates (use the new Credential type when appropriate)
+- Surface structured error information in machine-readable form (use the new Error type and errorCode property)
- Grounding AI search results with verified, structured claims
## When NOT to use
@@ −23 +28 @@
## Core concepts
+- JSON-LD — JavaScript Object Notation for Linked Data — Google's preferred structured data format
+- @context — Always `https://schema.org` — declares the vocabulary; check schema.org/version/latest for the current published schema
+- @type — The Schema.org entity type (Article, Product, FAQPage, HowTo, Credential, Error, etc.)
+- Nesting — Embedding related entities within a parent (e.g., Author within Article)
+- @id — A canonical URI for the entity, enabling cross-referencing between schemas
+- ItemList — A wrapper for ordered or unordered lists of schema items
+- Rich result — Enhanced SERP display triggered by valid structured data (Google controls which types are eligible; consult Google's Search Gallery)
−| Concept | Description |
+- Eligibility — Not all schema types trigger rich results — only Google-supported types listed at: https://developers.google.com/search/docs/appearance/structured-data/search-gallery
−|---------|-------------|
−| JSON-LD | JavaScript Object Notation for Linked Data — Google's preferred structured data format |
−| @context | Always `https://schema.org` — declares the vocabulary |
−| @type | The Schema.org entity type (Article, Product, FAQ, etc.) |
−| Nesting | Embedding related entities within a parent (e.g., Author within Article) |
−| @id | A canonical URI for the entity, enabling cross-referencing between schemas |
−| ItemList | A wrapper for ordered or unordered lists of schema items |
−| Rich snippet | Enhanced SERP display triggered by valid structured data |
−| Eligibility | Not all schema types trigger rich results — only Google-supported types |
## Workflow
### Step 1: Identify the correct schema type
+Match your content to the most specific Schema.org type. Recent v30.0 additions you may need:
+- Credential — use for certifications, badges, and non-educational credentials where a hasCredential relationship is required.
−Match your content to the most specific Schema.org type:
+- Error — use for machine-readable error reporting with errorCode and related properties.
+Common mappings:
+- Blog post / news article → Article, NewsArticle, BlogPosting → Article snippet
+- Product page → Product → Price, rating, availability
+- FAQ section → FAQPage → Expandable Q&A (visibility constrained by Google policy)
+- Tutorial / guide → HowTo → Step-by-step display (device restrictions apply)
+- Breadcrumb nav → BreadcrumbList → Breadcrumb trail
+- Site-wide search → WebSite + SearchAction → Sitelinks search box
−| Content type | Schema.org type | Rich result type |
+- Business info → Organization, LocalBusiness → Knowledge panel
−|-------------|----------------|-----------------|
−| Blog post / news article | Article, NewsArticle, BlogPosting | Article snippet |
−| Product page | Product | Price, rating, availability |
−| FAQ section | FAQPage | Expandable Q&A |
−| Tutorial / guide | HowTo | Step-by-step display |
−| Breadcrumb nav | BreadcrumbList | Breadcrumb trail |
−| Site-wide search | WebSite + SearchAction | Sitelinks search box |
−| Business info | Organization, LocalBusiness | Knowledge panel |
### Step 2: Build the JSON-LD component
−Create a reusable React component for each schema type.
+Create a reusable component for each schema type. Examples below remain valid; when using dynamic properties introduced in v30.0 (Credential, Error, floorLevel, jobDuration, etc.), include them where applicable.
−#### Article schema
+#### Article schema (React example)
```typescript
−type ArticleJsonLdProps = {
+export function ArticleJsonLd({ title, description, url, imageUrl, authorName, publishedAt, modifiedAt }) {
− title: string;
− description: string;
− url: string;
− imageUrl: string;
− authorName: string;
− publishedAt: string;
− modifiedAt: string;
−};
−
−export function ArticleJsonLd(props: ArticleJsonLdProps) {
const schema = {
"@context": "https://schema.org",
"@type": "Article",
+ headline: title,
+ description,
+ url,
+ image: imageUrl,
+ author: { "@type": "Person", name: authorName },
+ publisher: { "@type": "Organization", name: "YourBrand", logo: { "@type": "ImageObject", url: "https://yourbrand.com/logo.png" } },
+ datePublished: publishedAt,
− headline: props.title,
+ dateModified: modifiedAt,
− description: props.description,
− url: props.url,
− image: props.imageUrl,
− author: { "@type": "Person", name: props.authorName },
− publisher: {
− "@type": "Organization",
− name: "YourBrand",