# Recipe schema: Google requires a name and an image, and 5 of 60 nodes declared an empty method or ingredient list

> Google's recipe documentation marks exactly two properties required, name and image, and leaves recipeIngredient and recipeInstructions as recommendations. Lantad asked all 1,419 corpus hostnames for robots.txt on 18 October 2026, read every permitted home page with no JavaScript executed, followed each site's own link to a recipe surface and read that too. 60 Recipe nodes answered on 60 pages across 13 hosts. 59 carried both required properties, and 5 declared a method or an ingredient list that contained no text at all.

- Canonical page: https://lantad.co/blog/recipe-schema-5-of-60-nodes-declared-an-empty-field
- This file: https://lantad.co/blog/recipe-schema-5-of-60-nodes-declared-an-empty-field.md
- Last substantive update: 2026-10-18

## Key facts

- **Published:** 2026-10-18
- **Category:** Findings
- **Author:** Lantad
- **Length:** 3990 words
- **Takeaway 1:** Recipe schema requires only two properties for Google's recipe rich result, name and image, and the documentation Lantad read on 18 October 2026 lists recipeIngredient and recipeInstructions among the recommendations rather than the requirements.
- **Takeaway 2:** Lantad read 60 Recipe nodes on 60 pages across 13 hosts on 18 October 2026, and 59 of the 60 carried both of the properties Google marks as required.
- **Takeaway 3:** Five of those 60 nodes declared a method or an ingredient list holding no text at all: an empty string on bhf.org.uk, an empty array on two rte.ie pages, an empty step on one eatmila.com page and an empty ingredient entry on another.
- **Takeaway 4:** 325 of 368 instruction strings and 529 of 605 ingredient strings in that markup appeared verbatim in the page's own visible text, so on this sample the markup and the prose mostly agreed.
- **Takeaway 5:** On four nbcnews.com recipe pages the JSON-LD was the only readable copy of the recipe: between 483 and 587 visible words against roughly 360 KB of delivered HTML, with no ingredient or instruction string present in the page text.

## Summary

