@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
@optional {query: str, cuisine: str, excludeCuisine: str, diet: str, intolerances: str, equipment: str, includeIngredients: str, excludeIngredients: str, type: str, instructionsRequired: bool, fillIngredients: bool, addRecipeInformation: bool, addRecipeNutrition: bool, author: str, tags: str, recipeBoxId: num, titleMatch: str, maxReadyTime: num, ignorePantry: bool=false, sort: str, sortDirection: str, minCarbs: num, maxCarbs: num, minProtein: num, maxProtein: num, minCalories: num, maxCalories: num, minFat: num, maxFat: num, minAlcohol: num, maxAlcohol: num, minCaffeine: num, maxCaffeine: num, minCopper: num, maxCopper: num, minCalcium: num, maxCalcium: num, minCholine: num, maxCholine: num, minCholesterol: num, maxCholesterol: num, minFluoride: num, maxFluoride: num, minSaturatedFat: num, maxSaturatedFat: num, minVitaminA: num, maxVitaminA: num, minVitaminC: num, maxVitaminC: num, minVitaminD: num, maxVitaminD: num, minVitaminE: num, maxVitaminE: num, minVitaminK: num, maxVitaminK: num, minVitaminB1: num, maxVitaminB1: num, minVitaminB2: num, maxVitaminB2: num, minVitaminB5: num, maxVitaminB5: num, minVitaminB3: num, maxVitaminB3: num, minVitaminB6: num, maxVitaminB6: num, minVitaminB12: num, maxVitaminB12: num, minFiber: num, maxFiber: num, minFolate: num, maxFolate: num, minFolicAcid: num, maxFolicAcid: num, minIodine: num, maxIodine: num, minIron: num, maxIron: num, minMagnesium: num, maxMagnesium: num, minManganese: num, maxManganese: num, minPhosphorus: num, maxPhosphorus: num, minPotassium: num, maxPotassium: num, minSelenium: num, maxSelenium: num, minSodium: num, maxSodium: num, minSugar: num, maxSugar: num, minZinc: num, maxZinc: num, offset: int, number: int=10, limitLicense: bool=true}
@returns(200) {offset: int, number: int, results: [map], totalResults: int}
@errors {401, 403, 404}

@endpoint GET /recipes/findByIngredients
@optional {ingredients: str, number: int=10, limitLicense: bool=true, ranking: num, ignorePantry: bool=false}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/findByNutrients
@optional {minCarbs: num, maxCarbs: num, minProtein: num, maxProtein: num, minCalories: num, maxCalories: num, minFat: num, maxFat: num, minAlcohol: num, maxAlcohol: num, minCaffeine: num, maxCaffeine: num, minCopper: num, maxCopper: num, minCalcium: num, maxCalcium: num, minCholine: num, maxCholine: num, minCholesterol: num, maxCholesterol: num, minFluoride: num, maxFluoride: num, minSaturatedFat: num, maxSaturatedFat: num, minVitaminA: num, maxVitaminA: num, minVitaminC: num, maxVitaminC: num, minVitaminD: num, maxVitaminD: num, minVitaminE: num, maxVitaminE: num, minVitaminK: num, maxVitaminK: num, minVitaminB1: num, maxVitaminB1: num, minVitaminB2: num, maxVitaminB2: num, minVitaminB5: num, maxVitaminB5: num, minVitaminB3: num, maxVitaminB3: num, minVitaminB6: num, maxVitaminB6: num, minVitaminB12: num, maxVitaminB12: num, minFiber: num, maxFiber: num, minFolate: num, maxFolate: num, minFolicAcid: num, maxFolicAcid: num, minIodine: num, maxIodine: num, minIron: num, maxIron: num, minMagnesium: num, maxMagnesium: num, minManganese: num, maxManganese: num, minPhosphorus: num, maxPhosphorus: num, minPotassium: num, maxPotassium: num, minSelenium: num, maxSelenium: num, minSodium: num, maxSodium: num, minSugar: num, maxSugar: num, minZinc: num, maxZinc: num, offset: int, number: int=10, random: bool, limitLicense: bool=true}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/information
@required {id: num}
@optional {includeNutrition: bool=false}
@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]}}
@errors {401, 403, 404}

