Schema Forge

Schema guide

Recipe schema markup (Recipe JSON-LD)

How to write Recipe JSON-LD: ingredients, steps, times, yield and images, with a working example and the details Google expects.

Overview

Short answer

Recipe markup separates a recipe into its parts: name, image, ingredients, steps, times and yield. Google needs a name and an image, and recommends the rest. Times are written as durations such as PT15M for 15 minutes.

What it can do for you

Google Rich results: yes
Yes. Recipes with an image and a name can appear in recipe results and carousels, with times and ratings when present.
AI and answer engines
Ingredients and steps are separated into lists, so they can be quoted accurately.

Use it when

  • A page with one full recipe: an ingredient list and step-by-step instructions

Skip it when

  • A roundup of many recipes (mark up each one on its own page)
  • A food article with no ingredient list or steps

Properties

PropertyStatusNotes
nameRequiredThe recipe title.
imageRequiredOne or more crawlable images of the finished dish.
recipeIngredientRecommendedAn array with one string for each ingredient.
recipeInstructionsRecommendedAn array of HowToStep entries, in order.
prepTime, cookTime, totalTimeRecommendedISO 8601 durations, such as PT1H30M.
recipeYield, author, datePublished, descriptionRecommendedHow many it serves, who wrote it and when.
nutrition, aggregateRating, videoOptionalOnly if the page shows them.

Example

recipe.jsonld (example)
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Recipe",
  "name": "Brown Butter Oat Cookies",
  "image": [
    "https://example.com/img/cookies.jpg"
  ],
  "author": {
    "@type": "Person",
    "name": "Priya Nandakumar"
  },
  "datePublished": "2026-02-09",
  "description": "Chewy oat cookies with brown butter and a pinch of sea salt.",
  "prepTime": "PT15M",
  "cookTime": "PT12M",
  "totalTime": "PT27M",
  "recipeYield": "24 cookies",
  "recipeIngredient": [
    "170 g unsalted butter",
    "150 g brown sugar",
    "1 egg",
    "160 g plain flour",
    "120 g rolled oats",
    "1/2 tsp flaky salt"
  ],
  "recipeInstructions": [
    {
      "@type": "HowToStep",
      "text": "Brown the butter in a pan and let it cool for ten minutes."
    },
    {
      "@type": "HowToStep",
      "text": "Beat the butter, sugar and egg, then fold in the flour and oats."
    },
    {
      "@type": "HowToStep",
      "text": "Bake spoonfuls at 180 C for 12 minutes and finish with the salt."
    }
  ]
}
</script>

It needs an Ingredients heading followed by a list of at least two items, and an Instructions, Directions or Method heading followed by steps. Times and yield are read from microdata or a labelled line when they are present.

Times written as plain minutes are not turned into durations unless they are already in that form, so the checklist asks you to add them. Nutrition, ratings and video are never generated.

Common mistakes

  • Times written as "15 minutes" instead of PT15M.
  • Ingredients and steps merged into one long string.
  • A photo that is not of the dish, or one blocked to crawlers.
  • Adding ratings that visitors cannot see on the page.

Questions

What does Google require for a recipe?

A name and an image. It recommends ingredients, instructions, times, yield, an author, a publish date and a description, and optionally nutrition and ratings.

How do I write times?

Use an ISO 8601 duration. PT15M is 15 minutes, PT1H30M is an hour and a half.

Should each step be its own entry?

Yes. Use one HowToStep for each step, in order. Sections with their own headings can use HowToSection.

Can I add ratings I collected elsewhere?

Only if the same ratings are shown on the page. Ratings visitors cannot see do not belong in the markup.

Generate this markup for your page

Paste the address of a public page and get a ready-to-paste block, with every gap listed.

Open the generator

Keep going