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.
| Page | Type |
|---|---|
| Home page of a shop, clinic or trade | LocalBusiness (or a subtype) |
| Home page of a company | Organization |
| Product page | Product + Offer |
| Blog post | BlogPosting / Article |
| Any page with a breadcrumb trail | BreadcrumbList |
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.
| Type | Rich result in Google Search |
|---|---|
| LocalBusiness, Organization | Used for business details and knowledge panels |
| Product (with offers) | Yes: price, availability, shipping and returns |
| Article | Yes: better title, image and date in some results |
| BreadcrumbList | Yes: the breadcrumb trail in the result |
| Event, Recipe, VideoObject | Yes |
| FAQPage | Only for well-known government and health sites since 2023 |
| HowTo | No longer shown since 2023 |
| WebSite search box (SearchAction) | Retired in November 2024 |
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>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>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>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>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>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>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>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>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>| Rule | Why |
|---|---|
| Mark up only what is visible on the page | Hidden or invented details break Google's guidelines and can lead to a manual action |
| No ratings or reviews you did not collect | Fake or self-written reviews are spam |
| One main entity per page | Mixed signals confuse which thing the page is about |
| Use absolute URLs | Relative URLs in JSON-LD are often misread |
| Validate before publishing | A single syntax error makes the whole block ignored |
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.
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.
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.
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.
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.
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.