@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api spoonacular API
@base https://api.spoonacular.com
@version 1.1
@auth ApiKey x-api-key in header
@endpoints 99
@hint download_for_search
@toc recipes(43), food(42), mealplanner(13), users(1)

@group recipes
@endpoint GET /recipes/complexSearch
@desc Search Recipes
@optional {query: str # The (natural language) search query., cuisine: str # The cuisine(s) of the recipes. One or more, comma separated (will be interpreted as 'OR'). See a full list of supported cuisines., excludeCuisine: str # The cuisine(s) the recipes must not match. One or more, comma separated (will be interpreted as 'AND'). See a full list of supported cuisines., diet: str # The diet for which the recipes must be suitable. See a full list of supported diets., intolerances: str # A comma-separated list of intolerances. All recipes returned must not contain ingredients that are not suitable for people with the intolerances entered. See a full list of supported intolerances., equipment: str # The equipment required. Multiple values will be interpreted as 'or'. For example, value could be "blender, frying pan, bowl"., includeIngredients: str # A comma-separated list of ingredients that should/must be used in the recipes., excludeIngredients: str # A comma-separated list of ingredients or ingredient types that the recipes must not contain., type: str # The type of recipe. See a full list of supported meal types., instructionsRequired: bool # Whether the recipes must have instructions., fillIngredients: bool # Add information about the ingredients and whether they are used or missing in relation to the query., addRecipeInformation: bool # If set to true, you get more information about the recipes returned., addRecipeNutrition: bool # If set to true, you get nutritional information about each recipes returned., author: str # The username of the recipe author., tags: str # The tags (can be diets, meal types, cuisines, or intolerances) that the recipe must have., recipeBoxId: num # The id of the recipe box to which the search should be limited to., titleMatch: str # Enter text that must be found in the title of the recipes., maxReadyTime: num # The maximum time in minutes it should take to prepare and cook the recipe., ignorePantry: bool=false # Whether to ignore typical pantry items, such as water, salt, flour, etc., sort: str # The strategy to sort recipes by. See a full list of supported sorting options., sortDirection: str # The direction in which to sort. Must be either 'asc' (ascending) or 'desc' (descending)., minCarbs: num # The minimum amount of carbohydrates in grams the recipe must have., maxCarbs: num # The maximum amount of carbohydrates in grams the recipe can have., minProtein: num # The minimum amount of protein in grams the recipe must have., maxProtein: num # The maximum amount of protein in grams the recipe can have., minCalories: num # The minimum amount of calories the recipe must have., maxCalories: num # The maximum amount of calories the recipe can have., minFat: num # The minimum amount of fat in grams the recipe must have., maxFat: num # The maximum amount of fat in grams the recipe can have., minAlcohol: num # The minimum amount of alcohol in grams the recipe must have., maxAlcohol: num # The maximum amount of alcohol in grams the recipe can have., minCaffeine: num # The minimum amount of caffeine in milligrams the recipe must have., maxCaffeine: num # The maximum amount of caffeine in milligrams the recipe can have., minCopper: num # The minimum amount of copper in milligrams the recipe must have., maxCopper: num # The maximum amount of copper in milligrams the recipe can have., minCalcium: num # The minimum amount of calcium in milligrams the recipe must have., maxCalcium: num # The maximum amount of calcium in milligrams the recipe can have., minCholine: num # The minimum amount of choline in milligrams the recipe must have., maxCholine: num # The maximum amount of choline in milligrams the recipe can have., minCholesterol: num # The minimum amount of cholesterol in milligrams the recipe must have., maxCholesterol: num # The maximum amount of cholesterol in milligrams the recipe can have., minFluoride: num # The minimum amount of fluoride in milligrams the recipe must have., maxFluoride: num # The maximum amount of fluoride in milligrams the recipe can have., minSaturatedFat: num # The minimum amount of saturated fat in grams the recipe must have., maxSaturatedFat: num # The maximum amount of saturated fat in grams the recipe can have., minVitaminA: num # The minimum amount of Vitamin A in IU the recipe must have., maxVitaminA: num # The maximum amount of Vitamin A in IU the recipe can have., minVitaminC: num # The minimum amount of Vitamin C milligrams the recipe must have., maxVitaminC: num # The maximum amount of Vitamin C in milligrams the recipe can have., minVitaminD: num # The minimum amount of Vitamin D in micrograms the recipe must have., maxVitaminD: num # The maximum amount of Vitamin D in micrograms the recipe can have., minVitaminE: num # The minimum amount of Vitamin E in milligrams the recipe must have., maxVitaminE: num # The maximum amount of Vitamin E in milligrams the recipe can have., minVitaminK: num # The minimum amount of Vitamin K in micrograms the recipe must have., maxVitaminK: num # The maximum amount of Vitamin K in micrograms the recipe can have., minVitaminB1: num # The minimum amount of Vitamin B1 in milligrams the recipe must have., maxVitaminB1: num # The maximum amount of Vitamin B1 in milligrams the recipe can have., minVitaminB2: num # The minimum amount of Vitamin B2 in milligrams the recipe must have., maxVitaminB2: num # The maximum amount of Vitamin B2 in milligrams the recipe can have., minVitaminB5: num # The minimum amount of Vitamin B5 in milligrams the recipe must have., maxVitaminB5: num # The maximum amount of Vitamin B5 in milligrams the recipe can have., minVitaminB3: num # The minimum amount of Vitamin B3 in milligrams the recipe must have., maxVitaminB3: num # The maximum amount of Vitamin B3 in milligrams the recipe can have., minVitaminB6: num # The minimum amount of Vitamin B6 in milligrams the recipe must have., maxVitaminB6: num # The maximum amount of Vitamin B6 in milligrams the recipe can have., minVitaminB12: num # The minimum amount of Vitamin B12 in micrograms the recipe must have., maxVitaminB12: num # The maximum amount of Vitamin B12 in micrograms the recipe can have., minFiber: num # The minimum amount of fiber in grams the recipe must have., maxFiber: num # The maximum amount of fiber in grams the recipe can have., minFolate: num # The minimum amount of folate in micrograms the recipe must have., maxFolate: num # The maximum amount of folate in micrograms the recipe can have., minFolicAcid: num # The minimum amount of folic acid in micrograms the recipe must have., maxFolicAcid: num # The maximum amount of folic acid in micrograms the recipe can have., minIodine: num # The minimum amount of iodine in micrograms the recipe must have., maxIodine: num # The maximum amount of iodine in micrograms the recipe can have., minIron: num # The minimum amount of iron in milligrams the recipe must have., maxIron: num # The maximum amount of iron in milligrams the recipe can have., minMagnesium: num # The minimum amount of magnesium in milligrams the recipe must have., maxMagnesium: num # The maximum amount of magnesium in milligrams the recipe can have., minManganese: num # The minimum amount of manganese in milligrams the recipe must have., maxManganese: num # The maximum amount of manganese in milligrams the recipe can have., minPhosphorus: num # The minimum amount of phosphorus in milligrams the recipe must have., maxPhosphorus: num # The maximum amount of phosphorus in milligrams the recipe can have., minPotassium: num # The minimum amount of potassium in milligrams the recipe must have., maxPotassium: num # The maximum amount of potassium in milligrams the recipe can have., minSelenium: num # The minimum amount of selenium in micrograms the recipe must have., maxSelenium: num # The maximum amount of selenium in micrograms the recipe can have., minSodium: num # The minimum amount of sodium in milligrams the recipe must have., maxSodium: num # The maximum amount of sodium in milligrams the recipe can have., minSugar: num # The minimum amount of sugar in grams the recipe must have., maxSugar: num # The maximum amount of sugar in grams the recipe can have., minZinc: num # The minimum amount of zinc in milligrams the recipe must have., maxZinc: num # The maximum amount of zinc in milligrams the recipe can have., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10., limitLicense: bool=true # Whether the recipes should have an open license that allows display with proper attribution.}
@returns(200) {offset: int, number: int, results: [map], totalResults: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/findByIngredients
@desc Search Recipes by Ingredients
@optional {ingredients: str # A comma-separated list of ingredients that the recipes should contain., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10., limitLicense: bool=true # Whether the recipes should have an open license that allows display with proper attribution., ranking: num # Whether to maximize used ingredients (1) or minimize missing ingredients (2) first., ignorePantry: bool=false # Whether to ignore typical pantry items, such as water, salt, flour, etc.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/findByNutrients
@desc Search Recipes by Nutrients
@optional {minCarbs: num # The minimum amount of carbohydrates in grams the recipe must have., maxCarbs: num # The maximum amount of carbohydrates in grams the recipe can have., minProtein: num # The minimum amount of protein in grams the recipe must have., maxProtein: num # The maximum amount of protein in grams the recipe can have., minCalories: num # The minimum amount of calories the recipe must have., maxCalories: num # The maximum amount of calories the recipe can have., minFat: num # The minimum amount of fat in grams the recipe must have., maxFat: num # The maximum amount of fat in grams the recipe can have., minAlcohol: num # The minimum amount of alcohol in grams the recipe must have., maxAlcohol: num # The maximum amount of alcohol in grams the recipe can have., minCaffeine: num # The minimum amount of caffeine in milligrams the recipe must have., maxCaffeine: num # The maximum amount of caffeine in milligrams the recipe can have., minCopper: num # The minimum amount of copper in milligrams the recipe must have., maxCopper: num # The maximum amount of copper in milligrams the recipe can have., minCalcium: num # The minimum amount of calcium in milligrams the recipe must have., maxCalcium: num # The maximum amount of calcium in milligrams the recipe can have., minCholine: num # The minimum amount of choline in milligrams the recipe must have., maxCholine: num # The maximum amount of choline in milligrams the recipe can have., minCholesterol: num # The minimum amount of cholesterol in milligrams the recipe must have., maxCholesterol: num # The maximum amount of cholesterol in milligrams the recipe can have., minFluoride: num # The minimum amount of fluoride in milligrams the recipe must have., maxFluoride: num # The maximum amount of fluoride in milligrams the recipe can have., minSaturatedFat: num # The minimum amount of saturated fat in grams the recipe must have., maxSaturatedFat: num # The maximum amount of saturated fat in grams the recipe can have., minVitaminA: num # The minimum amount of Vitamin A in IU the recipe must have., maxVitaminA: num # The maximum amount of Vitamin A in IU the recipe can have., minVitaminC: num # The minimum amount of Vitamin C in milligrams the recipe must have., maxVitaminC: num # The maximum amount of Vitamin C in milligrams the recipe can have., minVitaminD: num # The minimum amount of Vitamin D in micrograms the recipe must have., maxVitaminD: num # The maximum amount of Vitamin D in micrograms the recipe can have., minVitaminE: num # The minimum amount of Vitamin E in milligrams the recipe must have., maxVitaminE: num # The maximum amount of Vitamin E in milligrams the recipe can have., minVitaminK: num # The minimum amount of Vitamin K in micrograms the recipe must have., maxVitaminK: num # The maximum amount of Vitamin K in micrograms the recipe can have., minVitaminB1: num # The minimum amount of Vitamin B1 in milligrams the recipe must have., maxVitaminB1: num # The maximum amount of Vitamin B1 in milligrams the recipe can have., minVitaminB2: num # The minimum amount of Vitamin B2 in milligrams the recipe must have., maxVitaminB2: num # The maximum amount of Vitamin B2 in milligrams the recipe can have., minVitaminB5: num # The minimum amount of Vitamin B5 in milligrams the recipe must have., maxVitaminB5: num # The maximum amount of Vitamin B5 in milligrams the recipe can have., minVitaminB3: num # The minimum amount of Vitamin B3 in milligrams the recipe must have., maxVitaminB3: num # The maximum amount of Vitamin B3 in milligrams the recipe can have., minVitaminB6: num # The minimum amount of Vitamin B6 in milligrams the recipe must have., maxVitaminB6: num # The maximum amount of Vitamin B6 in milligrams the recipe can have., minVitaminB12: num # The minimum amount of Vitamin B12 in micrograms the recipe must have., maxVitaminB12: num # The maximum amount of Vitamin B12 in micrograms the recipe can have., minFiber: num # The minimum amount of fiber in grams the recipe must have., maxFiber: num # The maximum amount of fiber in grams the recipe can have., minFolate: num # The minimum amount of folate in micrograms the recipe must have., maxFolate: num # The maximum amount of folate in micrograms the recipe can have., minFolicAcid: num # The minimum amount of folic acid in micrograms the recipe must have., maxFolicAcid: num # The maximum amount of folic acid in micrograms the recipe can have., minIodine: num # The minimum amount of iodine in micrograms the recipe must have., maxIodine: num # The maximum amount of iodine in micrograms the recipe can have., minIron: num # The minimum amount of iron in milligrams the recipe must have., maxIron: num # The maximum amount of iron in milligrams the recipe can have., minMagnesium: num # The minimum amount of magnesium in milligrams the recipe must have., maxMagnesium: num # The maximum amount of magnesium in milligrams the recipe can have., minManganese: num # The minimum amount of manganese in milligrams the recipe must have., maxManganese: num # The maximum amount of manganese in milligrams the recipe can have., minPhosphorus: num # The minimum amount of phosphorus in milligrams the recipe must have., maxPhosphorus: num # The maximum amount of phosphorus in milligrams the recipe can have., minPotassium: num # The minimum amount of potassium in milligrams the recipe must have., maxPotassium: num # The maximum amount of potassium in milligrams the recipe can have., minSelenium: num # The minimum amount of selenium in micrograms the recipe must have., maxSelenium: num # The maximum amount of selenium in micrograms the recipe can have., minSodium: num # The minimum amount of sodium in milligrams the recipe must have., maxSodium: num # The maximum amount of sodium in milligrams the recipe can have., minSugar: num # The minimum amount of sugar in grams the recipe must have., maxSugar: num # The maximum amount of sugar in grams the recipe can have., minZinc: num # The minimum amount of zinc in milligrams the recipe must have., maxZinc: num # The maximum amount of zinc in milligrams the recipe can have., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10., random: bool # If true, every request will give you a random set of recipes within the requested limits., limitLicense: bool=true # Whether the recipes should have an open license that allows display with proper attribution.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/information
@desc Get Recipe Information
@required {id: num # The id of the recipe.}
@optional {includeNutrition: bool=false # Include nutrition data in the recipe information. Nutrition data is per serving. If you want the nutrition data for the entire recipe, just multiply by the number of servings.}
@returns(200) {id: int, title: str, image: str, imageType: str, servings: num, readyInMinutes: int, license: str, sourceName: str, sourceUrl: str, spoonacularSourceUrl: str, aggregateLikes: int, healthScore: num, spoonacularScore: num, pricePerServing: num, analyzedInstructions: [map], cheap: bool, creditsText: str, cuisines: [str], dairyFree: bool, diets: [str], gaps: str, glutenFree: bool, instructions: str, ketogenic: bool, lowFodmap: bool, occasions: [str], sustainable: bool, vegan: bool, vegetarian: bool, veryHealthy: bool, veryPopular: bool, whole30: bool, weightWatcherSmartPoints: num, dishTypes: [str], extendedIngredients: [map], summary: str, winePairing: map{pairedWines: [str], pairingText: str, productMatches: [map]}} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/informationBulk
@desc Get Recipe Information Bulk
@required {ids: str # A comma-separated list of recipe ids.}
@optional {includeNutrition: bool=false # Include nutrition data in the recipe information. Nutrition data is per serving. If you want the nutrition data for the entire recipe, just multiply by the number of servings.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/similar
@desc Get Similar Recipes
@required {id: num # The id of the source recipe for which similar recipes should be found.}
@optional {number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10., limitLicense: bool=true # Whether the recipes should have an open license that allows display with proper attribution.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/random
@desc Get Random Recipes
@optional {limitLicense: bool=true # Whether the recipes should have an open license that allows display with proper attribution., tags: str # The tags (can be diets, meal types, cuisines, or intolerances) that the recipe must have., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) {recipes: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/autocomplete
@desc Autocomplete Recipe Search
@optional {query: str # The (natural language) search query., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/tasteWidget.json
@desc Taste by ID
@required {id: num # The recipe id.}
@optional {normalize: bool(false/true)=true # Normalize to the strongest taste.}
@returns(200) {sweetness: num, saltiness: num, sourness: num, bitterness: num, savoriness: num, fattiness: num, spiciness: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/tasteWidget.png
@desc Recipe Taste by ID Image
@required {id: num # The recipe id.}
@optional {normalize: bool # Normalize to the strongest taste., rgb: str # Red, green, blue values for the chart color.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/equipmentWidget.json
@desc Equipment by ID
@required {id: num # The recipe id.}
@returns(200) {equipment: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/equipmentWidget.png
@desc Equipment by ID Image
@required {id: num # The recipe id.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/priceBreakdownWidget.json
@desc Price Breakdown by ID
@required {id: num # The recipe id.}
@returns(200) {ingredients: [map], totalCost: num, totalCostPerServing: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/priceBreakdownWidget.png
@desc Price Breakdown by ID Image
@required {id: num # The recipe id.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/ingredientWidget.json
@desc Ingredients by ID
@required {id: num # The recipe id.}
@returns(200) {ingredients: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/ingredientWidget.png
@desc Ingredients by ID Image
@required {id: num # The recipe id.}
@optional {measure: str(us/metric) # Whether the the measures should be 'us' or 'metric'.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/nutritionWidget.json
@desc Nutrition by ID
@required {id: num # The recipe id.}
@returns(200) {calories: str, carbs: str, fat: str, protein: str, bad: [any], good: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/nutritionWidget.png
@desc Recipe Nutrition by ID Image
@required {id: num # The recipe id.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/nutritionLabel
@desc Recipe Nutrition Label Widget
@required {id: num # The recipe id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., showOptionalNutrients: bool # Whether to show optional nutrients., showZeroValues: bool # Whether to show zero values., showIngredients: bool # Whether to show a list of ingredients.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/nutritionLabel.png
@desc Recipe Nutrition Label Image
@required {id: num # The recipe id.}
@optional {showOptionalNutrients: bool # Whether to show optional nutrients., showZeroValues: bool # Whether to show zero values., showIngredients: bool # Whether to show a list of ingredients.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/analyzedInstructions
@desc Get Analyzed Recipe Instructions
@required {id: num # The recipe id.}
@optional {stepBreakdown: bool # Whether to break down the recipe steps even more.}
@returns(200) {parsedInstructions: [map], ingredients: [map], equipment: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/extract
@desc Extract Recipe from Website
@required {url: str # The URL of the recipe page.}
@optional {forceExtraction: bool # If true, the extraction will be triggered whether we already know the recipe or not. Use this only if information is missing as this operation is slower., analyze: bool # If true, the recipe will be analyzed and classified resolving in more data such as cuisines, dish types, and more., includeNutrition: bool=false # Include nutrition data in the recipe information. Nutrition data is per serving. If you want the nutrition data for the entire recipe, just multiply by the number of servings., includeTaste: bool=false # Whether taste data should be added to correctly parsed ingredients.}
@returns(200) {id: int, title: str, image: str, imageType: str, servings: num, readyInMinutes: int, license: str, sourceName: str, sourceUrl: str, spoonacularSourceUrl: str, aggregateLikes: int, healthScore: num, spoonacularScore: num, pricePerServing: num, analyzedInstructions: [map], cheap: bool, creditsText: str, cuisines: [str], dairyFree: bool, diets: [str], gaps: str, glutenFree: bool, instructions: str, ketogenic: bool, lowFodmap: bool, occasions: [str], sustainable: bool, vegan: bool, vegetarian: bool, veryHealthy: bool, veryPopular: bool, whole30: bool, weightWatcherSmartPoints: num, dishTypes: [str], extendedIngredients: [map], summary: str, winePairing: map{pairedWines: [str], pairingText: str, productMatches: [map]}} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/ingredientWidget
@desc Ingredients by ID Widget
@required {id: num # The recipe id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., measure: str(us/metric) # Whether the the measures should be 'us' or 'metric'.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/tasteWidget
@desc Recipe Taste by ID Widget
@required {id: num # The recipe id.}
@optional {normalize: bool(true/false)=true # Whether to normalize to the strongest taste., rgb: str # Red, green, blue values for the chart color.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/equipmentWidget
@desc Equipment by ID Widget
@required {id: num # The recipe id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/priceBreakdownWidget
@desc Price Breakdown by ID Widget
@required {id: num # The recipe id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/visualizeTaste
@desc Recipe Taste Widget
@optional {language: str(en/de) # The language of the input. Either 'en' or 'de'., Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type., Accept: str(application/json/text/html/media/*) # Accept header., normalize: bool # Whether to normalize to the strongest taste., rgb: str # Red, green, blue values for the chart color.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/visualizeNutrition
@desc Recipe Nutrition Widget
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type., Accept: str(application/json/text/html/media/*) # Accept header., language: str(en/de) # The language of the input. Either 'en' or 'de'.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/visualizePriceEstimator
@desc Price Breakdown Widget
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type., Accept: str(application/json/text/html/media/*) # Accept header., language: str(en/de) # The language of the input. Either 'en' or 'de'.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/visualizeEquipment
@desc Equipment Widget
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type., Accept: str(application/json/text/html/media/*) # Accept header.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/analyze
@desc Analyze Recipe
@optional {language: str # The input language, either "en" or "de"., includeNutrition: bool # Whether nutrition data should be added to correctly parsed ingredients., includeTaste: bool # Whether taste data should be added to correctly parsed ingredients., title: str, servings: int, ingredients: [str], instructions: str}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"title":"Spaghetti Carbonara","servings":2,"ingredients":["1 lb spaghetti","3.5 oz pancetta","2 Tbsps olive oil","1  egg","0.5 cup parmesan cheese"],"instructions":"Bring a large pot of water to a boil and season generously with salt. Add the pasta to the water once boiling and cook until al dente. Reserve 2 cups of cooking water and drain the pasta. "}

@endpoint GET /recipes/{id}/summary
@desc Summarize Recipe
@required {id: num # The recipe id.}
@returns(200) {id: int, summary: str, title: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/card
@desc Create Recipe Card
@required {id: num # The recipe id.}
@optional {mask: str # The mask to put over the recipe image ("ellipseMask", "diamondMask", "starMask", "heartMask", "potMask", "fishMask")., backgroundImage: str # The background image ("none","background1", or "background2")., backgroundColor: str # The background color for the recipe card as a hex-string., fontColor: str # The font color for the recipe card as a hex-string.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/visualizeRecipe
@desc Create Recipe Card
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type.}
@returns(200) {url: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/analyzeInstructions
@desc Analyze Recipe Instructions
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type.}
@returns(200) {parsedInstructions: [any], ingredients: [any], equipment: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/cuisine
@desc Classify Cuisine
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type.}
@returns(200) {cuisine: str, cuisines: [str], confidence: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/queries/analyze
@desc Analyze a Recipe Search Query
@required {q: str # The recipe search query.}
@returns(200) {dishes: [map], ingredients: [map], cuisines: [str], modifiers: [str]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/convert
@desc Convert Amounts
@required {ingredientName: str # The ingredient which you want to convert., sourceAmount: num # The amount from which you want to convert, e.g. the 2.5 in "2.5 cups of flour to grams"., sourceUnit: str # The unit from which you want to convert, e.g. the grams in "2.5 cups of flour to grams". You can also use "piece", e.g. "3.4 oz tomatoes to piece", targetUnit: str # The unit to which you want to convert, e.g. the grams in "2.5 cups of flour to grams". You can also use "piece", e.g. "3.4 oz tomatoes to piece"}
@returns(200) {sourceAmount: num, sourceUnit: str, targetAmount: num, targetUnit: str, answer: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/parseIngredients
@desc Parse Ingredients
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type., language: str(en/de) # The language of the input. Either 'en' or 'de'.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/{id}/nutritionWidget
@desc Recipe Nutrition by ID Widget
@required {id: num # The recipe id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., Accept: str(application/json/text/html/media/*) # Accept header.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /recipes/visualizeIngredients
@desc Ingredients Widget
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type., language: str(en/de) # The language of the input. Either 'en' or 'de'., Accept: str(application/json/text/html/media/*) # Accept header.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /recipes/guessNutrition
@desc Guess Nutrition by Dish Name
@required {title: str # The title of the dish.}
@returns(200) {calories: map{confidenceRange95Percent: map{max: num, min: num}, standardDeviation: num, unit: str, value: num}, carbs: map{confidenceRange95Percent: map{max: num, min: num}, standardDeviation: num, unit: str, value: num}, fat: map{confidenceRange95Percent: map{max: num, min: num}, standardDeviation: num, unit: str, value: num}, protein: map{confidenceRange95Percent: map{max: num, min: num}, standardDeviation: num, unit: str, value: num}, recipesUsed: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@group food
@endpoint GET /food/ingredients/{id}/information
@desc Get Ingredient Information
@required {id: num # The ingredient id.}
@optional {amount: num # The amount of this ingredient., unit: str # The unit for the given amount.}
@returns(200) {id: int, original: str, originalName: str, name: str, nameClean: str, amount: num, unit: str, unitShort: str, unitLong: str, possibleUnits: [str], estimatedCost: map{value: num, unit: str}, consistency: str, shoppingListUnits: [str], aisle: str, image: str, meta: [map], nutrition: map{nutrients: [map], properties: [map], caloricBreakdown: map{percentProtein: num, percentFat: num, percentCarbs: num}, weightPerServing: map{amount: num, unit: str}}, categoryPath: [str]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/ingredients/{id}/amount
@desc Compute Ingredient Amount
@required {id: num # The id of the ingredient you want the amount for., nutrient: str # The target nutrient. See a list of supported nutrients., target: num # The target number of the given nutrient.}
@optional {unit: str # The target unit.}
@returns(200) {amount: num, unit: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /food/ingredients/glycemicLoad
@desc Compute Glycemic Load
@required {ingredients: [str]}
@optional {language: str(en/de) # The language of the input. Either 'en' or 'de'.}
@returns(200) {totalGlycemicLoad: num, ingredients: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"ingredients":["1 kiwi","2 cups rice","2 glasses of water"]}

@endpoint GET /food/ingredients/autocomplete
@desc Autocomplete Ingredient Search
@optional {query: str # The (natural language) search query., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10., metaInformation: bool # Whether to return more meta information about the ingredients., intolerances: str # A comma-separated list of intolerances. All recipes returned must not contain ingredients that are not suitable for people with the intolerances entered. See a full list of supported intolerances., language: str(en/de) # The language of the input. Either 'en' or 'de'.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/ingredients/search
@desc Ingredient Search
@optional {query: str # The (natural language) search query., addChildren: bool # Whether to add children of found foods., minProteinPercent: num # The minimum percentage of protein the food must have (between 0 and 100)., maxProteinPercent: num # The maximum percentage of protein the food can have (between 0 and 100)., minFatPercent: num # The minimum percentage of fat the food must have (between 0 and 100)., maxFatPercent: num # The maximum percentage of fat the food can have (between 0 and 100)., minCarbsPercent: num # The minimum percentage of carbs the food must have (between 0 and 100)., maxCarbsPercent: num # The maximum percentage of carbs the food can have (between 0 and 100)., metaInformation: bool # Whether to return more meta information about the ingredients., intolerances: str # A comma-separated list of intolerances. All recipes returned must not contain ingredients that are not suitable for people with the intolerances entered. See a full list of supported intolerances., sort: str # The strategy to sort recipes by. See a full list of supported sorting options., sortDirection: str # The direction in which to sort. Must be either 'asc' (ascending) or 'desc' (descending)., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10., language: str(en/de) # The language of the input. Either 'en' or 'de'.}
@returns(200) {results: [map], offset: int, number: int, totalResults: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/ingredients/substitutes
@desc Get Ingredient Substitutes
@required {ingredientName: str # The name of the ingredient you want to replace.}
@returns(200) {ingredient: str, substitutes: [str], message: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/ingredients/{id}/substitutes
@desc Get Ingredient Substitutes by ID
@required {id: num # The id of the ingredient you want substitutes for.}
@returns(200) {ingredient: str, substitutes: [str], message: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/search
@desc Search Grocery Products
@optional {query: str # The (natural language) search query., minCalories: num # The minimum amount of calories the product must have., maxCalories: num # The maximum amount of calories the product can have., minCarbs: num # The minimum amount of carbohydrates in grams the product must have., maxCarbs: num # The maximum amount of carbohydrates in grams the product can have., minProtein: num # The minimum amount of protein in grams the product must have., maxProtein: num # The maximum amount of protein in grams the product can have., minFat: num # The minimum amount of fat in grams the product must have., maxFat: num # The maximum amount of fat in grams the product can have., addProductInformation: bool(false/true) # If set to true, you get more information about the products returned., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) {products: [map], totalProducts: int, type: str, offset: int, number: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/upc/{upc}
@desc Search Grocery Products by UPC
@required {upc: num # The product's UPC.}
@returns(200) {id: int, title: str, badges: [str], importantBadges: [str], breadcrumbs: [str], generatedText: str, imageType: str, ingredientCount: int, ingredientList: str, ingredients: [map], likes: num, nutrition: map{nutrients: [map], caloricBreakdown: map{percentProtein: num, percentFat: num, percentCarbs: num}}, price: num, servings: map{number: num, size: num, unit: str}, spoonacularScore: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/customFoods/search
@desc Search Custom Foods
@required {username: str # The username., hash: str # The private hash for the username.}
@optional {query: str # The (natural language) search query., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) {customFoods: [map], type: str, offset: int, number: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/{id}
@desc Get Product Information
@required {id: num # The id of the packaged food.}
@returns(200) {id: int, title: str, breadcrumbs: [str], imageType: str, badges: [str], importantBadges: [str], ingredientCount: int, generatedText: any, ingredientList: str, ingredients: [map], likes: num, aisle: str, nutrition: map{nutrients: [map], caloricBreakdown: map{percentProtein: num, percentFat: num, percentCarbs: num}}, price: num, servings: map{number: num, size: num, unit: str}, spoonacularScore: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/upc/{upc}/comparable
@desc Get Comparable Products
@required {upc: num # The UPC of the product for which you want to find comparable products.}
@returns(200) {comparableProducts: map{calories: [map], likes: [map], price: [map], protein: [map], spoonacularScore: [map], sugar: [map]}} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/suggest
@desc Autocomplete Product Search
@required {query: str # The (partial) search query.}
@optional {number: int # The number of results to return (between 1 and 25).}
@returns(200) {results: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/{id}/nutritionWidget
@desc Product Nutrition by ID Widget
@required {id: num # The id of the product.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., Accept: str(application/json/text/html/media/*) # Accept header.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/{id}/nutritionWidget.png
@desc Product Nutrition by ID Image
@required {id: num # The id of the product.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/{id}/nutritionLabel
@desc Product Nutrition Label Widget
@required {id: num # The product id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., showOptionalNutrients: bool # Whether to show optional nutrients., showZeroValues: bool # Whether to show zero values., showIngredients: bool # Whether to show a list of ingredients.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/products/{id}/nutritionLabel.png
@desc Product Nutrition Label Image
@required {id: num # The product id.}
@optional {showOptionalNutrients: bool # Whether to show optional nutrients., showZeroValues: bool # Whether to show zero values., showIngredients: bool # Whether to show a list of ingredients.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /food/products/classify
@desc Classify Grocery Product
@required {title: str, upc: str, plu_code: str}
@optional {locale: str(en_US/en_GB) # The display name of the returned category, supported is en_US (for American English) and en_GB (for British English).}
@returns(200) {cleanTitle: str, image: str, category: str, breadcrumbs: [str], usdaCode: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"title":"Kroger Vitamin A & D Reduced Fat 2% Milk","upc":"","plu_code":""}

@endpoint POST /food/products/classifyBatch
@desc Classify Grocery Product Bulk
@optional {locale: str # The display name of the returned category, supported is en_US (for American English) and en_GB (for British English).}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request [{"title":"Kroger Vitamin A & D Reduced Fat 2% Milk","upc":"","plu_code":""}]

@endpoint POST /food/ingredients/map
@desc Map Ingredients to Grocery Products
@required {ingredients: [str], servings: num}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"ingredients":["eggs","bacon"],"servings":2}

@endpoint GET /food/menuItems/suggest
@desc Autocomplete Menu Item Search
@required {query: str # The (partial) search query.}
@optional {number: num # The number of results to return (between 1 and 25).}
@returns(200) {results: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/menuItems/search
@desc Search Menu Items
@optional {query: str # The (natural language) search query., minCalories: num # The minimum amount of calories the menu item must have., maxCalories: num # The maximum amount of calories the menu item can have., minCarbs: num # The minimum amount of carbohydrates in grams the menu item must have., maxCarbs: num # The maximum amount of carbohydrates in grams the menu item can have., minProtein: num # The minimum amount of protein in grams the menu item must have., maxProtein: num # The maximum amount of protein in grams the menu item can have., minFat: num # The minimum amount of fat in grams the menu item must have., maxFat: num # The maximum amount of fat in grams the menu item can have., addMenuItemInformation: bool(false/true) # If set to true, you get more information about the menu items returned., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) {menuItems: [map], totalMenuItems: int, type: str, offset: int, number: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/menuItems/{id}
@desc Get Menu Item Information
@required {id: num # The menu item id.}
@returns(200) {id: int, title: str, restaurantChain: str, nutrition: map{nutrients: [map], caloricBreakdown: map{percentProtein: num, percentFat: num, percentCarbs: num}}, badges: [str], breadcrumbs: [str], generatedText: str, imageType: str, likes: num, servings: map{number: num, size: num, unit: str}, price: num, spoonacularScore: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/menuItems/{id}/nutritionWidget
@desc Menu Item Nutrition by ID Widget
@required {id: num # The menu item id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., Accept: str(application/json/text/html/media/*) # Accept header.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/menuItems/{id}/nutritionWidget.png
@desc Menu Item Nutrition by ID Image
@required {id: num # The menu item id.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/menuItems/{id}/nutritionLabel
@desc Menu Item Nutrition Label Widget
@required {id: num # The menu item id.}
@optional {defaultCss: bool=true # Whether the default CSS should be added to the response., showOptionalNutrients: bool # Whether to show optional nutrients., showZeroValues: bool # Whether to show zero values., showIngredients: bool # Whether to show a list of ingredients.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/menuItems/{id}/nutritionLabel.png
@desc Menu Item Nutrition Label Image
@required {id: num # The menu item id.}
@optional {showOptionalNutrients: bool # Whether to show optional nutrients., showZeroValues: bool # Whether to show zero values., showIngredients: bool # Whether to show a list of ingredients.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@group mealplanner
@endpoint GET /mealplanner/generate
@desc Generate Meal Plan
@optional {timeFrame: str # Either for one "day" or an entire "week"., targetCalories: num # What is the caloric target for one day? The meal plan generator will try to get as close as possible to that goal., diet: str # Enter a diet that the meal plan has to adhere to. See a full list of supported diets., exclude: str # A comma-separated list of allergens or ingredients that must be excluded.}
@returns(200) {meals: [map], nutrients: map{calories: num, carbohydrates: num, fat: num, protein: num}} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /mealplanner/{username}/week/{start-date}
@desc Get Meal Plan Week
@required {username: str # The username., start-date: str # The start date of the meal planned week in the format yyyy-mm-dd., hash: str # The private hash for the username.}
@returns(200) {days: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint DELETE /mealplanner/{username}/day/{date}
@desc Clear Meal Plan Day
@required {username: str # The username., date: str # The date in the format yyyy-mm-dd., hash: str # The private hash for the username.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /mealplanner/{username}/items
@desc Add to Meal Plan
@required {username: str # The username., hash: str # The private hash for the username., date: num, slot: int, position: int, type: str, value: map{ingredients!: [map]}}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"date":1589500800,"slot":1,"position":0,"type":"INGREDIENTS","value":{"ingredients":[{"name":"1 banana"}]}}

@endpoint DELETE /mealplanner/{username}/items/{id}
@desc Delete from Meal Plan
@required {username: str # The username., id: num # The shopping list item id., hash: str # The private hash for the username.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /mealplanner/{username}/templates
@desc Get Meal Plan Templates
@required {username: str # The username., hash: str # The private hash for the username.}
@returns(200) {templates: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /mealplanner/{username}/templates
@desc Add Meal Plan Template
@required {username: str # The username., hash: str # The private hash for the username.}
@returns(200) {name: str, items: [map], publishAsPublic: bool} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /mealplanner/{username}/templates/{id}
@desc Get Meal Plan Template
@required {username: str # The username., id: num # The shopping list item id., hash: str # The private hash for the username.}
@returns(200) {id: int, name: str, days: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint DELETE /mealplanner/{username}/templates/{id}
@desc Delete Meal Plan Template
@required {username: str # The username., id: num # The shopping list item id., hash: str # The private hash for the username.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /mealplanner/{username}/shopping-list
@desc Get Shopping List
@required {username: str # The username., hash: str # The private hash for the username.}
@returns(200) {aisles: [map], cost: num, startDate: num, endDate: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint POST /mealplanner/{username}/shopping-list/{start-date}/{end-date}
@desc Generate Shopping List
@required {username: str # The username., start-date: str # The start date in the format yyyy-mm-dd., end-date: str # The end date in the format yyyy-mm-dd., hash: str # The private hash for the username.}
@returns(200) {aisles: [map], cost: num, startDate: num, endDate: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@group users
@endpoint POST /users/connect
@desc Connect User
@required {username: str, firstName: str, lastName: str, email: str}
@returns(200) {username: str, hash: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"username":"your user's name","firstName":"your user's first name","lastName":"your user's last name","email":"your user's email"}

@endgroup

@group mealplanner
@endpoint POST /mealplanner/{username}/shopping-list/items
@desc Add to Shopping List
@required {username: str # The username., hash: str # The private hash for the username., item: str, aisle: str, parse: bool}
@returns(200) {aisles: [map], cost: num, startDate: num, endDate: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}
@example_request {"item":"1 package baking powder","aisle":"Baking","parse":true}

@endpoint DELETE /mealplanner/{username}/shopping-list/items/{id}
@desc Delete from Shopping List
@required {username: str # The username., id: num # The shopping list item id., hash: str # The private hash for the username.}
@returns(200) Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@group food
@endpoint GET /food/restaurants/search
@desc Search Restaurants
@optional {query: str # The search query., lat: num # The latitude of the user's location., lng: num # The longitude of the user's location."., distance: num # The distance around the location in miles., budget: num # The user's budget for a meal in USD., cuisine: str # The cuisine of the restaurant., min-rating: num # The minimum rating of the restaurant between 0 and 5., is-open: bool # Whether the restaurant must be open at the time of search., sort: str # How to sort the results, one of the following 'cheapest', 'fastest', 'rating', 'distance' or the default 'relevance'., page: num # The page number of results.}
@returns(200) {restaurants: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/wine/dishes
@desc Dish Pairing for Wine
@required {wine: str # The type of wine that should be paired, e.g. "merlot", "riesling", or "malbec".}
@returns(200) {pairings: [str], text: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/wine/pairing
@desc Wine Pairing
@required {food: str # The food to get a pairing for. This can be a dish ("steak"), an ingredient ("salmon"), or a cuisine ("italian").}
@optional {maxPrice: num # The maximum price for the specific wine recommendation in USD.}
@returns(200) {pairedWines: [str], pairingText: str, productMatches: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/wine/description
@desc Wine Description
@required {wine: str # The name of the wine that should be paired, e.g. "merlot", "riesling", or "malbec".}
@returns(200) {wineDescription: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/wine/recommendation
@desc Wine Recommendation
@required {wine: str # The type of wine to get a specific product recommendation for.}
@optional {maxPrice: num # The maximum price for the specific wine recommendation in USD., minRating: num # The minimum rating of the recommended wine between 0 and 1. For example, 0.8 equals 4 out of 5 stars., number: num=10 # The number of wine recommendations expected (between 1 and 100).}
@returns(200) {recommendedWines: [map], totalFound: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/images/classify
@desc Image Classification by URL
@required {imageUrl: str # The URL of the image to be classified.}
@returns(200) {category: str, probability: num} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/images/analyze
@desc Image Analysis by URL
@required {imageUrl: str # The URL of the image to be analyzed.}
@returns(200) {nutrition: map{recipesUsed: int, calories: map{value: num, unit: str, confidenceRange95Percent: map{min: num, max: num}, standardDeviation: num}, fat: map{value: num, unit: str, confidenceRange95Percent: map{min: num, max: num}, standardDeviation: num}, protein: map{value: num, unit: str, confidenceRange95Percent: map{min: num, max: num}, standardDeviation: num}, carbs: map{value: num, unit: str, confidenceRange95Percent: map{min: num, max: num}, standardDeviation: num}}, category: map{name: str, probability: num}, recipes: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@group recipes
@endpoint GET /recipes/quickAnswer
@desc Quick Answer
@required {q: str # The nutrition related question.}
@returns(200) {answer: str, image: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@group food
@endpoint POST /food/detect
@desc Detect Food in Text
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data) # The content type.}
@returns(200) {annotations: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/site/search
@desc Search Site Content
@required {query: str # The query to search for. You can also use partial queries such as "spagh" to already find spaghetti recipes, articles, grocery products, and other content.}
@returns(200) {Articles: [any], Grocery Products: [any], Menu Items: [any], Recipes: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/search
@desc Search All Food
@required {query: str # The search query.}
@optional {offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) {query: str, totalResults: int, limit: int, offset: int, searchResults: [map]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/videos/search
@desc Search Food Videos
@optional {query: str # The (natural language) search query., type: str # The type of the recipes. See a full list of supported meal types., cuisine: str # The cuisine(s) of the recipes. One or more, comma separated. See a full list of supported cuisines., diet: str # The diet for which the recipes must be suitable. See a full list of supported diets., includeIngredients: str # A comma-separated list of ingredients that the recipes should contain., excludeIngredients: str # A comma-separated list of ingredients or ingredient types that the recipes must not contain., minLength: num # Minimum video length in seconds., maxLength: num # Maximum video length in seconds., offset: int # The number of results to skip (between 0 and 900)., number: int=10 # The maximum number of items to return (between 1 and 100). Defaults to 10.}
@returns(200) {videos: [map], totalResults: int} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/jokes/random
@desc Random Food Joke
@returns(200) {text: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/trivia/random
@desc Random Food Trivia
@returns(200) {text: str} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/converse
@desc Talk to Chatbot
@required {text: str # The request / question / answer from the user to the chatbot.}
@optional {contextId: str # An arbitrary globally unique id for your conversation. The conversation can contain states so you should pass your context id if you want the bot to be able to remember the conversation.}
@returns(200) {answerText: str, media: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endpoint GET /food/converse/suggest
@desc Conversation Suggests
@required {query: str # A (partial) query from the user. The endpoint will return if it matches topics it can talk about.}
@optional {number: num # The number of suggestions to return (between 1 and 25).}
@returns(200) {suggests: map{_: [any]}, words: [any]} # Success
@errors {401: Unauthorized, 403: Forbidden, 404: Not Found}

@endgroup

@end
