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.

TypeUse forGoogle result
Article, NewsArticle, BlogPostingEditorial pagesArticle rich result.
Product + OfferProduct pagesProduct snippet, merchant listings.
VideoObjectHosted videoVideo result, key moments.
BreadcrumbListPage hierarchyBreadcrumb trail in the snippet.
LocalBusinessA physical locationLocal business details.
OrganizationThe publisherOrganization details such as the logo.
Recipe, Event, JobPosting, Course, SoftwareApplication, Movie, DatasetMatching contentThe corresponding rich result.
ProfilePage, QAPage, DiscussionForumPostingProfiles, Q&A, forumsProfile, Q&A, and forum results.
Review, AggregateRatingRatings on a host typeReview snippet (stars).
WebSiteThe siteSite name only.
FAQPageQuestion listsNone: Google stopped showing FAQ rich results on May 7, 2026.
HowToStep listsNone: 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.

Supply every required field and the recommended ones the page can truthfully show.

TypeRequiredRecommended
Articlenoneheadline, image, datePublished, dateModified, author (name, url).
Productname plus one of offers, review, aggregateRatingimage, description, sku/gtin/mpn, brand.
Offerprice, priceCurrencyavailability (full URL such as https://schema.org/InStock), priceValidUntil.
VideoObjectname, thumbnailUrl, uploadDatedescription, contentUrl or embedUrl, duration, hasPart (Clips for key moments).
BreadcrumbListitemListElement of ListItem with position, name, itemitem may be omitted on the last entry.
LocalBusinessname, addresstelephone (with country code), geo, openingHoursSpecification, priceRange, url.
Organizationnonename, 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.

GotchaFix
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).