Recipe Structured Data: Ingredients, Steps, Cook Time & Recipe Cards
Recipes are one of the most richly displayed rich result types: star ratings, cooking time, images, and nutrition information can all appear in search results, and multiple recipes can form a swipeable carousel. To earn these displays, the key is converting ingredients, steps, and timing information from plain text into structured data, while ensuring they match exactly with visible page content.
What is Recipe#
Recipe describes a cookable recipe. Google uses it to generate recipe rich media cards in search results, which may include dish name, images, ratings, cooking duration, calories, and more. Multiple recipes can be arranged horizontally in a "recipe carousel" (host carousel).
Official documentation entry: Google Search Central: Recipe structured data.
Required & Recommended Fields#
| Field | Required | Description |
|---|---|---|
name | Required | Recipe name |
image | Required | Finished dish image, multiple aspect ratios recommended (1:1, 4:3, 16:9) |
recipeIngredient | Recommended | One entry per ingredient, including quantity |
recipeInstructions | Recommended | Use HowToStep for step-by-step, not a large block of text |
prepTime / cookTime / totalTime | Recommended | ISO 8601 duration, e.g. PT30M |
recipeYield | Recommended | Servings/yield, e.g. "4 servings" |
nutrition | Recommended | NutritionInformation, e.g. calories |
aggregateRating | Recommended | Real user ratings, must be visible on page |
video | Recommended | Nested VideoObject, cooking video |
author / datePublished | Recommended | Author and publish date |
Complete JSON-LD Example#
{
"@context": "https://schema.org",
"@type": "Recipe",
"name": "番茄炒蛋",
"image": [
"https://example.com/photos/tomato-egg-1x1.webp",
"https://example.com/photos/tomato-egg-4x3.webp",
"https://example.com/photos/tomato-egg-16x9.webp"
],
"author": { "@type": "Person", "name": "林记厨房" },
"datePublished": "2026-06-24",
"description": "家常番茄炒蛋,10 分钟出锅。",
"prepTime": "PT5M",
"cookTime": "PT5M",
"totalTime": "PT10M",
"recipeYield": "2 人份",
"recipeCategory": "主菜",
"recipeCuisine": "中餐",
"nutrition": {
"@type": "NutritionInformation",
"calories": "220 kcal"
},
"recipeIngredient": [
"番茄 2 个",
"鸡蛋 3 个",
"食盐 适量",
"白糖 1 小勺"
],
"recipeInstructions": [
{ "@type": "HowToStep", "text": "鸡蛋打散,番茄切块。" },
{ "@type": "HowToStep", "text": "热油炒蛋盛出。" },
{ "@type": "HowToStep", "text": "炒番茄出汁,加盐糖,倒回鸡蛋翻匀出锅。" }
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.8,
"ratingCount": 152
}
}
Time in ISO 8601 Duration#
All time fields must use ISO 8601 duration format, not plain text or pure numbers.
| Meaning | Correct Format | Incorrect Format |
|---|---|---|
| 30 minutes | PT30M | 30 minutes / 30 |
| 1 hour 30 minutes | PT1H30M | 1.5 hours |
| 2 hours | PT2H | 2h |
When providing both prepTime and cookTime, it's recommended to also provide totalTime. All three should be logically consistent.
Steps as HowToStep#
Writing recipeInstructions as a HowToStep array is easier to parse than a single block of text and performs better in step displays. When grouping is needed, use HowToSection to wrap multiple steps (e.g. "Preparation", "Cooking", "Plating"). Each step can include name, url (anchor), image.
Recipe Carousel ItemList#
To create a horizontally swipeable carousel of multiple recipes, use ItemList on the list page. Each item's url should point to its respective independent recipe detail page, and the actual Recipe markup belongs on the detail page.
{
"@context": "https://schema.org",
"@type": "ItemList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"url": "https://example.com/recipes/tomato-egg"
},
{
"@type": "ListItem",
"position": 2,
"url": "https://example.com/recipes/egg-fried-rice"
}
]
}
Ratings Must Be Real and Visible#
Adding aggregateRating to recipes helps click-through rates significantly, but ratings must come from user reviews that are genuinely visible on the page, and data must be authentic. When you don't have a review system or real data, don't fabricate star ratings—this is consistent with compliance requirements for Review Snippet.
Why This Site Doesn't Implement Recipe#
MagicSEO teaches SEO, it's not a recipe site. This page has no real recipes, ingredients, or cooking steps. Therefore, we won't force Recipe markup just for demonstration purposes.
Validation and Monitoring#
- Use Rich Results Test to check required and recommended fields.
- Verify that ingredients, steps, timing, and ratings match visible page content.
- Confirm all times use ISO 8601 duration format.
- For carousels, check that each url in ItemList opens the corresponding recipe detail page.
- After launch, monitor invalid items in Search Console's recipe enhancement report.
Common Mistakes#
| Mistake | Why It's Risky | Fix |
|---|---|---|
| Time in plain text or numbers | Cannot parse | Use PT30M, PT1H30M |
| Steps as one big block | Poor step display | Split into HowToStep array |
| Fabricated star ratings | Structured data violation | Only markup real visible reviews |
| Missing finished dish image | image is required | Provide multi-aspect dish images |
| Carousel aggregates external recipes | Violates guidelines | ItemList only points to your own recipes |
Recipe Launch Checklist#
- name and image (multiple aspect ratios) complete
- recipeIngredient has each ingredient with quantity
- recipeInstructions uses HowToStep for steps
- prepTime/cookTime/totalTime use ISO 8601 duration
- recipeYield, nutrition added as appropriate
- aggregateRating from real visible reviews
- video (if present) with compliant nested VideoObject
- Carousel uses ItemList pointing to your own detail pages
- Page visible content matches JSON-LD
- Rich Results Test shows no critical errors
Frequently Asked Questions#
Which fields are required for Recipe structured data?
Google's hard requirements for Recipe are name and image. But to get meaningful recipe rich results, it's strongly recommended to complete recipeIngredient, recipeInstructions, cookTime/prepTime/totalTime, recipeYield, nutrition, aggregateRating, video and other recommended fields. The more complete the fields, the richer the recipe card.
Why must time fields use ISO 8601 duration format?
cookTime, prepTime, and totalTime must use ISO 8601 duration format, for example PT30M for 30 minutes, PT1H30M for 1 hour 30 minutes. Writing plain text like "half hour" or the number 30 directly cannot be parsed. If you provide both prepTime and cookTime, it's recommended to also provide totalTime.
How do I create a recipe carousel (host carousel)?
A recipe carousel requires using ItemList on a list page to chain multiple recipes together. Each item in the list uses url to point to its respective independent recipe detail page, and the actual Recipe markup is placed on the detail page. Note this is for a carousel of multiple recipes on your own website—don't aggregate recipes from other sites.
Can I add star ratings to recipes?
Yes, but ratings must come from user reviews that are genuinely visible on the page. When embedding aggregateRating into Recipe, the page should display the corresponding average score and review count, with real data. Don't make up star ratings without real reviews, otherwise it's a structured data violation.