Structured Data Examples: JSON-LD for Every Common Page

Structured data is a JSON-LD block in a page's HTML that describes what the page is about using schema.org types, such as LocalBusiness, Product or Article. Search engines use it to understand the page and, for some types, to show rich results. Below are copy-ready examples for nine page types and the rules for using them safely.

Which example to use
PageType
Home page of a shop, clinic or tradeLocalBusiness (or a subtype)
Home page of a companyOrganization
Product pageProduct + Offer
Blog postBlogPosting / Article
Any page with a breadcrumb trailBreadcrumbList

Updated

Every example is written for a made-up business so you can see realistic values. Replace each value with your own, keep only properties that are true and visible on your page, then check the result with a validator before publishing.

Prefer a form? Fill in the schema markup generator.

Which types still earn rich results

Rich result status for common types (Google)
TypeRich result in Google Search
LocalBusiness, OrganizationUsed for business details and knowledge panels
Product (with offers)Yes: price, availability, shipping and returns
ArticleYes: better title, image and date in some results
BreadcrumbListYes: the breadcrumb trail in the result
Event, Recipe, VideoObjectYes
FAQPageOnly for well-known government and health sites since 2023
HowToNo longer shown since 2023
WebSite search box (SearchAction)Retired in November 2024

Copy-ready JSON-LD by page type

LocalBusiness (a bakery)

Use the most specific subtype that fits (Bakery, Dentist, Plumber...). Opening hours and address should match your Google Business Profile.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Bakery",
  "name": "Harbour Bakery",
  "url": "https://harbourbakery.example",
  "image": "https://harbourbakery.example/storefront.jpg",
  "telephone": "+1-555-0142",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "12 Quay Street",
    "addressLocality": "Portsmouth",
    "addressRegion": "NH",
    "postalCode": "03801",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 43.0779,
    "longitude": -70.7576
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday"
      ],
      "opens": "07:00",
      "closes": "17:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "08:00",
      "closes": "14:00"
    }
  ]
}
</script>

Organization (home page)

Put this on the home page once. sameAs lists your official profiles; logo should be a square-ish image at least 112 pixels wide.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Northline Studio",
  "url": "https://northline.example",
  "logo": "https://northline.example/logo.png",
  "email": "[email protected]",
  "sameAs": [
    "https://www.linkedin.com/company/northline-example",
    "https://www.instagram.com/northline.example"
  ]
}
</script>

Product with an offer

Price, currency and availability must match what the page shows. Only add review or rating markup if real reviews are visible on the page.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Linen Apron",
  "image": [
    "https://shop.example/apron.jpg"
  ],
  "description": "Heavy linen apron with two front pockets.",
  "sku": "AP-LIN-01",
  "brand": {
    "@type": "Brand",
    "name": "Harbour Goods"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://shop.example/apron",
    "priceCurrency": "USD",
    "price": "38.00",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition"
  }
}
</script>

Article / BlogPosting

Dates in ISO 8601 with a time zone. The author should be a real person or organisation with a page you can link to.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "How we bake sourdough overnight",
  "image": [
    "https://harbourbakery.example/blog/sourdough.jpg"
  ],
  "datePublished": "2026-09-02T08:00:00-04:00",
  "dateModified": "2026-09-10T09:30:00-04:00",
  "author": [
    {
      "@type": "Person",
      "name": "Maya Chen",
      "url": "https://harbourbakery.example/about#maya"
    }
  ]
}
</script>

BreadcrumbList

Mirror the breadcrumb links visible on the page. The last item can leave out item, since it is the current page.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Shop",
      "item": "https://shop.example/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Kitchen",
      "item": "https://shop.example/kitchen"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Linen Apron"
    }
  ]
}
</script>

Event

For in-person events give a Place with an address; for online ones use VirtualLocation and eventAttendanceMode.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Bread Making Workshop",
  "startDate": "2026-11-14T10:00:00-05:00",
  "endDate": "2026-11-14T13:00:00-05:00",
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
  "eventStatus": "https://schema.org/EventScheduled",
  "location": {
    "@type": "Place",
    "name": "Harbour Bakery",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "12 Quay Street",
      "addressLocality": "Portsmouth",
      "addressRegion": "NH",
      "addressCountry": "US"
    }
  },
  "offers": {
    "@type": "Offer",
    "price": "45",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "url": "https://harbourbakery.example/workshop"
  },
  "organizer": {
    "@type": "Organization",
    "name": "Harbour Bakery",
    "url": "https://harbourbakery.example"
  }
}
</script>