A recipe is the easiest page on the web to describe to a machine. It has a name, a list of things, an ordered set of steps and a time. If [structured data](https://lantad.co/glossary/structured-data) is going to help an answer engine state something useful, a recipe is where it should show. So the question worth settling is not whether sites declare the markup, which food publishers overwhelmingly do, but whether the part a reader would actually cook from is inside it.

The answer separates into two findings. The first is about the specification rather than the sites: Google's own requirements for a recipe rich result name two properties, and neither of them is the ingredients or the method. The second is what that permits in practice. Across the 60 Recipe nodes measured here, 59 satisfied the required list, 55 carried text in both substance properties, and 5 declared one of those properties with nothing inside it: an empty string, an empty array, or a step whose text was the empty string. Lantad ran this on 18 October 2026 across the 1,419 hostnames described on [the methodology page](https://lantad.co/methodology), reading each surface once as [LantadBot](https://lantad.co/bot) with no browser involved, then reading all 60 again the same day.

## What does Recipe schema require, and what does it only recommend?

Two documents govern this and they do different jobs. [schema.org's Recipe type](https://schema.org/Recipe) defines the vocabulary: Recipe sits below HowTo in the hierarchy, which runs Thing, then CreativeWork, then HowTo, then Recipe, and it adds nine properties of its own, among them cookTime, nutrition, recipeCategory, recipeCuisine, recipeIngredient, recipeInstructions, recipeYield, cookingMethod and suitableForDiet. What schema.org does not do is mark any property as required. It states expected value types and nothing about obligation, which is true of the whole vocabulary and is why a schema.org page alone never tells you what a search engine needs.

The obligation comes from the search engine. [Google's recipe structured data documentation](https://developers.google.com/search/docs/appearance/structured-data/recipe), carrying a last-updated date of 2026-09-08 UTC on the day it was read, lists its required properties under a heading of that name and the list has two entries: image and name. Everything else appears under recommended properties, and that list is where recipeIngredient and recipeInstructions sit, alongside aggregateRating, author, cookTime, datePublished, description, keywords, nutrition.calories, prepTime, recipeCategory, recipeCuisine, recipeYield, totalTime and video.

That ordering is worth stating plainly because it inverts what a reader would guess. The two properties Google insists on are the two that identify the recipe rather than describe it. A node naming a dish and pointing at a photograph of it is complete by the required list. The ingredients and the method, which are the only parts of a recipe anybody needs in order to make the thing, are advisory. The same split shows up on neighbouring types: this blog measured it on [HowTo pages, where 8 of 272 declared the type](https://lantad.co/blog/howto-schema-8-of-272-how-to-pages), and on [FAQ markup, where 298 of 1,277 answers were not on the page](https://lantad.co/blog/faq-schema-298-of-1277-answers-not-on-the-page). Recipe is the sharpest case because the omitted part is so obviously the point.

None of this says Google ignores the recommended properties. A recommended property is how a feature gets richer, and Google's own [Rich Results Test](https://search.google.com/test/rich-results) reports them. It says something narrower and more useful: a validator reporting a valid recipe is not telling you the recipe is in there.

## How a crawler reaches a recipe page at all

The corpus is fixed and committed: 1,419 hostnames across two seed files, 392 in the platform strata and 1,027 in the industry strata. Each was asked for /robots.txt once on 18 October 2026 as LantadBot/1.0, redirects followed, with an eighteen second timeout. 1,090 answered HTTP 200, and of those 33 answered with HTML rather than a robots file and were treated as having no rules; 1,057 parsed into at least one user-agent group. 297 answered another status and 32 failed before any status arrived. Root verdicts left 1,358 hostnames permitting LantadBot at the site root and 61 refusing it, counting a 5xx on robots.txt as a refusal in the way [RFC 9309](https://www.rfc-editor.org/rfc/rfc9309.html) describes for an unreachable file.

Those permitted home pages were then requested once each, and 1,073 answered HTTP 200 with HTML. From each of those, every same-host anchor was scored and kept when its URL path or its anchor text named a recipe. 36 of the 1,073 produced such a link. That number is the first honest limit in this post: it counts sites whose recipe section is reachable by following one link from the home page, in English, which is a narrower thing than the number of sites in the corpus that publish recipes.

Those 36 sites were then crawled inward, up to twelve requests each, following deeper recipe links from any page that turned out to be an index rather than a recipe. Every URL was checked against that site's own parsed robots.txt before it was requested. 280 requests were made, 261 answered HTTP 200 with HTML, 7 answered another status or a non-HTML type, and 12 were refused by robots.txt before any request went out: 7 on kidney.org, 3 on williams-sonoma.com, 1 on slate.com and 1 on theregister.com. Anyone can reproduce that part with the [robots.txt tester](https://lantad.co/tools/robots-txt-tester).

62 of those 261 pages carried a JSON-LD block whose text declared a Recipe type, and 60 carried a Recipe node a parser could actually read. The two that did not are worth naming: on two arthritis.org recipe pages the single JSON-LD block on the page failed to parse as JSON, and those were the only two unparseable blocks found anywhere in this set, so those two recipes are unreadable to any consumer of the markup regardless of what the block says. One more host needs naming for a different reason. Four japantimes.co.jp recipe URLs each redirected to the site's own home page, so the article was never served to this crawler at all. After that the set is 60 Recipe nodes on 60 distinct pages across 13 hosts, with 60 distinct recipe names, so no node in the count is a duplicate of another. The same funnel discipline built the measurements behind [the crawlability study](https://lantad.co/research/crawlability-study).

## What the 60 Recipe nodes actually carried

Against Google's required list the sample is almost perfect. All 60 nodes declared a non-empty name. 59 of the 60 declared an image that resolved to a URL, whether as a string, an array or an ImageObject with a url. The single exception was masienda.com's Handmade Corn Tortillas Using Masa Harina, which declared no image property at all and is therefore the only node in the set that Google's documentation would call incomplete.

The recommended properties, which is where the recipe itself lives, come out differently and the interesting part is not the headline rate. recipeIngredient was declared on all 60 nodes and held text on 59. recipeInstructions was declared on all 60 and held text on 56. Nothing in this sample simply left the method out, which is worth saying because it is the opposite of what the specification would permit and a reminder that a permissive requirement does not predict behaviour. 55 of the 60 carried text in both.

Below that the coverage thins in a readable order. datePublished appeared on 60 and description on 59. author appeared on 52, recipeYield on 42, prepTime on 41 and cookTime on 40. Then recipeCategory on 27, recipeCuisine on 26 and totalTime on 25, keywords on 22, nutrition on 19 with calories present in all 19 of those, aggregateRating on 13 and video on 5. The pattern is that the properties a content management system can fill from the post metadata are nearly universal, and the properties that require somebody to enter a number about the cooking drop off sharply.

The shape of the method is the other thing a crawler cares about, because an ordered list of steps is extractable and a single blob of prose is not. 46 of the 60 nodes used a HowToStep list, 1 used a HowToSection list, 6 used one text block, 5 used a plain list of strings and 2 declared an empty array. Those 60 pages carried 111 JSON-LD blocks between them and every one of the 111 parsed, which is the cleaner half of the syntax picture: across all 261 pages read in this run there were 286 blocks and exactly 2 failures, both of them the sole block on an arthritis.org recipe page. That is a lower defect rate than the [117 of 612 home pages carrying a JSON-LD defect](https://lantad.co/blog/schema-markup-validator-117-of-612-carried-a-defect) measured on this corpus earlier, on a much smaller sample, and the type distribution behind it is set out in [88 of the 939 schema.org types reaching 626 home pages](https://lantad.co/blog/schema-markup-types-88-of-939-on-626-home-pages).

## Five nodes declared the field and left it empty

This is the finding that took two passes to state correctly, and the correction is the useful part. A first pass counted five nodes as missing a substance property. Re-reading the same pages showed the property was there on all five. What those five actually do is declare the property and give it nothing: the field exists, a validator sees it, and an extractor pulling the value receives no text.

Named, because a measurement anybody can check is the only kind worth publishing. bhf.org.uk's Patatas bravas declares recipeInstructions as the empty string. Two rte.ie pages, Mags Roche's carrot cake cupcakes and Eunice Power's Greek-style yoghurt chocolate cake, declare recipeInstructions as an empty array. eatmila.com's Vegan Friendly Dinner Party in 45 Minutes declares a single HowToStep whose text is the empty string, which is the most deceptive shape of the five because the step count is one rather than zero. eatmila.com's Cheese Crusted Juicy Potstickers is the mirror image: the method is complete and the ingredient list is a single empty string.

All five of those nodes satisfy Google's required list in full. Each has a name and an image, so each is a structurally valid recipe by the only test the documentation states as a requirement, while carrying nothing in the field a reader would have needed. Four of the five still have the recipe in their prose, which is the saving grace and also the reason nobody notices: the page works for a person and the markup quietly does not work for a machine reading only the markup.

The practical lesson is about where an empty value comes from. None of these looks like a decision. An empty string, an empty array and a step containing an empty string are the three default outputs of a template whose source field was blank, which is why this failure survives review: nothing on the page looks wrong, and a check for whether the property exists returns yes. A check has to ask whether the value holds text, which is the same distinction that turned up in [70 of 146 markup values not being on the page](https://lantad.co/blog/structured-data-for-ai-70-of-146-values-off-page) and in [27 of 165 article headlines not matching the h1](https://lantad.co/blog/article-schema-27-of-165-headline-not-in-h1).

## Was the markup also on the page?

A recipe in the markup and no recipe in the prose is a particular kind of fragile, because it depends on an engine choosing to read the markup. So every string in the two substance properties was compared against the delivered page's own visible text, with both sides reduced to letters and digits only so that punctuation, HTML entities and tag boundaries cannot produce a false mismatch. That normalisation matters more than it sounds: an earlier version of this check compared punctuated text and reported 62 of 389 matches, which was an artifact of a typographic apostrophe in the markup meeting a different one in the page, and it is named here because the corrected figure is the one that follows.

325 of 368 instruction strings appeared verbatim in the page's own text, and 529 of 605 ingredient strings did. Counted by node rather than by string, 50 of the 56 nodes with instruction text had every step present in the prose and 52 of the 59 with ingredient text had every ingredient present. So on this sample the usual relationship holds: the markup is a second copy of something the page already says, which is what [prose parity](https://lantad.co/glossary/prose-parity) is a measure of and the condition that makes markup a safety net rather than a dependency.

The 43 instruction strings and 76 ingredient strings that did not match are not all failures. Many are short fragments, section labels or quantities rendered differently in the two places, which is why the by-node figure is the more honest one to quote. The by-string figures are reported here because they are what the check actually counted, not because an unmatched string is evidence of anything on its own.

Four nodes had no instruction text in the page at all, and four had no ingredient text in the page at all. They are the same four pages, on one host, and they are the subject of the next section. For everything else in this set, an [AI crawler](https://lantad.co/glossary/ai-crawler) that ignored the JSON-LD entirely would still have found the recipe, which is the result the product would rather report than the alarming one.

## On four pages the markup was the only readable copy

All eight of those no-match results fall on nbcnews.com, on four recipe pages: Irish Coffee Brownies, Fish and Chips (Irish Pub Style), Irish Whiskey Chocolate Mousse and Boxty (Irish Potato Pancakes). Each page delivered between 359,680 and 367,564 bytes of HTML and between 483 and 587 words of visible text. The recipe was not among those words. The ingredients and the full method, ten or eleven steps per page as a HowToStep list, were present only inside the JSON-LD.

This is the ordinary consequence of client-side rendering meeting a server-rendered head. The document that arrives carries the metadata and the structured data because those are emitted into the markup, and carries almost none of the article body because that is assembled by JavaScript after the document loads. The visible words that do arrive are navigation and boilerplate, which is the pattern behind [JavaScript supplying 7.6 percent of the prose on 271 pages](https://lantad.co/blog/client-side-rendering-11-of-271-returned-no-words) and the reason vendor statements on rendering matter: [2 of 9 operators say either way](https://lantad.co/blog/do-ai-crawlers-render-javascript-two-of-nine).

It is worth being careful about what this does and does not show. It does not show that these recipes are invisible to AI answer engines. Several of those engines read structured data, and the markup here is complete, well formed and ordered, so an engine that parses JSON-LD has everything it needs. What it shows is that the redundancy is gone. On these four pages the structured data is not a second copy of the page, it is the only copy a client that does not execute JavaScript will ever see, and a single markup defect of the kind described two sections up would take the whole recipe with it. The tool that shows this view of any URL is [what GPTBot sees](https://lantad.co/tools/what-gptbot-sees), and Google's own position on what it does and does not read is set out on [the AI Overviews page](https://lantad.co/how-to-get-cited/google-ai-overviews).

## What this does not measure, including our own gap

The sample is small and it is not a sample of food publishers. This corpus is stratified by platform and by industry for a different purpose, so 13 hosts carrying Recipe markup is a count of what turned up, not an estimate of anything. No rate in this post should be read as a population figure, and the comparison that would make it one, a frame built from recipe sites on purpose, has not been run.

The discovery method has a specific bias worth naming twice. A recipe page entered this measurement only if the home page linked a recipe surface whose URL path or anchor text said so in English, within twelve requests of that home page. A site whose recipes sit behind a search box, or are labelled in another language, or are linked only from a section the home page does not reach, is absent from the 36 and therefore from the 60. That is why the funnel is published above rather than summarised: the denominator is the method, not the web.

Nothing here observes any AI system's behaviour. Every figure is a property of bytes that a server sent to this crawler on one day, which is the standard this blog holds itself to and the reason [answer engine optimisation](https://lantad.co/glossary/aeo) claims are kept separate from measurements. Whether a given engine read these nodes, preferred the prose, or ignored both is not something a crawl can see.

The last limit is ours. Lantad's schema sub-score does not check Recipe. SCHEMA_REQUIREMENTS in core/src/schema.ts holds five types, Organization, Product, Article, FAQPage and BreadcrumbList, with six aliases mapping NewsArticle, BlogPosting, TechArticle, ScholarlyArticle, LocalBusiness and Corporation onto two of them. That is a setting rather than a finding: somebody chose five types, and a recipe page scanned by this product today is scored on whether it carries one of those, not on whether its recipe is readable. So a scan would not have caught any of the five empty fields reported here, and this post was written with a script rather than with the scanner. Saying so is cheaper than the alternative, which is a reader discovering it.

## Questions and answers

**What does Recipe schema require?**

Google's recipe structured data documentation, read on 18 October 2026 and carrying a last-updated date of 2026-09-08 UTC, lists exactly two required properties: name and image. recipeIngredient, recipeInstructions, cookTime, prepTime, recipeYield, nutrition.calories, author, aggregateRating and video are all listed as recommended. schema.org itself marks no property of any type as required, so the obligation comes from the search engine rather than from the vocabulary.

**Can a recipe page be valid and still carry no method?**

Yes. Five of the 60 Recipe nodes Lantad read on 18 October 2026 declared a method or an ingredient list that held no text, and all five carried a non-empty name and image, which is the whole of Google's required list. The empty values took three shapes: an empty string, an empty array, and a single HowToStep whose text was the empty string. A check that asks whether a property exists returns yes on all three, so the test has to be whether the value holds text.

**Does the recipe need to be in the page text as well as the markup?**

On the pages measured here it almost always was. 325 of 368 instruction strings and 529 of 605 ingredient strings appeared verbatim in the delivered page's own visible text, and 50 of the 56 nodes with instruction text had every step in the prose. The four exceptions were all on one host, where between 483 and 587 visible words arrived against roughly 360 KB of HTML and the JSON-LD was the only readable copy of the recipe.

**Does Lantad check Recipe markup?**

No. The schema sub-score checks five types, Organization, Product, Article, FAQPage and BreadcrumbList, plus six aliases, and Recipe is not among them. That is a setting in core/src/schema.ts rather than a measurement, and it means a Lantad scan would not have found the five empty fields reported in this post. The measurement here was produced by a script that read the pages directly, and Google's Rich Results Test is the tool that reports recipe property coverage.

---

Lantad measures whether AI crawlers can actually read a page: it fetches as a non-rendering
crawler, renders as a browser, and reports the gap. Free scan, one URL, no signup.

Method and weights: https://lantad.co/methodology | All pages as markdown: https://lantad.co/md | Crawler policy: https://lantad.co/bot
