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.

Première publication : 1 juil. 2026 · Dernière mise à jour : 3 août 2026 · Advanced
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.

TL;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 image and name are 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 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 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é.

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 data

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é.

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

PropertyNotes
nameThe dish nom. Doit be a réel dish (content policy ci-dessous).
imagePhoto 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)

PropertyCe que it drives
aggregateRatingThe 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.
authorAttribution.
datePublishedFreshness signal; ISO 8601 date.
descriptionSummary text.
keywordsFree-text tags (e.g., “winter, comfort food”). Pas the même as recipeCategory.
nutrition.caloriesFeeds the calorie figure Google may montrer. Conditional: si vous définir nutrition.calories, recipeYield doit aussi be défini.
prepTimePrep duration, ISO 8601 (PT15M). Google’s guidance: toujours pair it with cookTime.
cookTimeCook duration, ISO 8601 (PT1H). Pair it with prepTime.
totalTimeTotal duration. Utiliser totalTime, or the prepTime + cookTime combination — Google accepts soit.
recipeCategoryMeal type — “appetizer”, “dessert”, “main course”.
recipeCuisineRegional cuisine — “Mediterranean”, “Thai”.
recipeIngredientUn entry per ingredient, notamment quantity (“2 cups flour”).
recipeInstructionsThe steps — ideally HowToStep objects, optionally grouped into HowToSection.
recipeYieldServings or amount produced. Requis si vous supply quelconque per-serving nutrition info.
videoA 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.

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 ListItem points, 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 ListItem carries an item object (with name and a url that’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.

Evidence for this claim If nutrition.calories is supplied, Google requires recipeYield to identify the number of servings. Current documentation describes a data condition; it does not promise a distinct expandable nutrition panel in every result. Scope: web Confidence: high · Verified: Recipe structured data

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.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.