Guide : Recipe Schema
Comment implement schema.org/Recipe markup pour Google's recipe rich résultat — le deux requis properties vs. le recommended définir que construit le fuller card, pourquoi le carousel nécessite an ItemList summary or tous-dans-un page, le conditional nutrition/temps/rating champs, le video property, et le contenu-policy règle que seulement réel dishes qualify.
Recipe schema (schema.org/Recipe) est données structurées que indique moteur de recherches une page's dish nom, photo, cook temps, ratings, ingredients, et nutrition, donc lune page peut earn Google's recipe rich résultat — a visual card avec a star rating et cook temps que peut apparaître as a carousel or grid et avec recipe badges dans Google Images. Seulement deux properties sont strictly requis — image et nom — mais le fuller card est populated depuis le recommended définir: aggregateRating, author, cookTime, prepTime, totalTime, recipeYield, recipeIngredient, recipeInstructions, recipeCategory, recipeCuisine, mots-clés, datePublished, nutrition.calories, et video. Deux choses trip personnes up: le multi-recipe carousel est a host-level fonctionnalité que nécessite an ItemList page (soit a summary page linking à séparé recipe pages, or an tous-dans-un page linking à anchors on itself) — individual recipe markup alone earns à la plupart a unique card, pas a carousel — et Recipe markup est seulement valide pour réel dishes, avec Google's propre counterexamples étant que 'facial scrub' et 'party ideas' ne sont pas valide recipe noms. Along avec VideoObject, ce est un de le deux structured-données types dans le CreativeWork family que produces a genuine, visible rich résultat — Google ne fait pas publish classement, CTR, or trafic numbers pour il, mais le visual upgrade est réel quand il montre. Valide markup seulement rend vous eligible; Google encore decides si à montrer le résultat.
«> TL;DR — Recipe schema is code you add to a recipe page that *labels the
Preuve à l’appui de cette affirmation Schema.org Recipe describes a recipe and its ingredients, instructions, timing, nutrition, and related metadata. Portée : Schema.org Recipe vocabulary. Niveau de confiance : élevé · Vérifié : Schema.org: Recipe Preuve à l’appui de cette affirmation Google's Recipe feature requires name and image and documents additional recommended properties; complete valid markup earns eligibility, not guaranteed display or ranking. Portée : Current Google Recipe structured-data requirements. Niveau de confiance : élevé · Vérifié : Google Search Central: Recipe structured datacooking details* for search engines — “this is the dish name,” “this is the photo,” “it takes 20 minutes to cook,” “these are the ingredients,” “here are the steps,” “readers rated it 4.7 stars.” Adding it correctly makes the page eligible for Google’s recipe rich result — the visual card you see with a photo, star rating, and cook time. Unlike a lot of schema types, this one has a real, visible payoff. It does not guarantee the card shows up, and a multi-recipe carousel needs an extra piece (an
ItemListpage) on top of the per-recipe markup.
» (Traduction) (Résumé en français de la section quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Ce que Recipe schema is
Quand vous regarder à a recipe page, vous pouvez tell le dish nom depuis le cook temps depuis
le ingredient liste simplement par reading. A moteur de recherche voit plain texte et a à
guess où le recipe arrête et le blog story begins. Recipe schema spells il
out dans code, en utilisant le shared schema.org vocabulary —
il balises chaque piece de lune page avec ce que il en réalité est: le name, an image,
le prepTime et cookTime, le recipeIngredient liste, le
recipeInstructions étapes, et 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
Le payoff est le recipe rich résultat, et c’est a bon un. On recipe searches Google montre enhanced cards avec a photo, a star rating, le cook temps, et parfois a calorie count — et il groupes les dans a carousel or grid à le top de lune page. Marked-up recipes aussi obtenir recipe badges dans Google Images. A card comme que stands out plus visually que a plain blue lien, though Google ne fait pas publish a guaranteed click-via or classement lift pour il — le payoff est le visual réel estate itself, pas a documented trafic number.
Ce est un de le deux structured-données types (avec VideoObject, qui nombreux recipe pages utiliser pour an embedded cooking video) que genuinely earns a mainstream rich résultat. Si vous exécuter a food site, ce est worth doing correctement.
The two choses vous doit have
Google seulement strictly exige two properties:
- nom — le nom de le dish (a réel dish — plus on que ci-dessous).
- image — a photo de le finished dish. Google’s propre condition: crawlable, indexable, dans a pris en charge format, et representative de le dish — il recommends plusieurs images à 16x9, 4x3, et 1x1 ratios, chaque au moins 50 000 pixels. (Some guides claim a spécifique 1,200px-wide requirement; Google’s docs ne pas state un.)
Mais deux properties obtenir vous a bare-minimum valide recipe, pas le complet card. Le fuller card — le un personnes en réalité engage avec — est populated depuis le recommended properties, though having les ne fait pas guarantee Google renders chaque champ:
- author, datePublished, description
- prepTime, cookTime, totalTime — le times affiché on le card.
- recipeYield — comment nombreux servings.
- recipeIngredient — le ingredient liste.
- recipeInstructions — le étapes.
- aggregateRating — le star rating (depuis genuine lecteur ratings).
- nutrition avec calories — feeds le nutrition panel.
- recipeCategory, recipeCuisine, mots-clés — aider Google comprendre et fichier le recipe.
- video — si vous ont a cooking video.
The chose la plupart personnes obtenir incorrect
Individual recipe markup ne fait pas, par itself, produce a carousel. Le nice
multi-recipe carousel vous voir à le top de a recherche est a séparé fonctionnalité que
nécessite an ItemList summary page — une page listing plusieurs recipes que chaque lien
out à leur propre recipe page. Per-recipe markup earns à la plupart a unique card. Plus
on que dans le Avancé tab.
Two plus beginner traps:
- Valide markup ≠ guaranteed rich résultat. Il rend vous eligible; Google encore decides si à afficher le card.
- Seulement réel dishes count. Recipe markup est pour food vous en réalité prepare et eat. Google literally dit “facial scrub” or “party ideas” sont pas valide recipe noms. Marking up non-food “recipes” est a contenu-policy violation.
Vouloir le complet version — le carousel/ItemList mechanics, le nutrition panel, le
ISO 8601 temps format, et pourquoi validated recipes encore ne pas montrer? Switch à le
Avancé tab.
Preuve à l’appui de cette affirmation Schema.org Recipe describes a recipe and its ingredients, instructions, timing, nutrition, and related metadata. Portée : Schema.org Recipe vocabulary. Niveau de confiance : élevé · Vérifié : Schema.org: Recipe Preuve à l’appui de cette affirmation Google's Recipe feature requires name and image and documents additional recommended properties; complete valid markup earns eligibility, not guaranteed display or ranking. Portée : Current Google Recipe structured-data requirements. Niveau de confiance : élevé · Vérifié : Google Search Central: Recipe structured dataTL;DR — schema.org/Recipe markup (généralement JSON-LD) rend a recipe page eligible pour Google’s recipe rich résultat — a visual card (photo, star rating, cook temps, calories) que peut apparaître as a carousel/grid on le SERP et avec recipe badges dans Google Images. Seulement
imageetnamesont strictly requis; le card est vraiment construit depuis le recommended définir (aggregateRating,author,cookTime,prepTime,totalTime,recipeYield,recipeIngredient,recipeInstructions,recipeCategory,recipeCuisine,keywords,datePublished,nutrition.calories,video). Deux implementation facts la plupart round-ups skip: le multi-recipe carousel est a host-level fonctionnalité que exige anItemListpage — soit a summary page linking à séparé recipe pages, or an tous-dans-un page linking à anchors on itself — per-recipe markup alone earns a unique card, jamais a carousel — et Recipe markup est seulement valide pour réel dishes (“facial scrub” et “party ideas” sont Google’s propre counterexamples). Times utiliser ISO 8601 durations (PT20M), et le la plupart courant raison a valide recipe ne fait pas montrer est a contenu-policy mismatch entre markup et visible page. Along avec VideoObject, ce est un de le deux structured-données types dans le CreativeWork cluster que produces a genuine, visible rich résultat — pas a documented classement, CTR, or trafic factor, simplement a réel visual upgrade quand affiché.
Ce que le recipe rich résultat semble comme — et comment c’est construit
Google renders Recipe markup as a visual card: le image thumbnail, le name,
le aggregateRating stars et count, et le cook temps (depuis totalTime or
cookTime). On nombreux recipe requêtes ceux cards sont grouped dans a carousel or
grid à le top de le résultats, et marked-up recipes aussi earn recipe badges dans
Google Images, qui est a meaningful discovery surface pour food contenu.
«Google’s framing of the whole point: “Help users find your recipe content by telling Google about your recipe with structured data.” That’s the mental model — you’re not asking for a ranking boost, you’re making the content machine-readable enough to qualify for a specific, visible feature. » (Traduction) (Résumé en français de la section vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Requis vs. recommended — and pourquoi “required” undersells it
Ce est le property tableau que matters. Google seulement marks deux properties as
requis, qui est genuinely misleading si vous arrêter reading là — a recipe avec
simplement name et image valide mais produces a thin, unattractive résultat.
Requis
| Property | Notes |
|---|---|
name | Le dish nom. Doit être a réel dish (contenu policy ci-dessous). |
image | Photo de le finished dish. Doit être crawlable, indexable, dans a pris en charge format, et representative de le dish. Google recommends plusieurs images à 16x9, 4x3, et 1x1 ratios, chaque au moins 50 000 pixels — il y a aucun séparé 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 il drives |
|---|---|
aggregateRating | Le star rating + count on le card. Suit Google’s review-extrait guidelines; si vous montrer a unique examiner plutôt que an aggregate, le reviewer doit être a named person or organization. |
author | Attribution. |
datePublished | Freshness signal; ISO 8601 date. |
description | Summary texte. |
keywords | Gratuit-texte balises (e.g., “winter, comfort food”). Pas le même as recipeCategory. |
nutrition.calories | Feeds le calorie figure Google peut montrer. Conditional: si vous définir nutrition.calories, recipeYield doit aussi être défini. |
prepTime | Prep duration, ISO 8601 (PT15M). Google’s guidance: toujours pair il avec cookTime. |
cookTime | Cook duration, ISO 8601 (PT1H). Pair il avec prepTime. |
totalTime | Total duration. Utiliser totalTime, or le 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 | Le étapes — ideally HowToStep objects, optionally grouped dans HowToSection. |
recipeYield | Servings or amount produced. Requis si vous supply quelconque per-diffusion nutrition info. |
video | A VideoObject pour an embedded cooking video — suivre VideoObject’s propre requis/recommended champs (voir ci-dessous). |
totalTime et le prepTime/cookTime pair sont les deux acceptable à Google; supply
totalTime directement quand vous pouvez, since c’est le unique duration la plupart probable à
rendre on le card.
Times utiliser ISO 8601 durations, pas free text
A recurring validation échec: cookTime: "20 minutes" est invalide. Durations utiliser
le ISO 8601 format — PT (period de temps) plus le valeur — donc 20 minutes est
PT20M, an hour et a half est PT1H30M. Dates comme datePublished utiliser ISO 8601
dates (2026-07-01). Getting ces formats incorrect est un de le la plupart courant raisons a
recipe fails le Résultats enrichis Tester.
The carousel nécessite an ItemList — individual markup doesn’t
Ce est le implementation detail générique “types of schema” listicles presque toujours skip. Là sont deux différent choses ici:
- Le unique recipe card — earned par Recipe markup on le individual recipe page.
- Le recipe carousel/grid — a host carousel, qui est a séparé fonctionnalité.
À être eligible pour le multi-recipe carousel, vous ajouter an ItemList page — et
Google’s host-carousel documentation prend en charge deux différent page models, pas
simplement un:
- Summary page — une page (a category or roundup page — “15 Weeknight Pastas”)
avec a court description de chaque élément, où chaque
ListItempoints, dans order, à le URL de a séparé recipe detail page que itself a complet Recipe markup. Ce est le modèle la plupart guides décrire. - Tous-dans-un page — a unique page que contient le complet markup pour chaque élément
itself et ne fait pas lien out à séparé detail pages; chaque
ListItemcarries anitemobject (avecnameet aurlc’est an anchor on le même page) plutôt que a lien à elsewhere.
Soit model supplies le sequence Google nécessite pour le carousel; qui un fits dépend on si votre recipes déjà actif on leur propre URLs (summary page) or vous êtes presenting les tout on un long page (tous-dans-un page).
«The practical consequence: you cannot get a carousel from one ordinary recipe
page. A single recipe page with excellent markup earns a single card. If you want
the carousel, you need one of the two ItemList page models above, layered on top of
(or containing) full Recipe markup. Missing this is the number-one reason people say
“my markup is perfect but I’m not getting a carousel.”
» (Traduction) (Résumé en français de la section quarante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
The nutrition panel
nutrition est a NutritionInformation object, et nutrition.calories est le champ
Google calls out par nom — il feeds le calorie figure Google peut montrer dans le rich
résultat. c’est a données requirement, pas a promise de a distinct expandable nutrition
panel chaque temps; Google’s docs décrire le champ, pas a guaranteed UI element.
il y a aussi a condition attached: si vous définir nutrition.calories, recipeYield
doit être défini aussi, since calories sont stated per diffusion et Google nécessite le
diffusion count à faire sense de le number. Vous pouvez ajouter fatContent, proteinContent,
carbohydrateContent, sodiumContent, et le rest, mais calories (paired avec
recipeYield) est le combination que la plupart reliably surfaces. Valeurs sont strings
avec units (“240 calories”, “9 g”). c’est a petit bloquer que ajoute a visible,
differentiating detail à votre card, donc c’est worth populating pour quelconque recipe où
vous pouvez compute il honestly.
Video: où Recipe meets VideoObject
Nombreux recipe pages embed a cooking video, et le video property est où Recipe
et VideoObject — le deux CreativeWork types que produce genuine, visible rich
résultats — intersect. Google’s guidance est explicit: video takes a complet
VideoObject et doit suivre que fonctionnalité’s propre requis et recommended
properties (name, description, thumbnailUrl, uploadDate, et a contentUrl
or embedUrl) — supplying a bare video URL n’est pas le même as le documented
subprofile. Fait correct, le recipe peut qualify pour video treatment et le recipe
card, et le video becomes eligible pour son propre surfaces. Le per-champ
requirements pour le video actif avec le VideoObject topic — le même object
nests à l’intérieur a recipe, donc c’est worth getting que markup correct plutôt que stubbing
dans a bare video: {}.
Contenu policy: seulement réel dishes, matching le visible page
Ce est le la plupart courant raison otherwise-valide markup ne fait pas afficher. Recipe markup est scoped à réel food. Google est blunt à propos de il: “Utiliser Recipe données structurées pour contenu à propos de preparing a particulier dish. Par exemple, ‘facial scrub’ or ‘party ideas’ ne sont pas valide noms pour a dish.” A DIY cleaning “recipe,” a “recipe pour success” listicle, or a roundup de party ideas dressed up as Recipe markup est a policy violation — le markup peut réussir le syntactic validator et encore jamais earn a card, or obtenir manuellement actioned.
Le deuxième half de le même principle: le markup doit reflect le visible page. Si votre JSON-LD listes ingredients, times, et a rating que ne sont pas en réalité on le page a utilisateur voit, c’est a mismatch Google treats as a spam signal. Mark up qu’est-ce que genuinely là.
Pourquoi votre valid recipe encore montre aucun rich result
Eligibility n’est pas afficher. Le usual chain: lune page a à être indexé, le
markup a à être valide, le contenu a à être a réel dish affiché on lune page,
et Google’s systèmes encore ont à decide c’est worth showing — le même
eligibility-pas-guarantee règle que governs chaque structured-données type. Si vous avez
cleared valide markup et contenu policy et encore voir aucun card, le courant culprits
sont: times dans gratuit texte au lieu de ISO 8601, an aggregateRating avec aucun count, an
image que ne fait pas meet le size/aspect guidance, or expecting a carousel sans an
ItemList page.
Pour où Recipe sits dans le wider structured-données picture, voir le broader Schema Markup et 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 (généralement JSON-LD) que étiquettes a recipe page’s dish nom, photo, times, ingredients, étapes, nutrition, video, et ratings donc Google peut produce le recipe rich résultat — a visual card (photo, stars, cook temps, calories) que peut apparaître as a carousel/grid et avec recipe badges dans Google Images. - Visible payoff, pas a documented facteur de classement: avec VideoObject, un de le deux CreativeWork types que produces a genuine, mainstream, visible rich résultat. Google ne fait pas publish classement, CTR, or trafic numbers pour il.
- Requis vs. recommended: seulement
imageetnamesont requis, mais que produces a thin résultat. Le fuller card est populated depuis le recommended définir quand Google chooses à montrer il:aggregateRating,author,cookTime,prepTime,totalTime,recipeYield,recipeIngredient,recipeInstructions,recipeCategory,recipeCuisine,keywords,datePublished,nutrition.calories,video. - Image condition: crawlable, indexable, pris en charge format, representative de le dish; Google recommends plusieurs images à 16:9/4:3/1:1, chaque au moins 50 000 pixels — aucun séparé 1,200px-wide règle as some guides claim.
- Conditional champs:
nutrition.caloriesexigerecipeYield;prepTimepairs aveccookTime(or utilisertotalTimeau lieu de le pair); a unique examiner (pas an aggregate) nécessite a namedPerson/Organizationreviewer. - Carousel nécessite an
ItemListpage — deux models: a summary page whoseListItems lien à séparé recipe detail pages, or an tous-dans-un page whoseListItems point à anchors on itself. Per-recipe markup alone earns a unique card, jamais a carousel — le la plupart commonly missed étape. - Times sont ISO 8601 durations:
PT20M,PT1H30M— pas “20 minutes”. Incorrect duration format est a top validation échec. - Video: le
videoproperty takes a completVideoObjectsuivant que fonctionnalité’s propre requis/recommended champs (name,description,thumbnailUrl,uploadDate,contentUrl/embedUrl) — a bare URL ne fait pas satisfy il. - Contenu policy (top raison valide markup ne fait pas montrer): seulement réel dishes qualify — Google’s propre counterexamples sont “facial scrub” et “party ideas”. Le markup doit aussi reflect le visible page.
- Eligibility ≠ afficher: indexé page + valide markup + réel dish affiché on le page + Google deciding c’est worth showing. Valide markup seulement rend vous eligible.
«## Official documentation » (Traduction) (Résumé en français de la section soixante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation from the search engines. » (Traduction) (Résumé en français de la section soixante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google — structured data
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Recipe (Recipe, HowTo) structured data — the authoritative reference: required (image, name) vs. recommended properties, the content-policy guidelines (only real dishes), and the nutrition/time/rating fields.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Recipe host carousel / summary pages (search gallery) — where the ItemList summary-page pattern that powers the multi-recipe carousel is described.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- VideoObject structured data — the requirements for the VideoObject that nests in a recipe’s video property.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Rich Results Test — validate the recipe markup and check rich-result eligibility.
» (Traduction) (Résumé en français de la section soixante-deux, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«Bing / Microsoft » (Traduction) (Résumé en français de la section soixante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- Marking up your site with structured data — Bing’s general structured-data support (schema.org, JSON-LD recommended). » (Traduction) (Résumé en français de la section soixante-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«Note: Bing doesn’t publish a Recipe-specific required/recommended property table the way Google does — it supports the same schema.org/Recipe vocabulary. Treat its behavior as broadly consistent with schema.org rather than separately documented. » (Traduction) (Résumé en français de la section soixante-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section soixante-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On-le-record statements depuis Google. Où a page source exposes le texte, le lien est a deep lien que jumps à le quoted passage.
Google docs — le point de Recipe markup
«- “Help users find your recipe content by telling Google about your recipe with structured data.” Jump to quote » (Traduction) (Résumé en français de la section soixante-dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
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 » (Traduction) (Résumé en français de la section soixante-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Note: Google has not published a Recipe-specific on-record rep quote on eligibility-vs-display; the “valid markup only makes you eligible” framing that appears elsewhere in this article is the evergreen structured-data rule Google applies across every rich-result type, not a Recipe-specific statement. » (Traduction) (Résumé en français de la section soixante-treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Recipe schema cheat sheet » (Traduction) (Résumé en français de la section soixante-seize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Required (the bare minimum to validate) » (Traduction) (Résumé en français de la section soixante-dix-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Recipe.name + Recipe.image. That’s it — but it produces a thin card. Real
dishes only.
» (Traduction) (Résumé en français de la section soixante-dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Recommended — what builds the fuller card, when Google shows one » (Traduction) (Résumé en français de la section soixante-dix-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| Property | Drives | Condition |
| --- | --- | --- |
| aggregateRating | Star rating + count | Follows review-snippet rules; single review needs a named reviewer |
| author | Attribution | — |
| datePublished | Freshness (ISO 8601 date) | — |
| description | Summary text | — |
| keywords | Free-text tags | — |
| nutrition.calories | Calorie figure | Requires recipeYield to also be set |
| prepTime | Prep duration (PT15M) | Pair with cookTime |
| cookTime | Cook duration (PT1H) | Pair with prepTime |
| totalTime | Total duration | Use this, or prepTime+cookTime |
| recipeCategory | Meal type (dessert, main course) | — |
| recipeCuisine | Cuisine (Thai, Italian) | — |
| recipeIngredient | Ingredient list (one entry each, w/ quantity) | — |
| recipeInstructions | Steps (HowToStep) | — |
| recipeYield | Servings | Required if nutrition.calories is set |
| video | Nested VideoObject (cooking video) | Must follow VideoObject’s own required fields |
» (Traduction) (Résumé en français de la section quatre-vingts, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Single card vs. carousel » (Traduction) (Résumé en français de la section quatre-vingt-un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«| | Single recipe card | Recipe carousel/grid |
| --- | --- | --- |
| Where it lives | Individual recipe page | ItemList page (summary or all-in-one) |
| Markup | Recipe on the page | Summary: ItemList → ListItem → separate recipe URLs. All-in-one: ItemList → ListItem → anchors on the same page |
| Earned by per-recipe markup alone? | Yes | No — needs one of the two ItemList page models |
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Formats that break validation
» (Traduction) (Résumé en français de la section quatre-vingt-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Times must be ISO 8601 durations: PT20M, not “20 minutes”.
» (Traduction) (Résumé en français de la section quatre-vingt-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Dates must be ISO 8601: 2026-07-01.
» (Traduction) (Résumé en français de la section quatre-vingt-trois, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- aggregateRating needs a ratingCount/reviewCount.
» (Traduction) (Résumé en français de la section quatre-vingt-trois, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- image must be crawlable/indexable/supported format; Google recommends multiple
images, 16x9 / 4x3 / 1x1, each at least 50,000 pixels (not a 1,200px-wide rule).
» (Traduction) (Résumé en français de la section quatre-vingt-trois, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
Rapide facts
- Format: JSON-LD (recommended, la plupart maintainable).
- Valide markup = eligible, pas guaranteed à montrer — et pas a documented classement/CTR factor.
- Seulement réel dishes — “facial scrub” / “party ideas” sont Google’s invalide exemples.
videotakes a completVideoObject, pas a bare URL.- Markup doit match le visible page.
Do I obtenir a card, a carousel, or nothing?
Fonctionner bas the questions:
1. Est lune page à propos de preparing an réel dish?
- Aucun — c’est a “recipe for success,” a DIY/craft “recipe,” a party-ideas roundup, a facial scrub → Recipe markup n’est pas valide. Google noms “facial scrub” et “party ideas” as invalide dish noms. ne pas mark il up as a Recipe.
- Oui → continuer.
2. Fait le markup match ce que a utilisateur en réalité voit on lune page?
- Aucun (times, ingredients, or a rating dans le JSON-LD que ne sont pas on lune page) → corriger que premier; a mismatch est a contenu-policy problème que peut suppress le résultat même quand le syntax valide.
- Oui → continuer.
3. Faire vous ont name + image, plus le recommended définir?
- Simplement
name+image→ il valide, mais vous’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 → vous êtes eligible pour a unique recipe card.
4. Faire vous vouloir le multi-recipe carousel/grid?
- Oui, et votre recipes chaque ont leur propre page → ajouter an
ItemListsummary page (a roundup/category page) whose JSON-LD listes, dans order, l’URLs de le individual recipe pages que chaque carry complet Recipe markup. - Oui, mais vous présent tout le recipes on un long page → utiliser le tous-dans-un
ItemListpage model à la place: chaqueListItemcarries le élément’s propre markup et points à an anchor on que même page plutôt que a séparé URL. - Aucun → le unique recipe card depuis étape 3 est tout vous besoin.
- Soit façon: per-recipe markup alone va pas produce a carousel — vous besoin un
de le deux
ItemListpage models.
5. Embedding a cooking video?
- Ajouter le
videoproperty as a completVideoObject(name,description,thumbnailUrl,uploadDate,contentUrl/embedUrl) — pas a bare URL — donc il peut qualify pour video treatment alongside le recipe card.
Règle de thumb: per-recipe markup earns le card; le ItemList summary
page earns le carousel; et none de il matters si lune page n’est pas a réel dish
matching le visible contenu.
Recipe schema Mythes et erreurs à éviter
Myth: “Adding Recipe schema guarantees a rich result.” Aucun structured-données type guarantees afficher. Recipe markup rend lune page eligible; lune page encore a à être indexé, être a réel dish, match le visible contenu, et ont Google’s systèmes decide le card est worth showing. Valide ≠ 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.”
False. The multi-recipe carousel/grid is a host-level feature that requires an
ItemList page — either a summary page linking to separate recipe pages, or an
all-in-one page linking to anchors on itself. Per-recipe markup, no matter how
complete, earns at most a single card. This is the most common “my markup is perfect
but no carousel” cause.
» (Traduction) (Résumé en français de la section cent, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Mistake: times as gratuit texte. cookTime: "20 minutes" fails. Durations sont ISO
8601: PT20M, PT1H30M. Dates sont ISO 8601 aussi: 2026-07-01. Aussi pair prepTime
avec cookTime (or supply totalTime au lieu de le pair) plutôt que mixing les
inconsistently.
Mistake: aggregateRating avec aucun count. A rating valeur sans a
ratingCount/reviewCount est invalide — et le ratings doit être genuine lecteur
ratings en réalité affiché on lune page, pas fabricated or imported depuis elsewhere. Si vous
montrer a unique examiner au lieu de an aggregate, il 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 à le deux requis properties. name + image valide mais
renders a thin, unattractive résultat. Le card personnes click est construit depuis le
recommended définir — times, ingredients, yield, rating, nutrition.
Mistake: a bare video URL. Le video property takes a complet VideoObject
(name, description, thumbnailUrl, uploadDate, contentUrl/embedUrl), pas a
string. A stubbed video object généralement fails validation pour que enhancement.
Mistake: markup que ne fait pas match lune page. Si le ingredients, times, yield, or rating dans votre JSON-LD disagree avec ce que le visitor voit, Google treats il as a mismatch et peut suppress le résultat même avec valide syntax.
«## Minimal vs. rich Recipe JSON-LD » (Traduction) (Résumé en français de la section cent neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«### The minimal valid recipe » (Traduction) (Résumé en français de la section cent dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Just the two required properties. This validates — but it earns, at best, a thin card with no times, no rating, no ingredients: » (Traduction) (Résumé en français de la section cent onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Weeknight Tomato Basil Pasta",
"image": "https://example.com/img/tomato-basil-pasta.jpg"
} «### The same recipe, done richly » (Traduction) (Résumé en français de la section cent treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Full recommended set — times in ISO 8601, ingredient and step lists, a genuine
aggregate rating, nutrition paired with recipeYield, and a nested VideoObject.
This is what builds the fuller card (images below meet Google’s 50,000-pixel,
16x9/4x3/1x1 guidance):
» (Traduction) (Résumé en français de la section cent quatorze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
{
"@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 needs an ItemList page — summary or all-in-one » (Traduction) (Résumé en français de la section cent seize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
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"
}
]
}Tous-dans-un page — a unique page holds chaque recipe’s complet markup itself et
ne fait pas lien out; chaque ListItem carries an item avec le recipe’s propre données et a
url c’est 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 le sequence Google nécessite; sans un de 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, le requis vs. recommended split, le carousel mechanics, et le contenu policy. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
My writing on ce topic
Je haven’t publié a standalone Recipe schema guide de mon propre — donc plutôt que point vous à quelque chose que ne fait pas exist, le honest déplacer est à send vous à le principal sources ci-dessous et à le connexe structured-données fonctionner on ce site. Pour le broader vocabulary et où Recipe fits, voir le Balisage de données structurées et Données structurées hubs; pour le AI angle, Balisage de données structurées pour AI.
Depuis autour le industry
- Recipe données structurées (Recherche Google Central) — le authoritative référence pour requis/recommended properties, le contenu policy, et le nutrition/temps/rating champs.
- Recherche gallery / recipe host carousel (Google) — où le
ItemListsummary-page modèle behind le carousel est documented. - VideoObject données structurées (Google) — le requirements pour le
VideoObjectque nests dans a recipe’svideoproperty. - Résultats enrichis Tester (Google) — valider le markup et vérifier eligibility.
Yoast, Semrush, et AIOSEO chaque cover Recipe reasonably accurately à a surface level
— ils’ll tell vous il earns stars, cook temps, et an image. Où ils arrêter court est
implementation depth: le ItemList carousel mechanics, le nutrition properties, le
ISO 8601 duration format, et le courant validation échecs. Ce est le un
CreativeWork subtype où le concurrent gap n’est pas accuracy — c’est que Recipe obtient
un paragraph parmi six autre types, avec none de le carousel-eligibility or
troubleshooting detail ci-dessus. c’est le 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.