@endpoint GET /recipes/informationBulk
@required {ids: str}
@optional {includeNutrition: bool=false}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/similar
@required {id: num}
@optional {number: int=10, limitLicense: bool=true}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/random
@optional {limitLicense: bool=true, tags: str, number: int=10}
@returns(200) {recipes: [map]}
@errors {401, 403, 404}

@endpoint GET /recipes/autocomplete
@optional {query: str, number: int=10}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/tasteWidget.json
@required {id: num}
@optional {normalize: bool(false/true)=true}
@returns(200) {sweetness: num, saltiness: num, sourness: num, bitterness: num, savoriness: num, fattiness: num, spiciness: num}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/tasteWidget.png
@required {id: num}
@optional {normalize: bool, rgb: str}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/equipmentWidget.json
@required {id: num}
@returns(200) {equipment: [any]}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/equipmentWidget.png
@required {id: num}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/priceBreakdownWidget.json
@required {id: num}
@returns(200) {ingredients: [map], totalCost: num, totalCostPerServing: num}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/priceBreakdownWidget.png
@required {id: num}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/ingredientWidget.json
@required {id: num}
@returns(200) {ingredients: [map]}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/ingredientWidget.png
@required {id: num}
@optional {measure: str(us/metric)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/nutritionWidget.json
@required {id: num}
@returns(200) {calories: str, carbs: str, fat: str, protein: str, bad: [any], good: [any]}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/nutritionWidget.png
@required {id: num}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/nutritionLabel
@required {id: num}
@optional {defaultCss: bool=true, showOptionalNutrients: bool, showZeroValues: bool, showIngredients: bool}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/nutritionLabel.png
@required {id: num}
@optional {showOptionalNutrients: bool, showZeroValues: bool, showIngredients: bool}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/analyzedInstructions
@required {id: num}
@optional {stepBreakdown: bool}
@returns(200) {parsedInstructions: [map], ingredients: [map], equipment: [map]}
@errors {401, 403, 404}

@endpoint GET /recipes/extract
@required {url: str}
@optional {forceExtraction: bool, analyze: bool, includeNutrition: bool=false, includeTaste: bool=false}
@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]}}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/ingredientWidget
@required {id: num}
@optional {defaultCss: bool=true, measure: str(us/metric)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/tasteWidget
@required {id: num}
@optional {normalize: bool(true/false)=true, rgb: str}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/equipmentWidget
@required {id: num}
@optional {defaultCss: bool=true}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/priceBreakdownWidget
@required {id: num}
@optional {defaultCss: bool=true}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/visualizeTaste
@optional {language: str(en/de), Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data), Accept: str(application/json/text/html/media/*), normalize: bool, rgb: str}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/visualizeNutrition
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data), Accept: str(application/json/text/html/media/*), language: str(en/de)}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/visualizePriceEstimator
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data), Accept: str(application/json/text/html/media/*), language: str(en/de)}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/visualizeEquipment
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data), Accept: str(application/json/text/html/media/*)}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/analyze
@optional {language: str, includeNutrition: bool, includeTaste: bool, title: str, servings: int, ingredients: [str], instructions: str}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/summary
@required {id: num}
@returns(200) {id: int, summary: str, title: str}
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/card
@required {id: num}
@optional {mask: str, backgroundImage: str, backgroundColor: str, fontColor: str}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/visualizeRecipe
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data)}
@returns(200) {url: str}
@errors {401, 403, 404}

@endpoint POST /recipes/analyzeInstructions
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data)}
@returns(200) {parsedInstructions: [any], ingredients: [any], equipment: [any]}
@errors {401, 403, 404}

@endpoint POST /recipes/cuisine
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data)}
@returns(200) {cuisine: str, cuisines: [str], confidence: num}
@errors {401, 403, 404}

@endpoint GET /recipes/queries/analyze
@required {q: str}
@returns(200) {dishes: [map], ingredients: [map], cuisines: [str], modifiers: [str]}
@errors {401, 403, 404}

@endpoint GET /recipes/convert
@required {ingredientName: str, sourceAmount: num, sourceUnit: str, targetUnit: str}
@returns(200) {sourceAmount: num, sourceUnit: str, targetAmount: num, targetUnit: str, answer: str}
@errors {401, 403, 404}

@endpoint POST /recipes/parseIngredients
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data), language: str(en/de)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/{id}/nutritionWidget
@required {id: num}
@optional {defaultCss: bool=true, Accept: str(application/json/text/html/media/*)}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /recipes/visualizeIngredients
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data), language: str(en/de), Accept: str(application/json/text/html/media/*)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /recipes/guessNutrition
@required {title: str}
@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}
@errors {401, 403, 404}

@endgroup

@group food
@endpoint GET /food/ingredients/{id}/information
@required {id: num}
@optional {amount: num, unit: str}
@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]}
@errors {401, 403, 404}

@endpoint GET /food/ingredients/{id}/amount
@required {id: num, nutrient: str, target: num}
@optional {unit: str}
@returns(200) {amount: num, unit: str}
@errors {401, 403, 404}

@endpoint POST /food/ingredients/glycemicLoad
@required {ingredients: [str]}
@optional {language: str(en/de)}
@returns(200) {totalGlycemicLoad: num, ingredients: [map]}
@errors {401, 403, 404}

@endpoint GET /food/ingredients/autocomplete
@optional {query: str, number: int=10, metaInformation: bool, intolerances: str, language: str(en/de)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/ingredients/search
@optional {query: str, addChildren: bool, minProteinPercent: num, maxProteinPercent: num, minFatPercent: num, maxFatPercent: num, minCarbsPercent: num, maxCarbsPercent: num, metaInformation: bool, intolerances: str, sort: str, sortDirection: str, offset: int, number: int=10, language: str(en/de)}
@returns(200) {results: [map], offset: int, number: int, totalResults: int}
@errors {401, 403, 404}

@endpoint GET /food/ingredients/substitutes
@required {ingredientName: str}
@returns(200) {ingredient: str, substitutes: [str], message: str}
@errors {401, 403, 404}

@endpoint GET /food/ingredients/{id}/substitutes
@required {id: num}
@returns(200) {ingredient: str, substitutes: [str], message: str}
@errors {401, 403, 404}

@endpoint GET /food/products/search
@optional {query: str, minCalories: num, maxCalories: num, minCarbs: num, maxCarbs: num, minProtein: num, maxProtein: num, minFat: num, maxFat: num, addProductInformation: bool(false/true), offset: int, number: int=10}
@returns(200) {products: [map], totalProducts: int, type: str, offset: int, number: int}
@errors {401, 403, 404}

@endpoint GET /food/products/upc/{upc}
@required {upc: num}
@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}
@errors {401, 403, 404}

@endpoint GET /food/customFoods/search
@required {username: str, hash: str}
@optional {query: str, offset: int, number: int=10}
@returns(200) {customFoods: [map], type: str, offset: int, number: int}
@errors {401, 403, 404}

@endpoint GET /food/products/{id}
@required {id: num}
@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}
@errors {401, 403, 404}

@endpoint GET /food/products/upc/{upc}/comparable
@required {upc: num}
@returns(200) {comparableProducts: map{calories: [map], likes: [map], price: [map], protein: [map], spoonacularScore: [map], sugar: [map]}}
@errors {401, 403, 404}

@endpoint GET /food/products/suggest
@required {query: str}
@optional {number: int}
@returns(200) {results: [map]}
@errors {401, 403, 404}

@endpoint GET /food/products/{id}/nutritionWidget
@required {id: num}
@optional {defaultCss: bool=true, Accept: str(application/json/text/html/media/*)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/products/{id}/nutritionWidget.png
@required {id: num}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/products/{id}/nutritionLabel
@required {id: num}
@optional {defaultCss: bool=true, showOptionalNutrients: bool, showZeroValues: bool, showIngredients: bool}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/products/{id}/nutritionLabel.png
@required {id: num}
@optional {showOptionalNutrients: bool, showZeroValues: bool, showIngredients: bool}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /food/products/classify
@required {title: str, upc: str, plu_code: str}
@optional {locale: str(en_US/en_GB)}
@returns(200) {cleanTitle: str, image: str, category: str, breadcrumbs: [str], usdaCode: int}
@errors {401, 403, 404}

@endpoint POST /food/products/classifyBatch
@optional {locale: str}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /food/ingredients/map
@required {ingredients: [str], servings: num}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/menuItems/suggest
@required {query: str}
@optional {number: num}
@returns(200) {results: [map]}
@errors {401, 403, 404}

@endpoint GET /food/menuItems/search
@optional {query: str, minCalories: num, maxCalories: num, minCarbs: num, maxCarbs: num, minProtein: num, maxProtein: num, minFat: num, maxFat: num, addMenuItemInformation: bool(false/true), offset: int, number: int=10}
@returns(200) {menuItems: [map], totalMenuItems: int, type: str, offset: int, number: int}
@errors {401, 403, 404}

@endpoint GET /food/menuItems/{id}
@required {id: num}
@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}
@errors {401, 403, 404}

@endpoint GET /food/menuItems/{id}/nutritionWidget
@required {id: num}
@optional {defaultCss: bool=true, Accept: str(application/json/text/html/media/*)}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/menuItems/{id}/nutritionWidget.png
@required {id: num}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/menuItems/{id}/nutritionLabel
@required {id: num}
@optional {defaultCss: bool=true, showOptionalNutrients: bool, showZeroValues: bool, showIngredients: bool}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /food/menuItems/{id}/nutritionLabel.png
@required {id: num}
@optional {showOptionalNutrients: bool, showZeroValues: bool, showIngredients: bool}
@returns(200)
@errors {401, 403, 404}

@endgroup

@group mealplanner
@endpoint GET /mealplanner/generate
@optional {timeFrame: str, targetCalories: num, diet: str, exclude: str}
@returns(200) {meals: [map], nutrients: map{calories: num, carbohydrates: num, fat: num, protein: num}}
@errors {401, 403, 404}

@endpoint GET /mealplanner/{username}/week/{start-date}
@required {username: str, start-date: str, hash: str}
@returns(200) {days: [map]}
@errors {401, 403, 404}

@endpoint DELETE /mealplanner/{username}/day/{date}
@required {username: str, date: str, hash: str}
@returns(200)
@errors {401, 403, 404}

@endpoint POST /mealplanner/{username}/items
@required {username: str, hash: str, date: num, slot: int, position: int, type: str, value: map{ingredients!: [map]}}
@returns(200)
@errors {401, 403, 404}

@endpoint DELETE /mealplanner/{username}/items/{id}
@required {username: str, id: num, hash: str}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /mealplanner/{username}/templates
@required {username: str, hash: str}
@returns(200) {templates: [map]}
@errors {401, 403, 404}

@endpoint POST /mealplanner/{username}/templates
@required {username: str, hash: str}
@returns(200) {name: str, items: [map], publishAsPublic: bool}
@errors {401, 403, 404}

@endpoint GET /mealplanner/{username}/templates/{id}
@required {username: str, id: num, hash: str}
@returns(200) {id: int, name: str, days: [map]}
@errors {401, 403, 404}

@endpoint DELETE /mealplanner/{username}/templates/{id}
@required {username: str, id: num, hash: str}
@returns(200)
@errors {401, 403, 404}

@endpoint GET /mealplanner/{username}/shopping-list
@required {username: str, hash: str}
@returns(200) {aisles: [map], cost: num, startDate: num, endDate: num}
@errors {401, 403, 404}

@endpoint POST /mealplanner/{username}/shopping-list/{start-date}/{end-date}
@required {username: str, start-date: str, end-date: str, hash: str}
@returns(200) {aisles: [map], cost: num, startDate: num, endDate: num}
@errors {401, 403, 404}

@endgroup

@group users
@endpoint POST /users/connect
@required {username: str, firstName: str, lastName: str, email: str}
@returns(200) {username: str, hash: str}
@errors {401, 403, 404}

@endgroup

@group mealplanner
@endpoint POST /mealplanner/{username}/shopping-list/items
@required {username: str, hash: str, item: str, aisle: str, parse: bool}
@returns(200) {aisles: [map], cost: num, startDate: num, endDate: num}
@errors {401, 403, 404}

@endpoint DELETE /mealplanner/{username}/shopping-list/items/{id}
@required {username: str, id: num, hash: str}
@returns(200)
@errors {401, 403, 404}

@endgroup

@group food
@endpoint GET /food/restaurants/search
@optional {query: str, lat: num, lng: num, distance: num, budget: num, cuisine: str, min-rating: num, is-open: bool, sort: str, page: num}
@returns(200) {restaurants: [map]}
@errors {401, 403, 404}

@endpoint GET /food/wine/dishes
@required {wine: str}
@returns(200) {pairings: [str], text: str}
@errors {401, 403, 404}

@endpoint GET /food/wine/pairing
@required {food: str}
@optional {maxPrice: num}
@returns(200) {pairedWines: [str], pairingText: str, productMatches: [map]}
@errors {401, 403, 404}

@endpoint GET /food/wine/description
@required {wine: str}
@returns(200) {wineDescription: str}
@errors {401, 403, 404}

@endpoint GET /food/wine/recommendation
@required {wine: str}
@optional {maxPrice: num, minRating: num, number: num=10}
@returns(200) {recommendedWines: [map], totalFound: int}
@errors {401, 403, 404}

@endpoint GET /food/images/classify
@required {imageUrl: str}
@returns(200) {category: str, probability: num}
@errors {401, 403, 404}

@endpoint GET /food/images/analyze
@required {imageUrl: str}
@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]}
@errors {401, 403, 404}

@endgroup

@group recipes
@endpoint GET /recipes/quickAnswer
@required {q: str}
@returns(200) {answer: str, image: str}
@errors {401, 403, 404}

@endgroup

@group food
@endpoint POST /food/detect
@optional {Content-Type: str(application/x-www-form-urlencoded/application/json/multipart/form-data)}
@returns(200) {annotations: [any]}
@errors {401, 403, 404}

@endpoint GET /food/site/search
@required {query: str}
@returns(200) {Articles: [any], Grocery Products: [any], Menu Items: [any], Recipes: [any]}
@errors {401, 403, 404}

@endpoint GET /food/search
@required {query: str}
@optional {offset: int, number: int=10}
@returns(200) {query: str, totalResults: int, limit: int, offset: int, searchResults: [map]}
@errors {401, 403, 404}

@endpoint GET /food/videos/search
@optional {query: str, type: str, cuisine: str, diet: str, includeIngredients: str, excludeIngredients: str, minLength: num, maxLength: num, offset: int, number: int=10}
@returns(200) {videos: [map], totalResults: int}
@errors {401, 403, 404}

@endpoint GET /food/jokes/random
@returns(200) {text: str}
@errors {401, 403, 404}

@endpoint GET /food/trivia/random
@returns(200) {text: str}
@errors {401, 403, 404}

@endpoint GET /food/converse
@required {text: str}
@optional {contextId: str}
@returns(200) {answerText: str, media: [any]}
@errors {401, 403, 404}

@endpoint GET /food/converse/suggest
@required {query: str}
@optional {number: num}
@returns(200) {suggests: map{_: [any]}, words: [any]}
@errors {401, 403, 404}

@endgroup

@end
