{"openapi":"3.1.1","info":{"title":"Recipe API","description":"Programmatic access to a database of recipes. Users can publish and find recipes.","version":"1.0.0","license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"servers":[{"url":"https://api.recipes.bitfield.eu/v1"}],"security":[],"tags":[{"name":"Recipe","description":"Steps and ingredients for preparing a dish"},{"name":"Account","description":"Access to protected operations"}],"paths":{"/recipe/new":{"post":{"tags":["Recipe"],"summary":"Add a recipe","operationId":"addRecipe","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipe"},"examples":{"recipeIn":{"$ref":"#/components/examples/HummusV1In"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipe"},"examples":{"recipeOut":{"$ref":"#/components/examples/HummusV1Out"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"security":[{"httpBasic":[]}]}},"/recipe/search":{"get":{"tags":["Recipe"],"summary":"Find recipes","operationId":"FindRecipes","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string"},"description":"Category name filter (equals, ignores case)"},{"name":"recipe","in":"query","required":false,"schema":{"type":"string"},"description":"Recipe name filter (contains, ignores case)"},{"name":"limit","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":1,"maximum":100},"description":"Maximum number of recipes to return"},{"name":"offset","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0},"description":"Index into result set from where recipes will start to be returned"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Recipe"}},"examples":{"dipsOut":{"$ref":"#/components/examples/DipsOut"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}},"/recipe/{recipeId}":{"get":{"tags":["Recipe"],"summary":"Get a recipe","operationId":"GetRecipe","parameters":[{"$ref":"#/components/parameters/{recipeId}"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipe"},"examples":{"recipeOut":{"$ref":"#/components/examples/HummusV1Out"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}},"put":{"tags":["Recipe"],"summary":"Update a recipe","operationId":"UpdateRecipe","parameters":[{"$ref":"#/components/parameters/{recipeId}"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipe"},"examples":{"recipeIn":{"$ref":"#/components/examples/HummusV2In"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipe"},"examples":{"recipeOut":{"$ref":"#/components/examples/HummusV2Out"}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"security":[{"httpBasic":[]}]},"delete":{"tags":["Recipe"],"summary":"Remove a recipe","operationId":"RemoveRecipe","parameters":[{"$ref":"#/components/parameters/{recipeId}"}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}},"security":[{"httpBasic":[]}]}},"/account/register":{"post":{"tags":["Account"],"summary":"Register an account","operationId":"RegisterAccount","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"},"examples":{"accountIn":{"$ref":"#/components/examples/AccountIn"}}}},"required":true},"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}}},"components":{"securitySchemes":{"httpBasic":{"type":"http","scheme":"basic"}},"schemas":{"Id":{"type":"integer","format":"int64"},"NonBlankString":{"type":"string","pattern":"^(.|\\s)*\\S(.|\\s)*$"},"DateTime":{"type":"string","format":"date-time"},"Recipe":{"type":"object","properties":{"id":{"$ref":"#/components/schemas/Id","readOnly":true,"description":"Unique identifier of the recipe"},"name":{"$ref":"#/components/schemas/NonBlankString","description":"Name"},"description":{"$ref":"#/components/schemas/NonBlankString","description":"Description"},"changedAt":{"$ref":"#/components/schemas/DateTime","readOnly":true,"description":"Last point in time when the recipe was changed"},"categories":{"type":"array","items":{"$ref":"#/components/schemas/NonBlankString"},"description":"Category names"},"ingredients":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/NonBlankString"},"description":"Step descriptions"},"steps":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/NonBlankString"},"description":"Ingredient names"}},"required":["name","description","categories","ingredients","steps"]},"ProblemDetail":{"type":"object","properties":{"type":{"type":"string","description":"URI reference that identifies the problem type.","format":"uri"},"status":{"type":"integer","description":"HTTP status code generated by the origin server for this occurrence of the problem.","format":"int32"},"title":{"type":"string","description":"Short, human-readable summary of the problem type. It should not change from occurrence to occurrence of the problem, except for purposes of localization."},"detail":{"type":"string","description":"Human-readable explanation specific to this occurrence of the problem."},"instance":{"type":"string","description":"URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced."},"properties":{"type":"object","description":"Map for additional, non-standard properties"}},"required":["title"]},"Email":{"type":"string","format":"email","description":"Email address"},"Password":{"type":"string","format":"password","minLength":8,"description":"Password"},"Account":{"type":"object","properties":{"email":{"$ref":"#/components/schemas/Email"},"password":{"$ref":"#/components/schemas/Password"}},"required":["email","password"]}},"examples":{"HummusV1In":{"summary":"Hummus recipe","value":{"name":"Hummus","description":"Hummus, is a Levantine dip, spread, or savory dish made from cooked, mashed chickpeas blended with tahini, lemon juice, and garlic.","categories":["Dip","Spread"],"ingredients":["Chickpeas","Tahini","Olive oil","Lemon juice","Garlic"],"steps":["Combine chickpeas, tahini, olive oil, lemon juice, garlic, and salt in a food processor.","Blend until smooth, slowly adding cold water until you reach a creamy consistency.","Taste and adjust seasoning if needed."]}},"HummusV1Out":{"summary":"Hummus recipe","value":{"id":1729,"name":"Hummus","description":"Hummus, is a Levantine dip, spread, or savory dish made from cooked, mashed chickpeas blended with tahini, lemon juice, and garlic.","changedAt":"2025-08-08T15:35:10.294411Z","categories":["Dip","Spread"],"ingredients":["Chickpeas","Tahini","Olive oil","Lemon juice","Garlic"],"steps":["Combine chickpeas, tahini, olive oil, lemon juice, garlic, and salt in a food processor.","Blend until smooth, slowly adding cold water until you reach a creamy consistency.","Taste and adjust seasoning if needed."]}},"DipsOut":{"summary":"Dip category search","value":[{"id":3,"name":"Muhammara","description":"Muhammara is a vibrant and flavorful dip or spread from the Middle East, particularly popular in Syrian and Turkish cuisine. It's made primarily from roasted red bell peppers, walnuts, breadcrumbs, and pomegranate molasses.","changedAt":"2025-08-08T16:24:44.673034Z","categories":["Dip"],"ingredients":["Pomegranate molasses","Red bell peppers","Bread crumbs","Cumin","Chili flakes","Garlic","Walnuts","Lemon juice"],"steps":["Roast whole bell peppers in an oven or air fryer and wait until blackened on the outside.","Put the peppers in a bowl cover them with to let steam and cool down","Remove core seeds, and skins","Combine all the ingredients in a food processor.","Process until mostly smooth but with a little texture remaining.","Taste and adjust flavor as needed (lemon for acidity, pomegranate molasses for sweetness)"]},{"id":2,"name":"Hummus","description":"Hummus, is a Levantine dip, spread, or savory dish made from cooked, mashed chickpeas blended with tahini, lemon juice, and garlic.","changedAt":"2025-08-08T16:24:44.579213Z","categories":["Dip"],"ingredients":["Chickpeas","Tahini","Lemon juice","Garlic"],"steps":["Combine chickpeas, tahini, lemon juice, garlic, and salt in a food processor.","Blend until smooth, slowly adding cold water until you reach a creamy consistency.","Taste and adjust seasoning if needed."]}]},"HummusV2In":{"summary":"Hummus recipe update","value":{"name":"Hummus","description":"Hummus, is a Levantine dip, spread, or savory dish made from cooked, mashed chickpeas blended with tahini, lemon juice, and garlic.","categories":["Dip","Spread"],"ingredients":["Chickpeas","Tahini","Lemon juice","Garlic"],"steps":["Combine chickpeas, tahini, lemon juice, garlic, and salt in a food processor.","Blend until smooth, slowly adding cold water until you reach a creamy consistency.","Taste and adjust seasoning if needed."]}},"HummusV2Out":{"summary":"Hummus recipe update","value":{"id":1729,"name":"Hummus","description":"Hummus, is a Levantine dip, spread, or savory dish made from cooked, mashed chickpeas blended with tahini, lemon juice, and garlic.","changedAt":"2025-08-09T12:48:32.134821Z","categories":["Dip","Spread"],"ingredients":["Chickpeas","Tahini","Lemon juice","Garlic"],"steps":["Combine chickpeas, tahini, lemon juice, garlic, and salt in a food processor.","Blend until smooth, slowly adding cold water until you reach a creamy consistency.","Taste and adjust seasoning if needed."]}},"AccountIn":{"summary":"Account registration","value":{"email":"ada@example.com","password":"FBR5h0L1ENA3edctgDIEnxSvFdR0"}}},"parameters":{"{recipeId}":{"name":"recipeId","in":"path","required":true,"schema":{"$ref":"#/components/schemas/Id"},"description":"Unique identifier of the recipe"}}}}