Guide : Recipe Schema
How to implement schema.org/Recipe markup pour Google's recipe rich result — the two requis properties vs. the recommended définir que builds the fuller card, pourquoi the carousel nécessite an ItemList summary or all-in-one page, the conditional nutrition/temps/rating fields, the video property, and le contenu-policy rule que seulement réel dishes qualify.
Langues
Recipe schema (schema.org/Recipe) is données structurées que indique moteur de recherches une page's dish nom, photo, cook temps, ratings, ingredients, and nutrition, so lune page peut earn Google's recipe rich result — a visual card with a star rating and cook temps que peut apparaître as a carousel or grid and with recipe badges in Google Images. Seulement two properties are strictly requis — image and nom — but the fuller card is populated from the recommended définir: aggregateRating, author, cookTime, prepTime, totalTime, recipeYield, recipeIngredient, recipeInstructions, recipeCategory, recipeCuisine, keywords, datePublished, nutrition.calories, and video. Two choses trip personnes up: the multi-recipe carousel is a host-level fonctionnalité que nécessite an ItemList page (soit a summary page linking to separate recipe pages, or an all-in-one page linking to anchors on itself) — individual recipe markup alone earns at la plupart a unique card, pas a carousel — and Recipe markup is seulement valid pour réel dishes, with Google's propre counterexamples being que 'facial scrub' and 'party ideas' ne sont pas valid recipe noms. Along with VideoObject, ce is un of the two structured-data types in the CreativeWork family que produces a genuine, visible rich result — Google doesn't publish ranking, CTR, or trafic numbers pour it, but the visual upgrade is réel quand it montre. Valid markup seulement rend vous eligible; Google encore decides si to montrer le résultat.
Evidence for this claim Schema.org Recipe describes a recipe and its ingredients, instructions, timing, nutrition, and related metadata. Scope: Schema.org Recipe vocabulary. Confidence: high · Verified: Schema.org: Recipe Evidence for this claim Google's Recipe feature requires name and image and documents additional recommended properties; complete valid markup earns eligibility, not guaranteed display or ranking. Scope: Current Google Recipe structured-data requirements. Confidence: high · Verified: Google Search Central: Recipe structured dataTL;DR — Recipe schema is code vous ajouter to a recipe page que étiquettes the cooking details pour moteur de recherches — “this is the dish name,” “ce is the photo,” “it takes 20 minutes to cook,” “ces are the ingredients,” “ici are the steps,” “readers rated it 4,7 stars.” Ajout it correctement rend lune page eligible pour Google’s recipe rich result — the visual card vous voir with a photo, star rating, and cook temps. Unlike a lot of schema types, ce un has a réel, visible payoff. It fait pas guarantee the card montre up, and a multi-recipe carousel nécessite an supplémentaire piece (an
ItemListpage) on top of the per-recipe markup.
Ce que Recipe schema is
Quand vous regarder at a recipe page, vous pouvez tell the dish nom from the cook temps from
the ingredient liste simplement by reading. A moteur de recherche sees plain text and has to
guess où the recipe arrête and the blog story begins. Recipe schema spells it
out in code, en utilisant the shared schema.org vocabulary —
it tags chaque piece of lune page with ce que it en réalité is: the name, an image,
the prepTime and cookTime, the recipeIngredient liste, the
recipeInstructions steps, and quelconque star aggregateRating.
It’s almost toujours written as JSON-LD — a petit block of code que sits in the page sans modification how lune page semble.
Pourquoi it’s worth doing
The payoff is the recipe rich result, and it’s a bon un. On recipe searches Google montre enhanced cards with a photo, a star rating, the cook temps, and parfois a calorie count — and it groupes les into a carousel or grid at the top of lune page. Marked-up recipes aussi obtenir recipe badges in Google Images. A card comme que stands out plus visually que a plain blue lien, though Google doesn’t publish a guaranteed click-through or ranking lift pour it — the payoff is the visual réel estate itself, pas a documented trafic number.
Ce is un of the two structured-data types (with VideoObject, qui nombreux recipe pages utiliser pour an embedded cooking video) que genuinely earns a mainstream rich result. Si vous run a food site, ce is worth doing correctement.
The two choses vous doit have
Google seulement strictly exige two properties:
- nom — the nom of the dish (a réel dish — plus on que ci-dessous).
- image — a photo of the finished dish. Google’s propre condition: crawlable, indexable, in a pris en charge format, and representative of the dish — it recommends multiple images at 16x9, 4x3, and 1x1 ratios, chaque au moins 50 000 pixels. (Some guides claim a spécifique 1,200px-wide requirement; Google’s docs don’t state un.)
But two properties obtenir vous a bare-minimum valid recipe, pas the complet card. The fuller card — the un personnes en réalité engage with — is populated from the recommended properties, though having les doesn’t guarantee Google renders every field:
- author, datePublished, description
- prepTime, cookTime, totalTime — the times affiché on the card.
- recipeYield — how nombreux servings.
- recipeIngredient — the ingredient liste.
- recipeInstructions — the steps.
- aggregateRating — the star rating (from genuine reader ratings).
- nutrition with calories — feeds the nutrition panel.
- recipeCategory, recipeCuisine, keywords — aider Google comprendre and fichier the recipe.
- video — si vous have a cooking video.
The chose la plupart personnes obtenir incorrect
Individual recipe markup ne fait pas, by itself, produce a carousel. The nice
multi-recipe carousel vous voir at the top of a search is a separate fonctionnalité que
nécessite an ItemList summary page — une page listing several recipes que chaque lien
out to leur propre recipe page. Per-recipe markup earns at la plupart a unique card. Plus
on que in the Avancé tab.
Two plus beginner traps:
- Valid markup ≠ guaranteed rich result. It rend vous eligible; Google encore decides si to afficher the card.
- Seulement réel dishes count. Recipe markup is pour food vous en réalité prepare and eat. Google literally dit “facial scrub” or “party ideas” are pas valid recipe noms. Marking up non-food “recipes” is a content-policy violation.
Vouloir the complet version — the carousel/ItemList mechanics, the nutrition panel, the
ISO 8601 temps format, and pourquoi validated recipes encore don’t montrer? Switch to the
Avancé tab.
Evidence for this claim Schema.org Recipe describes a recipe and its ingredients, instructions, timing, nutrition, and related metadata. Scope: Schema.org Recipe vocabulary. Confidence: high · Verified: Schema.org: Recipe Evidence for this claim Google's Recipe feature requires name and image and documents additional recommended properties; complete valid markup earns eligibility, not guaranteed display or ranking. Scope: Current Google Recipe structured-data requirements. Confidence: high · Verified: Google Search Central: Recipe structured dataTL;DR — schema.org/Recipe markup (usually JSON-LD) rend a recipe page eligible pour Google’s recipe rich result — a visual card (photo, star rating, cook temps, calories) que peut apparaître as a carousel/grid on the SERP and with recipe badges in Google Images. Seulement
imageandnameare strictly requis; the card is really construit from the recommended définir (aggregateRating,author,cookTime,prepTime,totalTime,recipeYield,recipeIngredient,recipeInstructions,recipeCategory,recipeCuisine,keywords,datePublished,nutrition.calories,video). Two implementation facts la plupart round-ups skip: the multi-recipe carousel is a host-level fonctionnalité que exige anItemListpage — soit a summary page linking to separate recipe pages, or an all-in-one page linking to anchors on itself — per-recipe markup alone earns a unique card, jamais a carousel — and Recipe markup is seulement valid pour réel dishes (“facial scrub” and “party ideas” are Google’s propre counterexamples). Times utiliser ISO 8601 durations (PT20M), and the la plupart courant raison a valid recipe doesn’t montrer is a content-policy mismatch entre markup and visible page. Along with VideoObject, ce is un of the two structured-data types in the CreativeWork cluster que produces a genuine, visible rich result — pas a documented ranking, CTR, or trafic factor, simplement a réel visual upgrade quand affiché.
Ce que the recipe rich result semble comme — and how it’s construit
Google renders Recipe markup as a visual card: the image thumbnail, the name,
the aggregateRating stars and count, and the cook temps (from totalTime or
cookTime). On nombreux recipe requêtes ceux cards are grouped into a carousel or
grid at the top of le résultats, and marked-up recipes aussi earn recipe badges in
Google Images, qui is a meaningful discovery surface pour food content.
Google’s framing of the whole point: “Aider utilisateurs trouver votre recipe content by telling Google à propos de votre recipe with données structurées.” That’s the mental model — you’re pas asking pour a ranking boost, you’re making le contenu machine-readable suffisant to qualify pour a spécifique, visible fonctionnalité.
Requis vs. recommended — and pourquoi “required” undersells it
Ce is the property table que matters. Google seulement marks two properties as
requis, qui is genuinely misleading si vous arrêter reading là — a recipe with
simplement name and image validates but produces a thin, unattractive result.
Requis
| Property | Notes |
|---|---|
name | The dish nom. Doit be a réel dish (content policy ci-dessous). |
image | Photo of the finished dish. Doit be crawlable, indexable, in a pris en charge format, and representative of the dish. Google recommends multiple images at 16x9, 4x3, and 1x1 ratios, chaque au moins 50 000 pixels — there’s aucun separate 1,200px-wide requirement some guides cite. |
Recommended (ce is ce que Google uses to construire the fuller card, quand it decides to montrer un — populating les doesn’t force afficher)
| Property | Ce que it drives |
|---|---|
aggregateRating | The star rating + count on the card. Follows Google’s review-snippet guidelines; si vous montrer a unique examiner plutôt que an aggregate, the reviewer doit be a named person or organization. |
author | Attribution. |
datePublished | Freshness signal; ISO 8601 date. |
description | Summary text. |
keywords | Free-text tags (e.g., “winter, comfort food”). Pas the même as recipeCategory. |
nutrition.calories | Feeds the calorie figure Google may montrer. Conditional: si vous définir nutrition.calories, recipeYield doit aussi be défini. |
prepTime | Prep duration, ISO 8601 (PT15M). Google’s guidance: toujours pair it with cookTime. |
cookTime | Cook duration, ISO 8601 (PT1H). Pair it with prepTime. |
totalTime | Total duration. Utiliser totalTime, or the prepTime + cookTime combination — Google accepts soit. |
recipeCategory | Meal type — “appetizer”, “dessert”, “main course”. |
recipeCuisine | Regional cuisine — “Mediterranean”, “Thai”. |
recipeIngredient | Un entry per ingredient, notamment quantity (“2 cups flour”). |
recipeInstructions | The steps — ideally HowToStep objects, optionally grouped into HowToSection. |
recipeYield | Servings or amount produced. Requis si vous supply quelconque per-serving nutrition info. |
video | A VideoObject pour an embedded cooking video — follow VideoObject’s propre requis/recommended fields (voir ci-dessous). |
totalTime and the prepTime/cookTime pair are les deux acceptable to Google; supply
totalTime directement quand vous pouvez, since it’s the unique duration la plupart probable to
render on the card.
Times utiliser ISO 8601 durations, pas free text
A recurring validation échec: cookTime: "20 minutes" is invalid. Durations utiliser
the ISO 8601 format — PT (period of temps) plus the valeur — so 20 minutes is
PT20M, an hour and a half is PT1H30M. Dates comme datePublished utiliser ISO 8601
dates (2026-07-01). Getting ces formats incorrect is un of the la plupart courant raisons a
recipe fails the Résultats enrichis Tester.
The carousel nécessite an ItemList — individual markup doesn’t
Ce is the implementation detail generic “types of schema” listicles almost toujours skip. Là are two différent choses ici:
- The unique recipe card — earned by Recipe markup on the individual recipe page.
- The recipe carousel/grid — a host carousel, qui is a separate fonctionnalité.
To be eligible pour the multi-recipe carousel, vous ajouter an ItemList page — and
Google’s host-carousel documentation supports two différent page models, pas
simplement un:
- Summary page — une page (a category or roundup page — “15 Weeknight Pastas”)
with a short description of chaque item, où chaque
ListItempoints, in order, to the URL of a separate recipe detail page que itself has complet Recipe markup. Ce is the pattern la plupart guides décrire. - All-in-one page — a unique page que contient the complet markup pour every item
itself and doesn’t lien out to separate detail pages; chaque
ListItemcarries anitemobject (withnameand aurlthat’s an anchor on the même page) plutôt que a lien to elsewhere.
Soit model supplies the sequence Google nécessite pour the carousel; qui un fits dépend on si votre recipes déjà live on leur propre URLs (summary page) or you’re presenting les tout on un long page (all-in-one page).
The practical consequence: vous pouveznot obtenir a carousel from un ordinary recipe
page. A unique recipe page with excellent markup earns a unique card. Si vous vouloir
the carousel, vous besoin un of the two ItemList page models ci-dessus, layered on top of
(or containing) complet Recipe markup. Manquant ce is the number-one raison personnes dire
“my markup is perfect but I’m not getting a carousel.”
The nutrition panel
nutrition is a NutritionInformation object, and nutrition.calories is the field
Google calls out by nom — it feeds the calorie figure Google may montrer in the rich
result. That’s a données requirement, pas a promise of a distinct expandable nutrition
panel every temps; Google’s docs décrire the field, pas a guaranteed UI element.
There’s aussi a condition attached: si vous définir nutrition.calories, recipeYield
doit be défini aussi, since calories are stated per serving and Google nécessite the
serving count to faire sense of the number. Vous pouvez ajouter fatContent, proteinContent,
carbohydrateContent, sodiumContent, and the rest, but calories (paired with
recipeYield) is the combination que la plupart reliably surfaces. Valeurs are strings
with units (“240 calories”, “9 g”). It’s a petit block que adds a visible,
differentiating detail to votre card, so it’s worth populating pour quelconque recipe où
vous pouvez compute it honestly.
Video: où Recipe meets VideoObject
Nombreux recipe pages embed a cooking video, and the video property is où Recipe
and VideoObject — the two CreativeWork types que produce genuine, visible rich
results — intersect. Google’s guidance is explicit: video takes a complet
VideoObject and doit follow que feature’s propre requis and recommended
properties (name, description, thumbnailUrl, uploadDate, and a contentUrl
or embedUrl) — supplying a bare video URL n’est pas the même as the documented
subprofile. Fait correct, the recipe peut qualify pour video treatment and the recipe
card, and the video becomes eligible pour its propre surfaces. The per-field
requirements pour the video live with the VideoObject topic — the même object
nests à l’intérieur a recipe, so it’s worth getting que markup correct plutôt que stubbing
in a bare video: {}.
Content policy: seulement réel dishes, matching the visible page
Ce is the la plupart courant raison otherwise-valid markup doesn’t afficher. Recipe markup is scoped to réel food. Google is blunt à propos de it: “Utiliser Recipe données structurées pour content à propos de preparing a particulier dish. Par exemple, ‘facial scrub’ or ‘party ideas’ ne sont pas valid noms pour a dish.” A DIY cleaning “recipe,” a “recipe pour success” listicle, or a roundup of party ideas dressed up as Recipe markup is a policy violation — the markup may réussir the syntactic validator and encore jamais earn a card, or obtenir manually actioned.
The second half of the même principle: the markup doit reflect the visible page. Si votre JSON-LD listes ingredients, times, and a rating que aren’t en réalité on the page a utilisateur sees, that’s a mismatch Google treats as a spam signal. Mark up what’s genuinely là.
Pourquoi votre valid recipe encore montre aucun rich result
Eligibility n’est pas afficher. The usual chain: lune page has to be indexé, the
markup has to be valid, le contenu has to be a réel dish affiché on lune page,
and Google’s systems encore have to decide it’s worth showing — the même
eligibility-not-guarantee rule que governs every structured-data type. Si you’ve
cleared valid markup and content policy and encore voir aucun card, the courant culprits
are: times in free text au lieu de ISO 8601, an aggregateRating with aucun count, an
image que doesn’t meet the size/aspect guidance, or expecting a carousel sans an
ItemList page.
Pour où Recipe sits in the wider structured-data picture, voir the broader Schema Markup and Données structurées hubs ce article nests sous.
AI summary
A condensed prendre on the Avancé version:
- Ce que c’est:
schema.org/Recipemarkup (usually JSON-LD) que étiquettes a recipe page’s dish nom, photo, times, ingredients, steps, nutrition, video, and ratings so Google peut produce the recipe rich result — a visual card (photo, stars, cook temps, calories) que peut apparaître as a carousel/grid and with recipe badges in Google Images. - Visible payoff, pas a documented ranking factor: with VideoObject, un of the two CreativeWork types que produces a genuine, mainstream, visible rich result. Google doesn’t publish ranking, CTR, or trafic numbers pour it.
- Requis vs. recommended: seulement
imageandnameare requis, but que produces a thin result. The fuller card is populated from the recommended définir quand Google chooses to montrer it:aggregateRating,author,cookTime,prepTime,totalTime,recipeYield,recipeIngredient,recipeInstructions,recipeCategory,recipeCuisine,keywords,datePublished,nutrition.calories,video. - Image condition: crawlable, indexable, pris en charge format, representative of the dish; Google recommends multiple images at 16:9/4:3/1:1, chaque au moins 50 000 pixels — aucun separate 1,200px-wide rule as some guides claim.
- Conditional fields:
nutrition.caloriesexigerecipeYield;prepTimepairs withcookTime(or utilisertotalTimeau lieu de the pair); a unique examiner (pas an aggregate) nécessite a namedPerson/Organizationreviewer. - Carousel nécessite an
ItemListpage — two models: a summary page whoseListItems lien to separate recipe detail pages, or an all-in-one page whoseListItems point to anchors on itself. Per-recipe markup alone earns a unique card, jamais a carousel — the la plupart commonly missed step. - Times are ISO 8601 durations:
PT20M,PT1H30M— pas “20 minutes”. Incorrect duration format is a top validation échec. - Video: the
videoproperty takes a completVideoObjectsuivant que feature’s propre requis/recommended fields (name,description,thumbnailUrl,uploadDate,contentUrl/embedUrl) — a bare URL doesn’t satisfy it. - Content policy (top raison valid markup doesn’t montrer): seulement réel dishes qualify — Google’s propre counterexamples are “facial scrub” and “party ideas”. The markup doit aussi reflect the visible page.
- Eligibility ≠ afficher: indexé page + valid markup + réel dish affiché on the page + Google deciding it’s worth showing. Valid markup seulement rend vous eligible.
Documentation officielle
Primary-source documentation from the moteur de recherches.
Google — données structurées
- Recipe (Recipe, HowTo) données structurées — the authoritative référence: requis (
image,name) vs. recommended properties, le contenu-policy guidelines (seulement réel dishes), and the nutrition/temps/rating fields. - Recipe host carousel / summary pages (search gallery) — où the
ItemListsummary-page pattern que powers the multi-recipe carousel is décrit. - VideoObject données structurées — the requirements pour the
VideoObjectque nests in a recipe’svideoproperty. - Résultats enrichis Tester — validate the recipe markup and vérifier rich-result eligibility.
Bing / Microsoft
- Marking up votre site with données structurées — Bing’s general structured-data prise en charge (schema.org, JSON-LD recommended).
Quotes from the source
On-the-record statements from Google. Où a source page exposes the text, the lien is a deep lien que jumps to the quoted passage.
Google docs — the point of Recipe markup
- “Help users find your recipe content by telling Google about your recipe with structured data.” Jump to quote
Google docs — content policy (seulement réel dishes)
- “Use Recipe structured data for content about preparing a particular dish. For example, ‘facial scrub’ or ‘party ideas’ are not valid names for a dish.” Jump to quote
Recipe schema cheat sheet
Requis (the bare minimum to validate)
Recipe.name + Recipe.image. That’s it — but it produces a thin card. Réel
dishes seulement.
Recommended — ce que builds the fuller card, quand Google montre un
| Property | Drives | Condition |
|---|---|---|
aggregateRating | Star rating + count | Follows review-snippet rules; unique examiner nécessite a named reviewer |
author | Attribution | — |
datePublished | Freshness (ISO 8601 date) | — |
description | Summary text | — |
keywords | Free-text tags | — |
nutrition.calories | Calorie figure | Exige recipeYield to aussi be définir |
prepTime | Prep duration (PT15M) | Pair with cookTime |
cookTime | Cook duration (PT1H) | Pair with prepTime |
totalTime | Total duration | Utiliser ce, or prepTime+cookTime |
recipeCategory | Meal type (dessert, principal course) | — |
recipeCuisine | Cuisine (Thai, Italian) | — |
recipeIngredient | Ingredient liste (un entry chaque, w/ quantity) | — |
recipeInstructions | Steps (HowToStep) | — |
recipeYield | Servings | Requis si nutrition.calories is définir |
video | Nested VideoObject (cooking video) | Doit follow VideoObject’s propre requis fields |
Unique card vs. carousel
| Unique recipe card | Recipe carousel/grid | |
|---|---|---|
| Où it lives | Individual recipe page | ItemList page (summary or all-in-one) |
| Markup | Recipe on lune page | Summary: ItemList → ListItem → separate recipe URLs. All-in-one: ItemList → ListItem → anchors on the même page |
| Earned by per-recipe markup alone? | Yes | Aucun — nécessite un of the two ItemList page models |
Formats que break validation
- Times doit be ISO 8601 durations:
PT20M, pas “20 minutes”. - Dates doit be ISO 8601:
2026-07-01. aggregateRatingnécessite aratingCount/reviewCount.imagedoit be crawlable/indexable/pris en charge format; Google recommends multiple images, 16x9 / 4x3 / 1x1, chaque au moins 50 000 pixels (pas a 1,200px-wide rule).
Fast facts
- Format: JSON-LD (recommended, la plupart maintainable).
- Valid markup = eligible, pas guaranteed to montrer — and pas a documented ranking/CTR factor.
- Seulement réel dishes — “facial scrub” / “party ideas” are Google’s invalid exemples.
videotakes a completVideoObject, pas a bare URL.- Markup doit match the visible page.
Do I obtenir a card, a carousel, or nothing?
Fonctionner bas the questions:
1. Is lune page à propos de preparing an réel dish?
- Aucun — it’s a “recipe for success,” a DIY/craft “recipe,” a party-ideas roundup, a facial scrub → Recipe markup n’est pas valid. Google noms “facial scrub” and “party ideas” as invalid dish noms. Don’t mark it up as a Recipe.
- Yes → continuer.
2. Fait the markup match ce que a utilisateur en réalité sees on lune page?
- Aucun (times, ingredients, or a rating in the JSON-LD que aren’t on lune page) → fix que premier; a mismatch is a content-policy problem que peut suppress le résultat même quand the syntax validates.
- Yes → continuer.
3. Do vous have name + image, plus the recommended définir?
- Simplement
name+image→ it validates, but you’ll obtenir a thin card. AjouteraggregateRating, times (ISO 8601),recipeIngredient,recipeInstructions,recipeYield,nutrition.calories,recipeCategory/recipeCuisine. - Complet recommended définir on a unique recipe page → you’re eligible pour a unique recipe card.
4. Do vous vouloir the multi-recipe carousel/grid?
- Yes, and votre recipes chaque have leur propre page → ajouter an
ItemListsummary page (a roundup/category page) whose JSON-LD listes, in order, l’URLs of the individual recipe pages que chaque carry complet Recipe markup. - Yes, but vous présent tout the recipes on un long page → utiliser the all-in-one
ItemListpage model à la place: chaqueListItemcarries the item’s propre markup and points to an anchor on que même page plutôt que a separate URL. - Aucun → the unique recipe card from step 3 is tout vous besoin.
- Soit façon: per-recipe markup alone va pas produce a carousel — vous besoin un
of the two
ItemListpage models.
5. Embedding a cooking video?
- Ajouter the
videoproperty as a completVideoObject(name,description,thumbnailUrl,uploadDate,contentUrl/embedUrl) — pas a bare URL — so it peut qualify pour video treatment alongside the recipe card.
Rule of thumb: per-recipe markup earns the card; the ItemList summary
page earns the carousel; and none of it matters si lune page isn’t a réel dish
matching the visible content.
Recipe schema Mythes et erreurs à éviter
Myth: “Adding Recipe schema guarantees a rich result.” Aucun structured-data type guarantees afficher. Recipe markup rend lune page eligible; lune page encore has to be indexé, be a réel dish, match the visible content, and have Google’s systems decide the card is worth showing. Valid ≠ affiché.
Myth: “Any list-style content counts as a recipe.” Faux, and it’s a content-policy violation. Recipe markup is pour réel dishes. Google’s propre counterexamples: “‘facial scrub’ or ‘party ideas’ ne sont pas valid noms pour a dish.” A “recipe pour productivity,” a craft tutorial, or a DIY cleaner isn’t a Recipe — même si it se produit to have a numbered liste of steps.
Myth: “Individual recipe markup alone gets you a carousel.”
Faux. The multi-recipe carousel/grid is a host-level fonctionnalité que exige an
ItemList page — soit a summary page linking to separate recipe pages, or an
all-in-one page linking to anchors on itself. Per-recipe markup, aucun matter how
complet, earns at la plupart a unique card. Ce is the la plupart courant “my markup is perfect
but aucun carousel” causer.
Mistake: times as free text. cookTime: "20 minutes" fails. Durations are ISO
8601: PT20M, PT1H30M. Dates are ISO 8601 aussi: 2026-07-01. Aussi pair prepTime
with cookTime (or supply totalTime au lieu de the pair) plutôt que mixing les
inconsistently.
Mistake: aggregateRating with aucun count. A rating valeur sans a
ratingCount/reviewCount is invalid — and the ratings doit be genuine reader
ratings en réalité affiché on lune page, pas fabricated or imported from elsewhere. Si vous
montrer a unique examiner au lieu de an aggregate, it nécessite a named Person or
Organization reviewer.
Mistake: nutrition.calories sans recipeYield. Google’s condition is
explicit — si vous définir nutrition.calories, recipeYield doit be défini aussi, since
the calorie figure is per serving.
Mistake: stopping at the two requis properties. name + image validates but
renders a thin, unattractive result. The card personnes click is construit from the
recommended définir — times, ingredients, yield, rating, nutrition.
Mistake: a bare video URL. The video property takes a complet VideoObject
(name, description, thumbnailUrl, uploadDate, contentUrl/embedUrl), pas a
string. A stubbed video object usually fails validation pour que enhancement.
Mistake: markup que doesn’t match lune page. Si the ingredients, times, yield, or rating in votre JSON-LD disagree with ce que the visitor sees, Google treats it as a mismatch and peut suppress le résultat même with valid syntax.
Minimal vs. rich Recipe JSON-LD
The minimal valid recipe
Simplement the two requis properties. Ce validates — but it earns, at meilleur, a thin card with aucun times, aucun rating, aucun ingredients:
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Weeknight Tomato Basil Pasta",
"image": "https://example.com/img/tomato-basil-pasta.jpg"
}The même recipe, fait richly
Complet recommended définir — times in ISO 8601, ingredient and step listes, a genuine
aggregate rating, nutrition paired with recipeYield, and a nested VideoObject.
Ce is ce que builds the fuller card (images ci-dessous meet Google’s 50 000-pixel,
16x9/4x3/1x1 guidance):
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Weeknight Tomato Basil Pasta",
"image": [
"https://example.com/img/pasta-1x1.jpg",
"https://example.com/img/pasta-4x3.jpg",
"https://example.com/img/pasta-16x9.jpg"
],
"author": { "@type": "Person", "name": "Patrick Stox" },
"datePublished": "2026-07-01",
"description": "A 25-minute tomato and basil pasta for busy weeknights.",
"recipeCategory": "main course",
"recipeCuisine": "Italian",
"keywords": "pasta, tomato, weeknight, vegetarian",
"prepTime": "PT10M",
"cookTime": "PT15M",
"totalTime": "PT25M",
"recipeYield": "4 servings",
"recipeIngredient": [
"1 lb spaghetti",
"2 cups cherry tomatoes, halved",
"1/2 cup fresh basil, torn",
"3 tbsp olive oil",
"2 cloves garlic, minced"
],
"recipeInstructions": [
{ "@type": "HowToStep", "text": "Boil the spaghetti until al dente." },
{ "@type": "HowToStep", "text": "Saute garlic and tomatoes in olive oil." },
{ "@type": "HowToStep", "text": "Toss with pasta and fresh basil; serve." }
],
"nutrition": {
"@type": "NutritionInformation",
"calories": "480 calories"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"ratingCount": "312"
},
"video": {
"@type": "VideoObject",
"name": "How to make Weeknight Tomato Basil Pasta",
"description": "A quick walkthrough of the 25-minute tomato basil pasta.",
"thumbnailUrl": "https://example.com/img/pasta-video-thumb.jpg",
"contentUrl": "https://example.com/video/tomato-basil-pasta.mp4",
"uploadDate": "2026-07-01"
}
}The carousel nécessite an ItemList page — summary or all-in-one
To earn the multi-recipe carousel, vous ajouter un of two ItemList page models.
Summary page — une page (dire, “15 Weeknight Pastas”) carries an ItemList que
points, in order, to separate individual recipe pages — chaque of qui has complet
Recipe markup comme the un ci-dessus:
{
"@context": "https://schema.org/",
"@type": "ItemList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"url": "https://example.com/recipes/tomato-basil-pasta"
},
{
"@type": "ListItem",
"position": 2,
"url": "https://example.com/recipes/garlic-butter-linguine"
}
]
}All-in-one page — a unique page holds every recipe’s complet markup itself and
doesn’t lien out; chaque ListItem carries an item with the recipe’s propre données and a
url that’s an anchor on que même page:
{
"@context": "https://schema.org/",
"@type": "ItemList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"item": {
"@type": "Recipe",
"name": "Weeknight Tomato Basil Pasta",
"url": "https://example.com/recipes/roundup#tomato-basil-pasta"
}
},
{
"@type": "ListItem",
"position": 2,
"item": {
"@type": "Recipe",
"name": "Garlic Butter Linguine",
"url": "https://example.com/recipes/roundup#garlic-butter-linguine"
}
}
]
}Soit model supplies the sequence Google nécessite; sans un of les, vous obtenir unique cards, jamais a carousel.
Courant Résultats enrichis Tester échecs → fixes
| Symptom / error | Probable causer | Fix |
|---|---|---|
| Duration field rejected | cookTime: "20 minutes" | Utiliser ISO 8601: "PT20M" |
| Invalid date | Free-text date | ISO 8601 date: "2026-07-01" |
aggregateRating invalid | Aucun count | Ajouter ratingCount / reviewCount |
| Thin card, aucun times/rating | Seulement name + image | Ajouter the recommended properties |
| Pas a valid recipe | Non-dish content (“party ideas”) | Don’t utiliser Recipe markup |
| Aucun carousel despite bon markup | Aucun ItemList page | Ajouter a summary page or an all-in-one page |
video enhancement fails | Bare URL in video | Utiliser a complet VideoObject |
| Nutrition/calories field ignored | nutrition.calories définir sans recipeYield | Ajouter recipeYield alongside nutrition.calories |
Testez vos connaissances: Recipe Schema
Five rapide questions on schema.org/Recipe, the requis vs. recommended split, the carousel mechanics, and le contenu policy. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
My writing on ce topic
I haven’t publié a standalone Recipe schema guide of my propre — so plutôt que point vous at something que doesn’t exist, the honest déplacer is to send vous to the principal sources ci-dessous and to the connexe structured-data fonctionner on ce site. Pour the broader vocabulary and où Recipe fits, voir the Balisage de données structurées and Données structurées hubs; pour the AI angle, Balisage de données structurées pour AI.
From autour the industry
- Recipe données structurées (Recherche Google Central) — the authoritative référence pour requis/recommended properties, le contenu policy, and the nutrition/temps/rating fields.
- Search gallery / recipe host carousel (Google) — où the
ItemListsummary-page pattern behind the carousel is documented. - VideoObject données structurées (Google) — the requirements pour the
VideoObjectque nests in a recipe’svideoproperty. - Résultats enrichis Tester (Google) — validate the markup and vérifier eligibility.
Yoast, Semrush, and AIOSEO chaque cover Recipe reasonably accurately at a surface level
— they’ll tell vous it earns stars, cook temps, and an image. Où ils arrêter short is
implementation depth: the ItemList carousel mechanics, the nutrition properties, the
ISO 8601 duration format, and the courant validation échecs. Ce is the un
CreativeWork subtype où the competitor gap isn’t accuracy — it’s que Recipe obtient
un paragraph among six autre types, with none of the carousel-eligibility or
troubleshooting detail ci-dessus. That’s the differentiator ici.
Journal des modifications
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.