Panduan Recipe Schema

cara implement schema.org/Recipe markup untuk Google's recipe rich hasil — two diperlukan properties vs. recommended set itu membangun fuller card, why carousel perlu sebuah ItemList summary atau semua-di-one halaman, conditional nutrition/time/rating fields, video property, dan konten-policy aturan itu hanya nyata dishes qualify.

Pertama kali diterbitkan: 1 Jul 2026 · Terakhir diperbarui: 3 Agu 2026 · Advanced
Bahasa

Recipe schema (schema.org/Recipe) adalah data terstruktur itu tells mesin pencari sebuah halaman's dish name, photo, cook time, ratings, ingredients, dan nutrition, so halaman dapat earn Google's recipe rich hasil — sebuah visual card dengan sebuah star rating dan cook time itu dapat appear sebagai sebuah carousel atau grid dan dengan recipe badges di Google Images. hanya two properties adalah strictly diperlukan — image dan name — tetapi fuller card adalah populated dari recommended set: aggregateRating, author, cookTime, prepTime, totalTime, recipeYield, recipeIngredient, recipeInstructions, recipeCategory, recipeCuisine, keywords, datePublished, nutrition.calories, dan video. Two things trip people up: multi-recipe carousel adalah sebuah host-tingkat fitur itu perlu sebuah ItemList halaman (either sebuah summary halaman linking untuk separate recipe halaman, atau sebuah semua-di-one halaman linking untuk anchors pada itself) — individual recipe markup alone earns di sebagian besar sebuah single card, not sebuah carousel — dan Recipe markup adalah hanya valid untuk actual dishes, dengan Google's own counterexamples menjadi itu 'facial scrub' dan 'party ideas' adalah not valid recipe names. Along dengan VideoObject, ini adalah one dari two structured-data jenis di CreativeWork family itu produces sebuah genuine, terlihat rich hasil — Google doesn't publish peringkat, CTR, atau traffic angka untuk ini, tetapi visual upgrade adalah nyata when ini menampilkan. Valid markup hanya membuat Anda eligible; Google masih decides whether untuk tampilkan hasil.

TL;DR — schema.org/Recipe markup (biasanya JSON-LD) membuat sebuah recipe halaman eligible untuk Google’s recipe rich hasil — sebuah visual card (photo, star rating, cook time, calories) itu dapat appear sebagai sebuah carousel/grid pada SERP dan dengan recipe badges di Google Images. hanya image dan name adalah strictly diperlukan; card adalah really dibangun dari recommended set (aggregateRating, author, cookTime, prepTime, totalTime, recipeYield, recipeIngredient, recipeInstructions, recipeCategory, recipeCuisine, keywords, datePublished, nutrition.calories, video). Two implementation facts sebagian besar round-ups skip: multi-recipe carousel adalah sebuah host-tingkat fitur itu memerlukan sebuah ItemList halaman — either sebuah summary halaman linking untuk separate recipe halaman, atau sebuah semua-di-one halaman linking untuk anchors pada itself — per-recipe markup alone earns sebuah single card, tidak pernah sebuah carousel — dan Recipe markup adalah hanya valid untuk actual dishes (“facial scrub” (terjemahan) “facial scrub” dan “party ideas” (terjemahan) “party ideas” adalah Google’s own counterexamples). Times gunakan ISO 8601 durations (PT20M), dan paling umum alasan sebuah valid recipe doesn’t tampilkan adalah sebuah konten-policy mismatch antara markup dan terlihat halaman. Along dengan VideoObject, ini adalah one dari two structured-data jenis di CreativeWork cluster itu produces sebuah genuine, terlihat rich hasil — not sebuah documented peringkat, CTR, atau traffic factor, hanya sebuah nyata visual upgrade when ditampilkan.

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 recipe rich hasil looks like — dan how ini adalah dibangun

Google renders Recipe markup sebagai sebuah visual card: image thumbnail, name, aggregateRating stars dan count, dan cook time (dari totalTime atau cookTime). pada banyak recipe kueri itu cards adalah grouped ke sebuah carousel atau grid di top dari hasil, dan marked-up recipes juga earn recipe badges di Google Images, which adalah sebuah meaningful penemuan surface untuk food konten.

Google’s framing dari whole poin: “Help users find your recipe content by telling Google about your recipe with structured data.” (terjemahan) “Help pengguna temukan Anda recipe konten oleh telling Google tentang Anda recipe dengan data terstruktur.” itu’s mental model — Anda’re not asking untuk sebuah peringkat boost, Anda’re membuat konten machine-readable enough untuk qualify untuk sebuah spesifik, terlihat fitur.

