Raw schema
{
"type": "object",
"properties": {
"recipeSlug": {
"description": "Recipe type slug. Supported: neapolitan-pizza, classica-pizza, focaccia, artisan-bread, baguette (call list_recipes for the full list). When the user names a style like 'classica', pass that style here — do NOT confuse it with a flour whose name happens to contain the word.",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"flourSlug": {
"description": "Flour slug from search_flours (e.g. 'caputo-pizzeria'). For a single flour. Mutually exclusive with flourBlend.",
"type": "string",
"maxLength": 120
},
"flourBlend": {
"description": "A weighted flour blend (2–5 flours summing to 100%), e.g. [{flourSlug:'caputo-pizzeria',percent:70},{flourSlug:'manitoba-oro',percent:30}]. Mutually exclusive with flourSlug.",
"minItems": 2,
"maxItems": 5,
"type": "array",
"items": {
"type": "object",
"properties": {
"flourSlug": {
"description": "Component flour slug from search_flours",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"percent": {
"description": "This flour's share of the blend (1–99); the set must sum to 100",
"type": "number",
"minimum": 1,
"maximum": 99
}
},
"required": [
"flourSlug",
"percent"
]
}
},
"hydrationPercent": {
"description": "Target hydration percentage (40–110)",
"type": "number",
"minimum": 40,
"maximum": 110
},
"servings": {
"description": "Number of portions/pizzas (1–50, default: 4)",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"roomTempHours": {
"description": "Room-temperature fermentation hours (0–168). Pass BOTH this and fridgeTempHours to lock the split; naming only a total lets the engine choose. Room legs above 14h are clamped with a warning.",
"type": "number",
"minimum": 0,
"maximum": 168
},
"fridgeTempHours": {
"description": "Cold fermentation hours (0–168). Pass BOTH this and roomTempHours to lock the split.",
"type": "number",
"minimum": 0,
"maximum": 168
},
"roomTempCelsius": {
"description": "The user's real kitchen temperature in °C (2–40). The single biggest driver of yeast amount and timing — ask the user for it.",
"type": "number",
"minimum": 2,
"maximum": 40
},
"fridgeTempCelsius": {
"description": "The user's real fridge temperature in °C (0–12). Ask the user for it when a cold ferment is involved.",
"type": "number",
"minimum": 0,
"maximum": 12
},
"ovenSlug": {
"description": "Exact oven model slug from search_ovens. Strongly preferred: the engine uses the model's real ceiling and oven class to adapt hydration and bake feasibility. Mutually exclusive with manual ovenType/ovenMaxCelsius.",
"type": "string",
"minLength": 1,
"maxLength": 120
},
"ovenType": {
"description": "Oven class for an unlisted model. Pass together with ovenMaxCelsius; prefer ovenSlug when search_ovens finds the model.",
"type": "string",
"enum": [
"home-electric",
"home-gas",
"portable-gas",
"portable-electric",
"wood-fired",
"pellet",
"hybrid",
"kamado"
]
},
"ovenMaxCelsius": {
"description": "The real maximum temperature in °C for an unlisted oven (100–600). This is what constrains hydration and bake time.",
"type": "number",
"minimum": 100,
"maximum": 600
},
"ovenMinCelsius": {
"description": "Optional minimum set temperature in °C for an unlisted oven.",
"type": "number",
"minimum": 0,
"maximum": 400
},
"bakeTime": {
"description": "Target bake time as an ISO 8601 datetime (e.g. '2026-06-10T18:00:00Z'). Must be in the future.",
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"preferment": {
"description": "Plan the bake around a preferment (biga, poolish, tiga, sourdough…). The yeast figure returned accounts for it, and the calculator link opens with the build already set up.",
"type": "object",
"properties": {
"type": {
"description": "Preferment style. poolish = 100% hydration, fast, extensible. biga = stiff (~45-50%). biga-fredda = one long cold hold. biga-lunga = 24h cold then 24h warm. tiga = tiga-style build. sourdough = natural starter (no commercial yeast).",
"type": "string",
"enum": [
"poolish",
"biga",
"biga-fredda",
"biga-lunga",
"tiga",
"sourdough",
"old-dough"
]
},
"percentFlour": {
"description": "Share of the TOTAL flour that goes into the preferment (1-100). Defaults: 30 for biga/poolish/tiga, 15 for sourdough.",
"type": "number",
"minimum": 1,
"maximum": 100
},
"hydrationPercent": {
"description": "Preferment hydration % (40-200). Defaults to the style's canonical value (poolish 100, biga ~45).",
"type": "number",
"minimum": 40,
"maximum": 200
},
"stages": {
"description": "The build program, leg by leg — e.g. [{durationHours:24,tempCelsius:4},{durationHours:24,tempCelsius:18}] for a long biga. Omit to use the style's default program.",
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"durationHours": {
"description": "Length of this leg in hours",
"type": "number",
"minimum": 0.25,
"maximum": 96
},
"tempCelsius": {
"description": "Temperature of this leg in °C (use ~4 for the fridge)",
"type": "number",
"minimum": 0,
"maximum": 40
}
},
"required": [
"durationHours",
"tempCelsius"
]
}
},
"flourSlug": {
"description": "Build the preferment from a specific flour (slug from search_flours). Omit to use the main flour.",
"type": "string",
"maxLength": 120
}
},
"required": [
"type"
]
},
"locale": {
"description": "UI locale for the returned calculator link (e.g. 'en', 'pl', 'it'). Defaults to 'en'.",
"type": "string",
"enum": [
"en",
"pl",
"de",
"es",
"it",
"nl",
"fr",
"ja",
"ko",
"sv",
"pt"
]
}
},
"required": [
"recipeSlug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}