Overview
Ship JSON-LD in a <script type="application/ld+json"> block, and mark up only what the page visibly shows. Field lists below follow Google Search Central’s structured data docs. Broader rules are in structured-data; deeper patterns are in schema-markup-deep.
Types and the result they earn
Add a type only when it earns a result or clarifies an entity.
| Type | Use for | Google result |
|---|---|---|
Article, NewsArticle, BlogPosting | Editorial pages | Article rich result. |
Product + Offer | Product pages | Product snippet, merchant listings. |
VideoObject | Hosted video | Video result, key moments. |
BreadcrumbList | Page hierarchy | Breadcrumb trail in the snippet. |
LocalBusiness | A physical location | Local business details. |
Organization | The publisher | Organization details such as the logo. |
Recipe, Event, JobPosting, Course, SoftwareApplication, Movie, Dataset | Matching content | The corresponding rich result. |
ProfilePage, QAPage, DiscussionForumPosting | Profiles, Q&A, forums | Profile, Q&A, and forum results. |
Review, AggregateRating | Ratings on a host type | Review snippet (stars). |
WebSite | The site | Site name only. |
FAQPage | Question lists | None: Google stopped showing FAQ rich results on May 7, 2026. |
HowTo | Step lists | None: removed in 2023. |
The sitelinks search box was retired in November 2024. Existing FAQPage and HowTo markup is harmless but earns nothing. Google says AI Overviews and AI Mode need no special markup.
Required and recommended fields
Supply every required field and the recommended ones the page can truthfully show.
| Type | Required | Recommended |
|---|---|---|
Article | none | headline, image, datePublished, dateModified, author (name, url). |
Product | name plus one of offers, review, aggregateRating | image, description, sku/gtin/mpn, brand. |
Offer | price, priceCurrency | availability (full URL such as https://schema.org/InStock), priceValidUntil. |
VideoObject | name, thumbnailUrl, uploadDate | description, contentUrl or embedUrl, duration, hasPart (Clips for key moments). |
BreadcrumbList | itemListElement of ListItem with position, name, item | item may be omitted on the last entry. |
LocalBusiness | name, address | telephone (with country code), geo, openingHoursSpecification, priceRange, url. |
Organization | none | name, url, logo (at least 112x112 px, crawlable), sameAs, contactPoint, address. |
Use the most specific subtype that fits (Restaurant, Dentist). Ship one LocalBusiness block per location page, with name, address, and phone matching the Google Business Profile (local-seo).
Reuse the publisher with @id
Declare Organization once with a stable @id, then reference it from other pages and entities instead of repeating its fields.
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Organization", "@id": "https://example.com/#org", "name": "Example Co",
"url": "https://example.com/", "logo": "https://example.com/logo.png",
"sameAs": ["https://www.linkedin.com/company/example"] },
{ "@type": "Article", "headline": "Release notes",
"publisher": { "@id": "https://example.com/#org" } }
]
}Gotchas
Avoid these; each risks losing the rich result or drawing a manual action.
| Gotcha | Fix |
|---|---|
| Markup that the page does not show (a price, hours) counts as misleading. | Match the visible content. |
Review and AggregateRating need a host type such as Product. | Nest them inside the reviewed item. |
| Since July 24, 2026 the review snippet guidance bans fake or undisclosed incentivized reviews, in the markup and on the page. | Disclose incentives; audit existing review markup. |
| The schema.org validator accepts more than Google rewards. | Test with Google’s Rich Results Test. |
Do not mark a multi-location brand’s home page as one LocalBusiness. | Use Organization for the brand, LocalBusiness per location. |
author as a plain string validates but carries little. | Use a Person with url and sameAs (e-e-a-t). |