ini adalah property table itu penting. Google hanya marks two properties sebagai diperlukan, which adalah genuinely misleading jika Anda stop reading there — sebuah recipe dengan hanya name dan image validates tetapi produces sebuah thin, unattractive hasil.

diperlukan

PropertyNotes
namedish name. harus menjadi sebuah nyata dish (konten policy below).
imagePhoto dari finished dish. harus menjadi dapat di-crawl, dapat diindeks, di sebuah didukung format, dan representative dari dish. Google recommends multiple images di 16x9, 4x3, dan 1x1 ratios, setiap setidaknya 50 000 pixels — there’s no separate 1,200px-wide requirement beberapa guides cite.

Recommended (ini adalah what Google menggunakan untuk bangun fuller card, when ini decides untuk tampilkan one — populating them doesn’t force display)

PropertyWhat ini drives
aggregateRatingstar rating + count pada card. mengikuti Google’s review-snippet guidelines; jika Anda tampilkan sebuah single review alih-alih sebuah aggregate, reviewer harus menjadi sebuah named person atau organization.
authorAttribution.
datePublishedFreshness signal; ISO 8601 date.
descriptionSummary text.
keywordsFree-text tags (e.g., “winter, comfort food” (terjemahan) “winter, comfort food”). Not yang sama sebagai recipeCategory.
nutrition.caloriesFeeds calorie figure Google dapat tampilkan. Conditional: jika Anda set nutrition.calories, recipeYield harus juga menjadi defined.
prepTimePrep duration, ISO 8601 (PT15M). Google’s guidance: selalu pair ini dengan cookTime.
cookTimeCook duration, ISO 8601 (PT1H). Pair ini dengan prepTime.
totalTimeTotal duration. gunakan totalTime, atau prepTime + cookTime combination — Google accepts either.
recipeCategoryMeal jenis — “appetizer” (terjemahan) “appetizer”, “dessert” (terjemahan) “dessert”, “main course” (terjemahan) “main course”.
recipeCuisineRegional cuisine — “Mediterranean” (terjemahan) “Mediterranean”, “Thai” (terjemahan) “Thai”.
recipeIngredientOne entry per ingredient, including quantity (“2 cups flour” (terjemahan) “2 cups flour”).
recipeInstructionslangkah — ideally HowToStep objects, optionally grouped ke HowToSection.
recipeYieldServings atau amount produced. diperlukan jika Anda supply apa pun per-serving nutrition info.
videosebuah VideoObject untuk sebuah embedded cooking video — ikuti VideoObject’s own diperlukan/recommended fields (see below).

totalTime dan prepTime/cookTime pair adalah both acceptable untuk Google; supply totalTime directly when Anda dapat, since ini adalah single duration sebagian besar mungkin untuk render pada card.

Times gunakan ISO 8601 durations, not free text

sebuah recurring validation failure: cookTime: "20 minutes" adalah invalid. Durations gunakan ISO 8601 format — PT (period dari time) plus nilai — so 20 minutes adalah PT20M, sebuah hour dan sebuah half adalah PT1H30M. Dates like datePublished gunakan ISO 8601 dates (2026-07-01). Getting ini formats wrong adalah one dari paling umum alasan sebuah recipe fails Rich hasil Test.

ini adalah implementation detail generic “types of schema” (terjemahan) “jenis dari schema” listicles almost selalu skip. ada two berbeda things here:

  • ** single recipe card** — earned oleh Recipe markup pada individual recipe halaman.
  • ** recipe carousel/grid** — sebuah host carousel, which adalah sebuah separate fitur.

untuk menjadi eligible untuk multi-recipe carousel, Anda tambahkan sebuah ItemList halaman — dan Google’s host-carousel documentation mendukung two berbeda halaman models, not hanya one:

  • Summary halaman — sebuah halaman (sebuah category atau roundup halaman — “15 Weeknight Pastas” (terjemahan) “15 Weeknight Pastas”) dengan sebuah pendek deskripsi dari setiap item, where setiap ListItem poin, di order, untuk URL dari sebuah separate recipe detail halaman itu itself memiliki full Recipe markup. ini adalah pattern sebagian besar guides describe.
  • semua-di-one halaman — sebuah single halaman itu berisi full markup untuk setiap item itself dan doesn’t tautan out untuk separate detail halaman; setiap ListItem carries sebuah item object (dengan name dan sebuah url itu’s sebuah anchor pada sama halaman) rather daripada sebuah tautan untuk elsewhere.

