Recipe Schema Generator
Fill out a form. Get valid Recipe JSON-LD.
A form-driven builder for schema.org Recipe markup with a live JSON-LD preview that updates as you type. Handles HowToStep instructions with reorder, ISO 8601 duration conversion, NutritionInformation, and AggregateRating. Empty fields are omitted so the output stays valid at every keystroke. Everything runs in your browser — nothing is sent to XooCode.
Recipe form
Add each recipe photo URL as a separate entry. For the Recipe rich result, prefer multiple aspect ratios (1:1, 4:3, 16:9).
Emitted as a nested Person entity: { '@type': 'Person', 'name': '...' }. For @id cross-references to existing Person entries, edit the generated JSON-LD by hand.
Freeform category label (e.g. 'Dessert', 'Main course', 'Therapeutic nutrition').
Freeform cuisine label (e.g. 'Italian', 'Danish / Nordic').
Type plain minutes. The Builder converts to ISO 8601 format (PT15M, PT90M) automatically. Empty fields are omitted from the output.
Emitted as nested QuantitativeValue with value and unitText.
Comma-separated tag list. Emitted as a single string.
One ingredient per line, including measurements. Emitted as a string array (or single string for one entry).
No ingredients yet. Click the button below to add the first one.
Instructions (0 steps)
Ordered list of HowToStep entries. Position numbers auto-update as you reorder steps with the ↑ and ↓ buttons. Each step needs text; name and image are optional.
No steps yet. Click the button below to add the first step.
Reviews (0)
Individual customer reviews. Add as many as you want. Each review contributes to the Review snippet rich result. Google pairs these with the aggregate rating above.
No reviews yet. Click the button below to add one.
Live JSON-LD output
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Recipe"
}
</script>Updates as you type. Empty fields are omitted from the output. Click the copy icon above to copy the full <script> tag ready for pasting into your HTML head.
How to use the generator
The tool is a two-pane split: a form on the left, a live JSON-LD preview on the right. Type into any field and the preview updates immediately. When you’re done, click the copy icon in the preview header and paste the <script> block into your page’s <head> tag. That’s the whole workflow.
- 1
Start from the seed example (optional)
Above the form there’s a Load Jane Xoo’s 1945 recipe button. Click it and every field populates with a worked example — Rigshospitalet Pediatric Recovery Porridge, a fictional historical recipe from the Xoo universe. Use it to see what a fully-populated form looks like, then clear and start over for your own recipe. - 2
Fill in the core fields
Name, description, author, image, prep time, cook time, total time, yield, and category. The required fields border in red the first time you touch them but leave them blank — that’s the“must have” signal for what Google will reject your markup without. - 3
Add ingredients and instructions
Ingredients are a simple line-per-entry list. Instructions are a multi-row block where each row becomes aHowToStepobject with its own name, text, and optional image. Use the up/down buttons to reorder — the numeric position updates automatically. - 4
Optional: nutrition, rating, reviews
The bottom half of the form coversNutritionInformation(calories, protein, fat, fiber, sodium, and friends),AggregateRating(a single rating + review count), andReview(individual reviewers, ratings, and text). None of these are required — fill in what applies, leave the rest blank. - 5
Copy the output
The preview pane shows the full<script type="application/ld+json">wrapper with syntax highlighting. Click the copy icon to grab it and paste into your page head. Test it with Google’s Rich Results Test before publishing to catch any value-level issues.
What Google actually needs for the Recipe rich result
The Recipe rich result is the card Google renders at the top of search results for recipe queries — the image, the star rating, the cook time, the calorie count. It’s the highest-visibility result type food publishers can earn, and it has a specific minimum bar of required properties that the generator enforces by default.
Per the Recipe structured data documentation, Google requires name, image, recipeIngredient, and recipeInstructions at minimum. Without those four the page is not eligible for the rich result — full stop, no partial credit. The generator borders those fields red the first time you touch them so you know which ones are load-bearing.
Google also recommends a much longer list for rich result quality: author, datePublished, description, prepTime, cookTime, totalTime, recipeYield, recipeCategory, recipeCuisine, nutrition, and aggregateRating. Missing these doesn’t disqualify your markup, but it absolutely affects how the card renders. A recipe with no aggregateRating loses its star count. A recipe with no totalTime loses the time badge. These are the properties that make one Recipe card stand out from another in a crowded SERP.
The ISO 8601 duration trick
Duration properties in schema.org (prepTime, cookTime, totalTime) expect ISO 8601 duration strings, not plain English. Fifteen minutes is PT15M, not "15 minutes". One hour thirty minutes is PT1H30M or equivalently PT90M — both are valid.
The generator hides ISO 8601 entirely. You type 15 in the prep time field and the preview renders "prepTime": "PT15M". You type 90 for a longer cook time and it renders "cookTime": "PT90M" — not PT1H30M, but that’s fine because Google accepts both and parses them identically as “1 hr 30 min” in the rendered card.
The minutes-only input is a deliberate UX choice. Hours-and-minutes dual inputs are more work to fill in, more prone to off-by-one errors (“is that 1h 5m or 1h 50m?”), and the only advantage they have — more “natural” representation for long durations — doesn’t matter because nobody reads the JSON-LD anyway. Google reads the JSON, the card renders the duration in natural language either way, and you got there with one less input.
Nutrition, ratings, and reviews: the polish properties
The four required properties get you into the rich result. Everything else in the Recipe vocabulary exists to make your card look better than the next site’s card. Three property clusters move the needle the most.
NutritionInformation
A nested object with calories, proteinContent, fatContent, carbohydrateContent, fiberContent, sodiumContent, and similar. Values are strings with units ("240 calories", "12 g"). The generator’s nutrition block handles the units for you — type the number and the unit suffix is appended automatically. Adding nutrition unlocks the calorie badge on the card, which is what most health-conscious searchers actually look for.
AggregateRating
The star rating is the single most clicked element of any rich result card. A recipe with 4.8 stars next to Beef Stew outperforms one with no stars at any page-quality level. The property is a nested AggregateRating object with ratingValue (number) and either reviewCount or ratingCount (integer). The generator emits either shape — pick whichever you actually have.
Review
Individual reviews. Google uses them for card variants that include a quoted reviewer name, and they feed into the overall aggregate even though aggregateRating is computed separately. The generator’s review block supports multiple reviews, each with author, rating, and body.
What this generator isn't
The Recipe Schema Generator is a tightly-scoped tool. Knowing what it doesn’t try to do will save you time hunting for features that were never supposed to exist.
It IS a Recipe JSON-LD builder
It is NOT a recipe manager
It IS ISO-8601 aware
It is NOT a Rich Results Test
It IS HowToStep-first
It is NOT a review aggregator
Authoritative sources behind the Recipe vocabulary
The generator’s behaviour is sourced from primary documentation. These are the documents to consult when you need to verify anything the tool produces.
- schema.org/Recipe — the canonical vocabulary definition. Lists every property Recipe inherits from
HowToand fromCreativeWorkabove that, not just the Recipe-specific ones. - Google Recipe structured data documentation — the required and recommended property lists the generator enforces. Read this when you’re unsure whether a specific field counts.
- ISO 8601 durations — the formal spec for the duration strings the generator emits. Handy if you hit an edge case the minutes-only input doesn’t cover (weeks, days, sub-minute precision).
- Google Rich Results Test — run your generator output through this to catch value-level issues before publishing. Free and immediate.
- Schema Markup Validator — the schema.org-maintained validator. Use it for vocabulary conformance independent of Google’s rich result rules.