{"openapi":"3.1.0","info":{"title":"Levain API","version":"0.1.0","description":"A sourdough baking calculator and reference: baker's-percentage hydration and recipe-scaling math, starter feeding-ratio guidance, fermentation timing by temperature, troubleshooting, a flour protein reference, and a shaping/scoring glossary.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://levain.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/levain/docs"},"termsOfService":"https://connectorbay.com/levain/terms"},"servers":[{"url":"https://levain.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/levain/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/hydration_calculator":{"post":{"operationId":"hydration_calculator","summary":"Baker's-percentage hydration: (water_grams / flour_grams) x 100, with a plain-language hydration band","description":"Baker's-percentage hydration: (water_grams / flour_grams) x 100, with a plain-language hydration band\n    (low/stiff, standard, high, very high). Use for \"what's the hydration of 500g flour and 375g water\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"flour_grams":{"description":"Total flour weight in grams (must be greater than 0).","title":"Flour Grams","type":"number"},"water_grams":{"description":"Total water weight in grams.","title":"Water Grams","type":"number"}},"required":["flour_grams","water_grams"],"title":"hydration_calculatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/recipe_scaler":{"post":{"operationId":"recipe_scaler","summary":"Scale a baker's-percentage recipe (flour, water, starter, salt) to a target flour weight by real","description":"Scale a baker's-percentage recipe (flour, water, starter, salt) to a target flour weight by real\n    proportional math: each ingredient's percentage of the base flour is re-applied to the target flour\n    weight. Returns the base percentages, the scaled weights, total dough weight and resulting hydration.\n    Use for \"scale 500g flour / 375g water / 100g starter / 10g salt up to 1kg of flour\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"flour_grams":{"description":"Base recipe's flour weight in grams (must be greater than 0).","title":"Flour Grams","type":"number"},"water_grams":{"description":"Base recipe's water weight in grams.","title":"Water Grams","type":"number"},"starter_grams":{"description":"Base recipe's starter weight in grams.","title":"Starter Grams","type":"number"},"salt_grams":{"description":"Base recipe's salt weight in grams.","title":"Salt Grams","type":"number"},"target_flour_grams":{"description":"The flour weight to scale the whole recipe to (must be greater than 0).","title":"Target Flour Grams","type":"number"}},"required":["flour_grams","water_grams","starter_grams","salt_grams","target_flour_grams"],"title":"recipe_scalerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/starter_feeding_guide":{"post":{"operationId":"starter_feeding_guide","summary":"Sourdough starter maintenance feeding ratios (starter:flour:water by weight) — what each means,","description":"Sourdough starter maintenance feeding ratios (starter:flour:water by weight) — what each means,\n    roughly how long each takes to peak at 78F, and who each suits — plus feeding-schedule guidance for\n    room-temperature vs refrigerated starter. Use for \"what does a 1:5:5 feeding ratio mean\", \"how often do\n    I feed my starter\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific ratio, e.g. '1:1:1', '1:5:5'; omit to list all covered ratios plus schedule notes.","title":"Ratio"}},"title":"starter_feeding_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/fermentation_timing_guide":{"post":{"operationId":"fermentation_timing_guide","summary":"General bulk-fermentation time guidance by temperature (65-85F bands), a rule of thumb for how","description":"General bulk-fermentation time guidance by temperature (65-85F bands), a rule of thumb for how\n    fermentation time shifts with temperature, and cold-retard guidance. Time is always temperature- and\n    starter-dependent — use the dough's appearance (domed, jiggly, aerated), not the clock, as the real\n    signal. Use for \"how long should bulk fermentation take at 70F\", \"should I cold retard overnight\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"temperature_f":{"anyOf":[{"maximum":110,"minimum":32,"type":"number"},{"type":"null"}],"default":null,"description":"Ambient/dough temperature in Fahrenheit; omit to list the full temperature-band table.","title":"Temperature F"}},"title":"fermentation_timing_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/troubleshooting_guide":{"post":{"operationId":"troubleshooting_guide","summary":"Diagnose a common sourdough problem — dense/gummy crumb, over-proofed, under-proofed, flat loaf/poor","description":"Diagnose a common sourdough problem — dense/gummy crumb, over-proofed, under-proofed, flat loaf/poor\n    oven spring, pale crust, or sour/off flavor — with likely causes and concrete fixes. This is ordinary\n    baking troubleshooting, not medical guidance. Use for \"why is my sourdough dense and gummy\", \"my loaf\n    went flat in the oven\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"issue":{"description":"A problem, e.g. 'dense crumb', 'over-proofed', 'flat loaf', 'gummy', 'pale crust'.","minLength":2,"title":"Issue","type":"string"}},"required":["issue"],"title":"troubleshooting_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/flour_type_guide":{"post":{"operationId":"flour_type_guide","summary":"Flour reference: protein-content ranges for bread, all-purpose, whole wheat and rye flour, how each","description":"Flour reference: protein-content ranges for bread, all-purpose, whole wheat and rye flour, how each\n    behaves in dough (gluten strength, absorption), and hydration notes. Use for \"bread flour vs\n    all-purpose protein content\", \"what does whole wheat do to dough hydration\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"bread | all-purpose | whole wheat | rye; omit to list all.","title":"Name"}},"title":"flour_type_guideArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/baker_percentage_explainer":{"post":{"operationId":"baker_percentage_explainer","summary":"Explains the baker's-percentage system: flour is always 100% and every other ingredient is expressed","description":"Explains the baker's-percentage system: flour is always 100% and every other ingredient is expressed\n    as a percentage of the total flour weight, with the formula and a worked example. Use for \"what does\n    baker's percentage mean\", \"why is flour always 100% in a bread formula\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"baker_percentage_explainerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/shaping_and_scoring_glossary":{"post":{"operationId":"shaping_and_scoring_glossary","summary":"Definitions of common sourdough shaping and scoring terms (boule, batard, banneton, scoring, lame,","description":"Definitions of common sourdough shaping and scoring terms (boule, batard, banneton, scoring, lame,\n    ear, oven spring, bench rest, coil fold, autolyse, windowpane test, crumb, levain). Use for \"what's a\n    banneton\", \"what does 'ear' mean on a sourdough loaf\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific term to look up, e.g. 'boule', 'ear', 'lame'; omit to list all.","title":"Term"}},"title":"shaping_and_scoring_glossaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/search":{"post":{"operationId":"search","summary":"Keyword search across every reference dataset at once — starter ratios, fermentation bands,","description":"Keyword search across every reference dataset at once — starter ratios, fermentation bands,\n    troubleshooting topics, flour types, the baker's-percentage explainer, and the shaping/scoring glossary.\n    Use for a broad query like \"sour\" or \"protein\" when you're not sure which specific tool to call.","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"query":{"description":"A keyword or phrase to search for across every dataset.","minLength":1,"title":"Query","type":"string"}},"required":["query"],"title":"searchArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}