Either model supplies sequence Google perlu untuk carousel; which one fits depends pada whether Anda recipes sudah live pada mereka own URLs (summary halaman) atau Anda’re presenting them semua pada one panjang halaman (semua-di-one halaman).

practical consequence: Anda cannot get sebuah carousel dari one ordinary recipe halaman. sebuah single recipe halaman dengan excellent markup earns sebuah single card. jika Anda ingin carousel, Anda perlu one dari two ItemList halaman models above, layered pada top dari (atau containing) full Recipe markup. Missing ini adalah angka-one alasan people say “my markup is perfect but I’m not getting a carousel.” (terjemahan) “my markup adalah perfect tetapi I’m not getting sebuah carousel.”

nutrition panel

nutrition adalah sebuah NutritionInformation object, dan nutrition.calories adalah field Google panggilan out oleh name — ini feeds calorie figure Google dapat tampilkan di rich hasil. itu’s sebuah data requirement, not sebuah promise dari sebuah distinct expandable nutrition panel setiap time; Google’s docs describe field, not sebuah guaranteed UI element. There’s juga sebuah condition attached: jika Anda set nutrition.calories, recipeYield harus menjadi defined too, since calories adalah stated per serving dan Google perlu serving count untuk membuat sense dari angka. Anda dapat tambahkan fatContent, proteinContent, carbohydrateContent, sodiumContent, dan rest, tetapi calories (paired dengan recipeYield) adalah combination itu sebagian besar reliably surfaces. nilai adalah strings dengan units (“240 calories” (terjemahan) “240 calories”, “9 g” (terjemahan) “9 g”). ini adalah sebuah kecil block itu menambahkan sebuah terlihat, differentiating detail untuk Anda card, so ini adalah worth populating untuk apa pun recipe where Anda dapat compute ini 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: where Recipe meets VideoObject

banyak recipe halaman embed sebuah cooking video, dan video property adalah where Recipe dan VideoObject — two CreativeWork jenis itu produce genuine, terlihat rich hasil — intersect. Google’s guidance adalah explicit: video takes sebuah full VideoObject dan harus ikuti itu fitur’s own diperlukan dan recommended properties (name, description, thumbnailUrl, uploadDate, dan sebuah contentUrl atau embedUrl) — supplying sebuah bare video URL adalah not yang sama sebagai documented subprofile. Done right, recipe dapat qualify untuk video treatment dan recipe card, dan video becomes eligible untuk -nya own surfaces. per-field requirements untuk video live dengan VideoObject topic — yang sama object nests inside sebuah recipe, so ini adalah worth getting itu markup right alih-alih stubbing di sebuah bare video: {}.

konten policy: hanya nyata dishes, matching terlihat halaman

ini adalah paling umum alasan otherwise-valid markup doesn’t display. Recipe markup adalah scoped untuk actual food. Google adalah blunt tentang ini: “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.” (terjemahan) “gunakan Recipe data terstruktur untuk konten tentang preparing sebuah particular dish. misalnya, ‘facial scrub’ atau ‘party ideas’ adalah not valid names untuk sebuah dish.” sebuah DIY cleaning “recipe,” (terjemahan) “recipe,” sebuah “recipe for success” (terjemahan) “recipe untuk success” listicle, atau sebuah roundup dari party ideas dressed up sebagai Recipe markup adalah sebuah policy violation — markup dapat pass syntactic validator dan masih tidak pernah earn sebuah card, atau get manually actioned.

kedua half dari yang sama principle: ** markup harus reflect terlihat halaman.** jika Anda JSON-LD lists ingredients, times, dan sebuah rating itu aren’t actually pada halaman sebuah pengguna sees, itu’s sebuah mismatch Google treats sebagai sebuah spam signal. Mark up what’s genuinely there.

Why Anda valid recipe masih menampilkan no rich hasil

Eligibility adalah not display. usual chain: halaman memiliki untuk menjadi terindeks, markup memiliki untuk menjadi valid, konten memiliki untuk menjadi sebuah nyata dish ditampilkan pada halaman, dan Google’s sistem masih memiliki untuk decide ini adalah worth showing — yang sama eligibility-not-guarantee aturan itu governs setiap structured-data jenis. jika Anda’ve cleared valid markup dan konten policy dan masih see no card, umum culprits adalah: times di free text alih-alih ISO 8601, sebuah aggregateRating dengan no count, sebuah image itu doesn’t meet size/aspect guidance, atau expecting sebuah carousel without sebuah ItemList halaman.

untuk where Recipe sits di wider structured-data picture, see broader Schema Markup dan data terstruktur hubs ini artikel nests di bawah.

Add an expert note

Pin an expert quote

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