Recipe

Times use ISO 8601 durations (PT20M is 20 minutes). Ingredients and steps must be on the page too.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Recipe",
  "name": "Overnight Oat Loaf",
  "image": [
    "https://harbourbakery.example/oat-loaf.jpg"
  ],
  "author": {
    "@type": "Person",
    "name": "Maya Chen"
  },
  "prepTime": "PT20M",
  "cookTime": "PT45M",
  "recipeYield": "1 loaf",
  "recipeIngredient": [
    "500 g bread flour",
    "100 g rolled oats",
    "350 ml water",
    "10 g salt",
    "5 g dried yeast"
  ],
  "recipeInstructions": [
    {
      "@type": "HowToStep",
      "text": "Mix everything and rest overnight in the fridge."
    },
    {
      "@type": "HowToStep",
      "text": "Shape, prove for an hour and bake at 220°C for 45 minutes."
    }
  ]
}
</script>

VideoObject

Needs a name, a thumbnail and an upload date. contentUrl or embedUrl tells search engines where the video file or player is.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "Shaping a sourdough boule",
  "description": "A two-minute walkthrough of shaping a round loaf.",
  "thumbnailUrl": [
    "https://harbourbakery.example/video/boule.jpg"
  ],
  "uploadDate": "2026-08-20T12:00:00-04:00",
  "duration": "PT2M10S",
  "embedUrl": "https://www.youtube.com/embed/VIDEO_ID"
}
</script>

FAQPage

Still valid schema, but Google now shows FAQ rich results only for well-known government and health sites. Use it only where the questions and answers are visible on the page.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Do you have gluten-free bread?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, on Fridays and Saturdays."
      }
    }
  ]
}
</script>

Rules

Rules that keep markup safe
RuleWhy
Mark up only what is visible on the pageHidden or invented details break Google's guidelines and can lead to a manual action
No ratings or reviews you did not collectFake or self-written reviews are spam
One main entity per pageMixed signals confuse which thing the page is about
Use absolute URLsRelative URLs in JSON-LD are often misread
Validate before publishingA single syntax error makes the whole block ignored

Generate instead of hand-writing

For a one-off page, copying an example is fine. For many pages, fill in our schema markup generator or build the JSON from your page data, then check it with the schema markup validator.

How it works

  1. Find your page type in the table.
  2. Copy the example and replace every value with your real details.
  3. Paste the script block into the page's HTML, in the head or body.
  4. Validate it with our schema validator or Google's Rich Results Test.
  5. Watch the Enhancements reports in Search Console after it is crawled.

Tips

Frequently asked questions

JSON-LD, Microdata or RDFa?

JSON-LD. Google recommends it, it sits in one script block instead of being spread through your HTML, and it is the easiest to generate and maintain.

Does structured data improve rankings?

Not directly. It helps search engines understand the page and can make the result richer, which may earn more clicks, but it is not a ranking boost by itself.

Where do I put the JSON-LD script?

Anywhere in the HTML; the head is common. If your site renders with JavaScript, make sure the block is in the HTML crawlers receive, for example through server rendering or prerendering.

Can I add review stars to my own business?

Not with self-serving review markup. Google does not show review stars for LocalBusiness or Organization reviews that the business publishes about itself.

Related: Schema markup generator, Schema markup validator, Single page app SEO, Meta tag generator, All free tools.

Start for free or see all free tools. We.Inc is free to start, with no card needed. AI building is on paid plans from $20 a month.

More in Guides

We.Inc is an AI-powered website builder you can resell under your own brand. Launch a branded client dashboard, bill on Stripe Connect, and deliver AI-generated websites in minutes. White-label plans start at $99 a month for 25 client sites, with a 7-day free trial and no per-site fees.

Product

Who It's For

Features

Resources

Company

View Sitemap