Recipe Schema

How to implement schema.org/Recipe markup for Google's recipe rich result — the two required properties vs. the recommended set that builds the fuller card, why the carousel needs an ItemList summary or all-in-one page, the conditional nutrition/time/rating fields, the video property, and the content-policy rule that only real dishes qualify.

First published: Jul 1, 2026 · Last updated: Jul 18, 2026 · Advanced
demand #11 in Structured Data#35 in On-Page#176 in Technical SEO#236 on the site

Recipe schema (schema.org/Recipe) is structured data that tells search engines a page's dish name, photo, cook time, ratings, ingredients, and nutrition, so the page can earn Google's recipe rich result — a visual card with a star rating and cook time that can appear as a carousel or grid and with recipe badges in Google Images. Only two properties are strictly required — image and name — but the fuller card is populated from the recommended set: aggregateRating, author, cookTime, prepTime, totalTime, recipeYield, recipeIngredient, recipeInstructions, recipeCategory, recipeCuisine, keywords, datePublished, nutrition.calories, and video. Two things trip people up: the multi-recipe carousel is a host-level feature that needs an ItemList page (either 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 most a single card, not a carousel — and Recipe markup is only valid for actual dishes, with Google's own counterexamples being that 'facial scrub' and 'party ideas' are not valid recipe names. Along with VideoObject, this is one of the two structured-data types in the CreativeWork family that produces a genuine, visible rich result — Google doesn't publish ranking, CTR, or traffic numbers for it, but the visual upgrade is real when it shows. Valid markup only makes you eligible; Google still decides whether to show the result.

TL;DR — schema.orgSchema markup is code that uses the schema.org vocabulary to label what your content means so search engines can understand it and show rich results. It's most often written in JSON-LD, and it's not a direct ranking factor./Recipe markup (usually JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal.) makes a recipe page eligible for Google’s recipe rich result — a visual card (photo, star rating, cook time, calories) that can appear as a carousel/grid on the SERP and with recipe badges in Google Images. Only image and name are strictly required; the card is really built from the recommended set (aggregateRating, author, cookTime, prepTime, totalTime, recipeYield, recipeIngredient, recipeInstructions, recipeCategory, recipeCuisine, keywords, datePublished, nutrition.calories, video). Two implementation facts most round-ups skip: the multi-recipe carousel 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 alone earns a single card, never a carousel — and Recipe markup is only valid for actual dishes (“facial scrub” and “party ideas” are Google’s own counterexamples). Times use ISO 8601 durations (PT20M), and the most common reason a valid recipe doesn’t show is a content-policy mismatch between markup and visible page. Along with VideoObject, this is one of the two structured-data types in the CreativeWork cluster that produces a genuine, visible rich result — not a documented ranking, CTR, or traffic factor, just a real visual upgrade when shown.

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

What the recipe rich result looks like — and how it’s built

Google renders Recipe markup as a visual card: the image thumbnail, the name, the aggregateRating stars and count, and the cook time (from totalTime or cookTime). On many recipe queries those cards are grouped into a carousel or grid at the top of the results, and marked-up recipes also earn recipe badges in Google Images, which is a meaningful discovery surface for food content.

Google’s framing of the whole point: “Help users find your recipe content by telling Google about your recipe with structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding..” 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.

This is the property table that matters. Google only marks two properties as required, which is genuinely misleading if you stop reading there — a recipe with just name and image validates but produces a thin, unattractive result.

Required

PropertyNotes
nameThe dish name. Must be a real dish (content policy below).
imagePhoto of the finished dish. Must be crawlable, indexable, in a supported format, and representative of the dish. Google recommends multiple images at 16x9, 4x3, and 1x1 ratios, each at least 50,000 pixels — there’s no separate 1,200px-wide requirement some guides cite.

Recommended (this is what Google uses to build the fuller card, when it decides to show one — populating them doesn’t force display)

PropertyWhat it drives
aggregateRatingThe star rating + count on the card. Follows Google’s review-snippet guidelines; if you show a single review rather than an aggregate, the reviewer must be a named person or organization.
authorAttribution.
datePublishedFreshness signal; ISO 8601 date.
descriptionSummary text.
keywordsFree-text tags (e.g., “winter, comfort food”). Not the same as recipeCategory.
nutrition.caloriesFeeds the calorie figure Google may show. Conditional: if you set nutrition.calories, recipeYield must also be defined.
prepTimePrep duration, ISO 8601 (PT15M). Google’s guidance: always pair it with cookTime.
cookTimeCook duration, ISO 8601 (PT1H). Pair it with prepTime.
totalTimeTotal duration. Use totalTime, or the prepTime + cookTime combination — Google accepts either.
recipeCategoryMeal type — “appetizer”, “dessert”, “main course”.
recipeCuisineRegional cuisine — “Mediterranean”, “Thai”.
recipeIngredientOne entry per ingredient, including quantity (“2 cups flour”).
recipeInstructionsThe steps — ideally HowToStep objects, optionally grouped into HowToSection.
recipeYieldServings or amount produced. Required if you supply any per-serving nutrition info.
videoA VideoObject for an embedded cooking video — follow VideoObject’s own required/recommended fields (see below).

totalTime and the prepTime/cookTime pair are both acceptable to Google; supply totalTime directly when you can, since it’s the single duration most likely to render on the card.

Times use ISO 8601 durations, not free text

A recurring validation failure: cookTime: "20 minutes" is invalid. Durations use the ISO 8601 format — PT (period of time) plus the value — so 20 minutes is PT20M, an hour and a half is PT1H30M. Dates like datePublished use ISO 8601 dates (2026-07-01). Getting these formats wrong is one of the most common reasons a recipe fails the Rich ResultsRich results (formerly 'rich snippets') are enhanced search listings — stars, images, prices, breadcrumbs, video thumbnails, and more — that Google and Bing build from structured data. They're a display feature, not a ranking factor, and eligibility never guarantees they'll show. Test.

This is the implementation detail generic “types of schema” listicles almost always skip. There are two different things here:

  • The single recipe card — earned by Recipe markup on the individual recipe page.
  • The recipe carousel/grid — a host carouselA carousel rich result (Google calls it a \"host carousel\") is a horizontally scrollable row of cards, all from one site, built by wrapping two or more same-type items in an ItemList with position values. Only a short, shifting list of schema.org types qualifies — and a second, geographically limited beta carousel system now runs alongside the original., which is a separate feature.

To be eligible for the multi-recipe carousel, you add an ItemList page — and Google’s host-carousel documentation supports two different page models, not just one:

  • Summary page — a page (a category or roundup page — “15 Weeknight Pastas”) with a short description of each item, where each ListItem points, in order, to the URL of a separate recipe detail page that itself has full Recipe markup. This is the pattern most guides describe.
  • All-in-one page — a single page that contains the full markup for every item itself and doesn’t link out to separate detail pages; each ListItem carries an item object (with name and a url that’s an anchor on the same page) rather than a link to elsewhere.

Either model supplies the sequence Google needs for the carousel; which one fits depends on whether your recipes already live on their own URLs (summary page) or you’re presenting them all on one long page (all-in-one 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.”

The nutrition panel

nutrition is a NutritionInformation object, and nutrition.calories is the field Google calls out by name — it feeds the calorie figure Google may show in the rich result. That’s a data requirement, not a promise of a distinct expandable nutrition panel every time; Google’s docs describe the field, not a guaranteed UI element. There’s also a condition attached: if you set nutrition.calories, recipeYield must be defined too, since calories are stated per serving and Google needs the serving count to make sense of the number. You can add fatContent, proteinContent, carbohydrateContent, sodiumContent, and the rest, but calories (paired with recipeYield) is the combination that most reliably surfaces. Values are strings with units (“240 calories”, “9 g”). It’s a small block that adds a visible, differentiating detail to your card, so it’s worth populating for any recipe where you can compute it honestly.

Video: where Recipe meets VideoObject

Many recipe pages embed a cooking video, and the video property is where Recipe and VideoObject — the two CreativeWork types that produce genuine, visible rich results — intersect. Google’s guidance is explicit: video takes a full VideoObject and must follow that feature’s own required and recommended properties (name, description, thumbnailUrl, uploadDate, and a contentUrl or embedUrl) — supplying a bare video URL is not the same as the documented subprofile. Done right, the recipe can qualify for video treatment and the recipe card, and the video becomes eligible for its own surfaces. The per-field requirements for the video live with the VideoObject topic — the same object nests inside a recipe, so it’s worth getting that markup right rather than stubbing in a bare video: {}.

Content policy: only real dishes, matching the visible page

This is the most common reason otherwise-valid markup doesn’t display. Recipe markup is scoped to actual food. Google is blunt about it: “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.” A DIY cleaning “recipe,” a “recipe for success” listicle, or a roundup of party ideas dressed up as Recipe markup is a policy violation — the markup may pass the syntactic validator and still never earn a card, or get manually actioned.

The second half of the same principle: the markup must reflect the visible page. If your JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal. lists ingredients, times, and a rating that aren’t actually on the page a user sees, that’s a mismatch Google treats as a spam signal. Mark up what’s genuinely there.

Why your valid recipe still shows no rich result

Eligibility is not display. The usual chain: the page has to be indexedStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., the markup has to be valid, the content has to be a real dish shown on the page, and Google’s systems still have to decide it’s worth showing — the same eligibility-not-guarantee rule that governs every structured-data type. If you’ve cleared valid markup and content policy and still see no card, the common culprits are: times in free text instead of ISO 8601, an aggregateRating with no count, an image that doesn’t meet the size/aspect guidance, or expecting a carousel without an ItemList page.

For where Recipe sits in the wider structured-data picture, see the broader Schema Markup and Structured Data hubs this article nests under.

Add an expert note

Pin an expert quote

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