> For the complete documentation index, see [llms.txt](https://docs.hos.accessacloud.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.hos.accessacloud.com/evo-recipes-api/models.md).

# Models

## The Pagination object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"Pagination":{"type":"object","required":["page_size","has_next_page","next_cursor"],"properties":{"page_size":{"type":"integer","description":"The page size used for this request."},"has_next_page":{"type":"boolean","description":"Whether more results exist beyond this page."},"next_cursor":{"type":"string","nullable":true,"description":"Cursor to pass as the cursor query parameter for the next page. Null when there are no more results."}}}}}}
```

## The PaginatedResponse object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"PaginatedResponse":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{}},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Pagination":{"type":"object","required":["page_size","has_next_page","next_cursor"],"properties":{"page_size":{"type":"integer","description":"The page size used for this request."},"has_next_page":{"type":"boolean","description":"Whether more results exist beyond this page."},"next_cursor":{"type":"string","nullable":true,"description":"Cursor to pass as the cursor query parameter for the next page. Null when there are no more results."}}}}}}
```

## The Error object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Stable machine-readable error code (e.g. INVALID_QUERY_PARAMETER, MISSING_PATH_PARAMETER, RESOURCE_NOT_FOUND, INTERNAL_ERROR)."},"parameter":{"type":"string","description":"The offending query or path parameter, when applicable."}}}}}}
```

## The TagRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"TagRef":{"type":"object","description":"Lightweight reference to a tag.","required":["id","name","color"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour code."}}}}}}
```

## The RecipeListItem object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeListItem":{"type":"object","description":"Recipe list projection. Cost, GP, and margin figures are deliberately excluded from this API.","required":["id","name","status","productType","tags","updatedAt"],"properties":{"id":{"type":"string","description":"Unique recipe identifier (CUID)."},"name":{"type":"string"},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]},"productType":{"type":"string","enum":["FOOD","DRINK"],"description":"NPM scoring product type classification."},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagRef"}},"updatedAt":{"type":"string","format":"date-time"}}},"TagRef":{"type":"object","description":"Lightweight reference to a tag.","required":["id","name","color"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour code."}}}}}}
```

## The IngredientCategoryRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"IngredientCategoryRef":{"type":"object","description":"Lightweight reference to an ingredient category.","required":["id","categoryName","categoryCode"],"properties":{"id":{"type":"string"},"categoryName":{"type":"string"},"categoryCode":{"type":"string"}}}}}}
```

## The AllergenRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}}}}}
```

## The Product object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"Product":{"type":"object","description":"Product (ingredient) list projection. Cost fields are deliberately excluded from this API.","required":["id","name","active","allergens","tags","updatedAt"],"properties":{"id":{"type":"string","description":"Unique product identifier (CUID)."},"name":{"type":"string"},"description":{"type":"string","nullable":true,"description":"Free-text product description (not the pack size)."},"imageUrl":{"type":"string","nullable":true},"productCode":{"type":"string","nullable":true},"active":{"type":"boolean"},"category":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/IngredientCategoryRef"}]},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenRef"}},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagRef"}},"updatedAt":{"type":"string","format":"date-time"}}},"IngredientCategoryRef":{"type":"object","description":"Lightweight reference to an ingredient category.","required":["id","categoryName","categoryCode"],"properties":{"id":{"type":"string"},"categoryName":{"type":"string"},"categoryCode":{"type":"string"}}},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"TagRef":{"type":"object","description":"Lightweight reference to a tag.","required":["id","name","color"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour code."}}}}}}
```

## The Supplier object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"Supplier":{"type":"object","required":["id","tenantId","name","active","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Unique supplier identifier (CUID)."},"tenantId":{"type":"string"},"name":{"type":"string"},"code":{"type":"string","nullable":true,"description":"Supplier code / SKU prefix."},"description":{"type":"string","nullable":true},"contactInfo":{"nullable":true,"description":"Free-form contact information (JSON)."},"logoS3Key":{"type":"string","nullable":true},"externalSupplierId":{"type":"integer","nullable":true},"active":{"type":"boolean"},"sourceSystem":{"type":"string","nullable":true},"sourceTenantIdentifier":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The MenuListItem object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuListItem":{"type":"object","description":"Menu list projection; contents are served by /apim/menu-items.","required":["id","name","currency","sortOrder","updatedAt"],"properties":{"id":{"type":"string","description":"Unique menu identifier (CUID)."},"name":{"type":"string"},"description":{"type":"string","nullable":true},"currency":{"type":"string","maxLength":3,"description":"ISO 4217 currency code for menu pricing."},"parentMenuId":{"type":"string","nullable":true,"description":"Parent menu ID for hierarchical menu structures."},"sortOrder":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The MenuItem object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuItem":{"type":"object","required":["id","menuId","name","price","sortOrder","active","deleted","updatedAt"],"properties":{"id":{"type":"string"},"menuId":{"type":"string"},"recipeId":{"type":"string","nullable":true,"description":"Associated recipe, if this menu item is recipe-backed."},"ingredientId":{"type":"string","nullable":true,"description":"Associated product, if this menu item is product-backed."},"name":{"type":"string"},"description":{"type":"string","nullable":true},"price":{"type":"string","format":"decimal"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnitId":{"type":"string","nullable":true},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"deleted":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The Site object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"Site":{"type":"object","required":["id","name","type","path","depth","sortOrder","active","deleted","updatedAt"],"properties":{"id":{"type":"string","description":"Unique site identifier (UUID)."},"name":{"type":"string"},"code":{"type":"string","nullable":true},"type":{"type":"string","enum":["MANAGEMENT","STANDARD"]},"parentSiteId":{"type":"string","nullable":true},"path":{"type":"string","description":"Materialised path of the site within the hierarchy."},"depth":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"deleted":{"type":"boolean"},"currencyCode":{"type":"string","nullable":true},"timezone":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The Allergen object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"Allergen":{"type":"object","required":["id","code","name","active","severity","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Unique allergen identifier (CUID)."},"code":{"type":"string","description":"Unique allergen code following the EU 14 major allergens convention (e.g. CELERY, CRUSTACEANS, EGGS, FISH, GLUTEN, LUPIN, MILK, MOLLUSCS, MUSTARD, NUTS, PEANUTS, SESAME, SOYBEANS, SULPHITES)."},"name":{"type":"string"},"description":{"type":"string","nullable":true},"active":{"type":"boolean"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]},"gs1Code":{"type":"string","nullable":true,"description":"GS1 standard allergen code."},"parentId":{"type":"string","nullable":true,"description":"Parent allergen ID for hierarchical allergen grouping."},"vitalReferenceDose":{"type":"number","nullable":true,"description":"VITAL reference dose in milligrams."},"tenantId":{"type":"string","nullable":true,"description":"Null for global/system allergens. Set for tenant-specific custom allergens."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The UnitRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}}}}}
```

## The AllergenAssociation object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}}}}}
```

## The AllergenOverride object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}}}}}
```

## The DietarySuitability object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}}}}}
```

## The NutritionValues object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}}}}}
```

## The StoredNutrition object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"StoredNutrition":{"description":"Current stored nutrition row of an ingredient (`IngredientNutrition`) or a supplier offer (`OfferNutrition`). Never an aggregate.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["referenceUnit","dataSource","version"],"properties":{"referenceUnit":{"type":"string"},"dataSource":{"type":"string"},"sourceReference":{"type":"string","nullable":true},"verifiedAt":{"type":"string","format":"date-time","nullable":true},"version":{"type":"integer"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}}}}}
```

## The ProductNutrition object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"ProductNutrition":{"description":"Stored nutrition resolved for a product, tagged with where it came from.","allOf":[{"$ref":"#/components/schemas/StoredNutrition"},{"type":"object","required":["source"],"properties":{"source":{"type":"string","enum":["INGREDIENT","OFFER"]},"offerId":{"type":"string","nullable":true,"description":"The offer the row came from when source is OFFER."}}}]},"StoredNutrition":{"description":"Current stored nutrition row of an ingredient (`IngredientNutrition`) or a supplier offer (`OfferNutrition`). Never an aggregate.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["referenceUnit","dataSource","version"],"properties":{"referenceUnit":{"type":"string"},"dataSource":{"type":"string"},"sourceReference":{"type":"string","nullable":true},"verifiedAt":{"type":"string","format":"date-time","nullable":true},"version":{"type":"integer"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}}}}}
```

## The RecipeNutritionOverride object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeNutritionOverride":{"description":"Manually entered nutrition for a recipe version.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["inputBasis","updatedAt"],"properties":{"inputBasis":{"type":"string","enum":["PER_100G","PER_PORTION","PER_RECIPE"]},"updatedAt":{"type":"string","format":"date-time"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}}}}}
```

## The PluCode object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"PluCode":{"type":"object","description":"EPOS PLU code stored against a menu item.","required":["pluCode","eposSystem"],"properties":{"pluCode":{"type":"string"},"eposSystem":{"type":"string"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnitId":{"type":"string","nullable":true},"recipeId":{"type":"string","nullable":true},"recipeVersionId":{"type":"string","nullable":true},"ingredientId":{"type":"string","nullable":true}}}}}}
```

## The RecipeComponentIngredient object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeComponentIngredient":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}}}}}
```

## The RecipeRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}}}}}
```

## The RecipeComponent object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeComponent":{"type":"object","description":"One component of the recipe's current version. Sub-recipes are summarised by reference — they are never expanded recursively.","required":["id","componentType","sortOrder","quantity","unit"],"properties":{"id":{"type":"string"},"componentType":{"type":"string","enum":["INGREDIENT","SUB_RECIPE"]},"sortOrder":{"type":"integer"},"quantity":{"type":"string","format":"decimal"},"prepMethod":{"type":"string","nullable":true},"cookMethod":{"type":"string","nullable":true},"wastePercentage":{"type":"string","format":"decimal","nullable":true},"unit":{"$ref":"#/components/schemas/UnitRef"},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeComponentIngredient"}]},"subRecipeId":{"type":"string","nullable":true},"subRecipeVersionId":{"type":"string","nullable":true},"subRecipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeRef"}]}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"RecipeComponentIngredient":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}}}}}
```

## The RecipeEmissions object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeEmissions":{"type":"object","description":"Stored carbon assessment for the current version.","required":["assessmentStatus"],"properties":{"assessmentStatus":{"type":"string","enum":["COMPLETE","NOT_ASSESSABLE"]},"statusReason":{"type":"string","nullable":true},"carbonRating":{"type":"string","nullable":true,"enum":["A","B","C","D","E"]},"emissionsPerKg":{"type":"string","format":"decimal","nullable":true},"emissionsPerServing":{"type":"string","format":"decimal","nullable":true},"totalEmissions":{"type":"string","format":"decimal","nullable":true},"carMilesEquivalent":{"type":"string","format":"decimal","nullable":true},"externalUrl":{"type":"string","nullable":true},"labelUrl":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The RecipeQuidLabel object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeQuidLabel":{"type":"object","description":"Cached QUID label generated for the current version.","required":["generatedLabel","totalWeightGrams","hasWarnings","generatedAt"],"properties":{"generatedLabel":{"description":"Generated label document (JSON)."},"totalWeightGrams":{"type":"string","format":"decimal"},"hasWarnings":{"type":"boolean"},"warningMessages":{"description":"Warning messages raised while generating the label (JSON)."},"generatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The RecipeMetadataEntry object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeMetadataEntry":{"type":"object","required":["key","header","sortOrder","content"],"properties":{"key":{"type":"string"},"header":{"type":"string"},"sortOrder":{"type":"integer"},"content":{"type":"string"}}}}}}
```

## The RecipeVersionDetail object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeVersionDetail":{"type":"object","description":"The recipe's current version. Cost, GP and margin are excluded.","required":["id","versionNumber","status","name","servings","components","allergenOverrides","metadata","updatedAt"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]},"name":{"type":"string"},"description":{"type":"string","nullable":true},"instructions":{"type":"string","nullable":true},"servings":{"type":"string","format":"decimal"},"prepTime":{"type":"integer","nullable":true,"description":"Preparation time in minutes."},"cookTime":{"type":"integer","nullable":true,"description":"Cooking time in minutes."},"shelfLifeDays":{"type":"integer","nullable":true},"outputQuantity":{"type":"string","format":"decimal","nullable":true},"outputUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"portionSizeG":{"type":"string","format":"decimal","nullable":true},"cookingLossPercent":{"type":"string","format":"decimal"},"quidDeclarationOverride":{"type":"string","nullable":true},"components":{"type":"array","description":"Capped at 500 components.","items":{"$ref":"#/components/schemas/RecipeComponent"}},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}},"nutritionOverride":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeNutritionOverride"}]},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]},"emissions":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeEmissions"}]},"quidLabel":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeQuidLabel"}]},"metadata":{"type":"array","items":{"$ref":"#/components/schemas/RecipeMetadataEntry"}},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"RecipeComponent":{"type":"object","description":"One component of the recipe's current version. Sub-recipes are summarised by reference — they are never expanded recursively.","required":["id","componentType","sortOrder","quantity","unit"],"properties":{"id":{"type":"string"},"componentType":{"type":"string","enum":["INGREDIENT","SUB_RECIPE"]},"sortOrder":{"type":"integer"},"quantity":{"type":"string","format":"decimal"},"prepMethod":{"type":"string","nullable":true},"cookMethod":{"type":"string","nullable":true},"wastePercentage":{"type":"string","format":"decimal","nullable":true},"unit":{"$ref":"#/components/schemas/UnitRef"},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeComponentIngredient"}]},"subRecipeId":{"type":"string","nullable":true},"subRecipeVersionId":{"type":"string","nullable":true},"subRecipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeRef"}]}}},"RecipeComponentIngredient":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"RecipeNutritionOverride":{"description":"Manually entered nutrition for a recipe version.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["inputBasis","updatedAt"],"properties":{"inputBasis":{"type":"string","enum":["PER_100G","PER_PORTION","PER_RECIPE"]},"updatedAt":{"type":"string","format":"date-time"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}},"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}},"RecipeEmissions":{"type":"object","description":"Stored carbon assessment for the current version.","required":["assessmentStatus"],"properties":{"assessmentStatus":{"type":"string","enum":["COMPLETE","NOT_ASSESSABLE"]},"statusReason":{"type":"string","nullable":true},"carbonRating":{"type":"string","nullable":true,"enum":["A","B","C","D","E"]},"emissionsPerKg":{"type":"string","format":"decimal","nullable":true},"emissionsPerServing":{"type":"string","format":"decimal","nullable":true},"totalEmissions":{"type":"string","format":"decimal","nullable":true},"carMilesEquivalent":{"type":"string","format":"decimal","nullable":true},"externalUrl":{"type":"string","nullable":true},"labelUrl":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time"}}},"RecipeQuidLabel":{"type":"object","description":"Cached QUID label generated for the current version.","required":["generatedLabel","totalWeightGrams","hasWarnings","generatedAt"],"properties":{"generatedLabel":{"description":"Generated label document (JSON)."},"totalWeightGrams":{"type":"string","format":"decimal"},"hasWarnings":{"type":"boolean"},"warningMessages":{"description":"Warning messages raised while generating the label (JSON)."},"generatedAt":{"type":"string","format":"date-time"}}},"RecipeMetadataEntry":{"type":"object","required":["key","header","sortOrder","content"],"properties":{"key":{"type":"string"},"header":{"type":"string"},"sortOrder":{"type":"integer"},"content":{"type":"string"}}}}}}
```

## The RecipeDetail object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"RecipeDetail":{"type":"object","description":"Recipe detail projection built from the current version only. Cost, GP and margin figures are deliberately excluded from this API.","required":["id","name","status","productType","servings","active","isVisible","tags","createdAt","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"imageUrl":{"type":"string","nullable":true},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]},"productType":{"type":"string","enum":["FOOD","DRINK"]},"servings":{"type":"string","format":"decimal"},"active":{"type":"boolean"},"isVisible":{"type":"boolean"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagRef"}},"currentVersion":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeVersionDetail"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"TagRef":{"type":"object","description":"Lightweight reference to a tag.","required":["id","name","color"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour code."}}},"RecipeVersionDetail":{"type":"object","description":"The recipe's current version. Cost, GP and margin are excluded.","required":["id","versionNumber","status","name","servings","components","allergenOverrides","metadata","updatedAt"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]},"name":{"type":"string"},"description":{"type":"string","nullable":true},"instructions":{"type":"string","nullable":true},"servings":{"type":"string","format":"decimal"},"prepTime":{"type":"integer","nullable":true,"description":"Preparation time in minutes."},"cookTime":{"type":"integer","nullable":true,"description":"Cooking time in minutes."},"shelfLifeDays":{"type":"integer","nullable":true},"outputQuantity":{"type":"string","format":"decimal","nullable":true},"outputUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"portionSizeG":{"type":"string","format":"decimal","nullable":true},"cookingLossPercent":{"type":"string","format":"decimal"},"quidDeclarationOverride":{"type":"string","nullable":true},"components":{"type":"array","description":"Capped at 500 components.","items":{"$ref":"#/components/schemas/RecipeComponent"}},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}},"nutritionOverride":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeNutritionOverride"}]},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]},"emissions":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeEmissions"}]},"quidLabel":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeQuidLabel"}]},"metadata":{"type":"array","items":{"$ref":"#/components/schemas/RecipeMetadataEntry"}},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"RecipeComponent":{"type":"object","description":"One component of the recipe's current version. Sub-recipes are summarised by reference — they are never expanded recursively.","required":["id","componentType","sortOrder","quantity","unit"],"properties":{"id":{"type":"string"},"componentType":{"type":"string","enum":["INGREDIENT","SUB_RECIPE"]},"sortOrder":{"type":"integer"},"quantity":{"type":"string","format":"decimal"},"prepMethod":{"type":"string","nullable":true},"cookMethod":{"type":"string","nullable":true},"wastePercentage":{"type":"string","format":"decimal","nullable":true},"unit":{"$ref":"#/components/schemas/UnitRef"},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeComponentIngredient"}]},"subRecipeId":{"type":"string","nullable":true},"subRecipeVersionId":{"type":"string","nullable":true},"subRecipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeRef"}]}}},"RecipeComponentIngredient":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"RecipeNutritionOverride":{"description":"Manually entered nutrition for a recipe version.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["inputBasis","updatedAt"],"properties":{"inputBasis":{"type":"string","enum":["PER_100G","PER_PORTION","PER_RECIPE"]},"updatedAt":{"type":"string","format":"date-time"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}},"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}},"RecipeEmissions":{"type":"object","description":"Stored carbon assessment for the current version.","required":["assessmentStatus"],"properties":{"assessmentStatus":{"type":"string","enum":["COMPLETE","NOT_ASSESSABLE"]},"statusReason":{"type":"string","nullable":true},"carbonRating":{"type":"string","nullable":true,"enum":["A","B","C","D","E"]},"emissionsPerKg":{"type":"string","format":"decimal","nullable":true},"emissionsPerServing":{"type":"string","format":"decimal","nullable":true},"totalEmissions":{"type":"string","format":"decimal","nullable":true},"carMilesEquivalent":{"type":"string","format":"decimal","nullable":true},"externalUrl":{"type":"string","nullable":true},"labelUrl":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time"}}},"RecipeQuidLabel":{"type":"object","description":"Cached QUID label generated for the current version.","required":["generatedLabel","totalWeightGrams","hasWarnings","generatedAt"],"properties":{"generatedLabel":{"description":"Generated label document (JSON)."},"totalWeightGrams":{"type":"string","format":"decimal"},"hasWarnings":{"type":"boolean"},"warningMessages":{"description":"Warning messages raised while generating the label (JSON)."},"generatedAt":{"type":"string","format":"date-time"}}},"RecipeMetadataEntry":{"type":"object","required":["key","header","sortOrder","content"],"properties":{"key":{"type":"string"},"header":{"type":"string"},"sortOrder":{"type":"integer"},"content":{"type":"string"}}}}}}
```

## The MenuItemIngredientSummary object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuItemIngredientSummary":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}}}}}
```

## The MenuItemRecipeSummary object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuItemRecipeSummary":{"allOf":[{"$ref":"#/components/schemas/RecipeRef"},{"type":"object","properties":{"currentVersion":{"nullable":true,"type":"object","required":["id","versionNumber","allergenOverrides"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}}}}}}]},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}}}}}
```

## The MenuDetailItem object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuDetailItem":{"type":"object","description":"A menu item as inlined on a menu, with its stored allergen data.","required":["id","name","price","sortOrder","active","pluCodes","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"price":{"type":"string","format":"decimal"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"pluCodes":{"type":"array","items":{"$ref":"#/components/schemas/PluCode"}},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemIngredientSummary"}]},"recipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemRecipeSummary"}]},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"PluCode":{"type":"object","description":"EPOS PLU code stored against a menu item.","required":["pluCode","eposSystem"],"properties":{"pluCode":{"type":"string"},"eposSystem":{"type":"string"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnitId":{"type":"string","nullable":true},"recipeId":{"type":"string","nullable":true},"recipeVersionId":{"type":"string","nullable":true},"ingredientId":{"type":"string","nullable":true}}},"MenuItemIngredientSummary":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"MenuItemRecipeSummary":{"allOf":[{"$ref":"#/components/schemas/RecipeRef"},{"type":"object","properties":{"currentVersion":{"nullable":true,"type":"object","required":["id","versionNumber","allergenOverrides"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}}}}}}]},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]}}}}
```

## The MenuHierarchyNode object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuHierarchyNode":{"type":"object","description":"A descendant menu. Nesting stops at the menu's `maxHierarchyDepth`, so `childMenus` is empty on the deepest level returned.","required":["id","name","currency","sortOrder","active","menuItems","childMenus","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"currency":{"type":"string","maxLength":3},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"menuItems":{"type":"array","items":{"$ref":"#/components/schemas/MenuDetailItem"}},"childMenus":{"type":"array","items":{"$ref":"#/components/schemas/MenuHierarchyNode"}},"updatedAt":{"type":"string","format":"date-time"}}},"MenuDetailItem":{"type":"object","description":"A menu item as inlined on a menu, with its stored allergen data.","required":["id","name","price","sortOrder","active","pluCodes","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"price":{"type":"string","format":"decimal"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"pluCodes":{"type":"array","items":{"$ref":"#/components/schemas/PluCode"}},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemIngredientSummary"}]},"recipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemRecipeSummary"}]},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"PluCode":{"type":"object","description":"EPOS PLU code stored against a menu item.","required":["pluCode","eposSystem"],"properties":{"pluCode":{"type":"string"},"eposSystem":{"type":"string"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnitId":{"type":"string","nullable":true},"recipeId":{"type":"string","nullable":true},"recipeVersionId":{"type":"string","nullable":true},"ingredientId":{"type":"string","nullable":true}}},"MenuItemIngredientSummary":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"MenuItemRecipeSummary":{"allOf":[{"$ref":"#/components/schemas/RecipeRef"},{"type":"object","properties":{"currentVersion":{"nullable":true,"type":"object","required":["id","versionNumber","allergenOverrides"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}}}}}}]},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]}}}}
```

## The MenuDetail object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuDetail":{"type":"object","description":"Menu detail with inlined items and a bounded child hierarchy. No cost, GP or margin figures are returned.","required":["id","name","currency","sortOrder","active","tags","menuItems","maxHierarchyDepth","maxChildMenusPerLevel","maxMenuItems","childMenusTruncated","menuItemsTruncated","childMenus","createdAt","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"currency":{"type":"string","maxLength":3},"parentMenuId":{"type":"string","nullable":true},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagRef"}},"menuItems":{"type":"array","description":"Non-deleted items, capped at 500.","items":{"$ref":"#/components/schemas/MenuDetailItem"}},"maxHierarchyDepth":{"type":"integer","description":"Levels of descendants included below this menu."},"maxChildMenusPerLevel":{"type":"integer","description":"Child menus returned per hierarchy level."},"maxMenuItems":{"type":"integer","description":"Items returned per menu in the hierarchy."},"childMenusTruncated":{"type":"boolean","description":"True when a hierarchy level reached `maxChildMenusPerLevel`, so at least one menu in the tree is missing children."},"menuItemsTruncated":{"type":"boolean","description":"True when any menu in the tree reached `maxMenuItems`, so its `menuItems` array is incomplete."},"childMenus":{"type":"array","items":{"$ref":"#/components/schemas/MenuHierarchyNode"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"TagRef":{"type":"object","description":"Lightweight reference to a tag.","required":["id","name","color"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour code."}}},"MenuDetailItem":{"type":"object","description":"A menu item as inlined on a menu, with its stored allergen data.","required":["id","name","price","sortOrder","active","pluCodes","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"price":{"type":"string","format":"decimal"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"pluCodes":{"type":"array","items":{"$ref":"#/components/schemas/PluCode"}},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemIngredientSummary"}]},"recipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemRecipeSummary"}]},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"PluCode":{"type":"object","description":"EPOS PLU code stored against a menu item.","required":["pluCode","eposSystem"],"properties":{"pluCode":{"type":"string"},"eposSystem":{"type":"string"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnitId":{"type":"string","nullable":true},"recipeId":{"type":"string","nullable":true},"recipeVersionId":{"type":"string","nullable":true},"ingredientId":{"type":"string","nullable":true}}},"MenuItemIngredientSummary":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"productCode":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"MenuItemRecipeSummary":{"allOf":[{"$ref":"#/components/schemas/RecipeRef"},{"type":"object","properties":{"currentVersion":{"nullable":true,"type":"object","required":["id","versionNumber","allergenOverrides"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}}}}}}]},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"MenuHierarchyNode":{"type":"object","description":"A descendant menu. Nesting stops at the menu's `maxHierarchyDepth`, so `childMenus` is empty on the deepest level returned.","required":["id","name","currency","sortOrder","active","menuItems","childMenus","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"currency":{"type":"string","maxLength":3},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"menuItems":{"type":"array","items":{"$ref":"#/components/schemas/MenuDetailItem"}},"childMenus":{"type":"array","items":{"$ref":"#/components/schemas/MenuHierarchyNode"}},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The MenuRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuRef":{"type":"object","description":"Lightweight reference to the menu an item belongs to.","required":["id","name","currency","active"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string","maxLength":3},"active":{"type":"boolean"}}}}}}
```

## The MenuItemDetailIngredient object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuItemDetailIngredient":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true,"description":"Free-text product description (not the pack size)."},"productCode":{"type":"string","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}},"nutrition":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/StoredNutrition"}]},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"StoredNutrition":{"description":"Current stored nutrition row of an ingredient (`IngredientNutrition`) or a supplier offer (`OfferNutrition`). Never an aggregate.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["referenceUnit","dataSource","version"],"properties":{"referenceUnit":{"type":"string"},"dataSource":{"type":"string"},"sourceReference":{"type":"string","nullable":true},"verifiedAt":{"type":"string","format":"date-time","nullable":true},"version":{"type":"integer"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}},"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}}}}}
```

## The MenuItemDetailRecipe object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuItemDetailRecipe":{"allOf":[{"$ref":"#/components/schemas/RecipeRef"},{"type":"object","required":["productType"],"properties":{"productType":{"type":"string","enum":["FOOD","DRINK"]},"currentVersion":{"nullable":true,"type":"object","required":["id","versionNumber","status","servings","allergenOverrides"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]},"servings":{"type":"string","format":"decimal"},"portionSizeG":{"type":"string","format":"decimal","nullable":true},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}},"nutritionOverride":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeNutritionOverride"}]},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]}}}}}]},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"RecipeNutritionOverride":{"description":"Manually entered nutrition for a recipe version.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["inputBasis","updatedAt"],"properties":{"inputBasis":{"type":"string","enum":["PER_100G","PER_PORTION","PER_RECIPE"]},"updatedAt":{"type":"string","format":"date-time"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}},"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}}}}}
```

## The MenuItemDetail object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"MenuItemDetail":{"type":"object","description":"Menu item detail with its parent menu, PLU codes and the stored data of whatever backs it. No cost, GP or margin figures are returned.","required":["id","menuId","name","price","unitsSold","sortOrder","active","deleted","pluCodes","createdAt","updatedAt"],"properties":{"id":{"type":"string"},"menuId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"price":{"type":"string","format":"decimal"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"unitsSold":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"deleted":{"type":"boolean"},"menu":{"$ref":"#/components/schemas/MenuRef"},"pluCodes":{"type":"array","items":{"$ref":"#/components/schemas/PluCode"}},"ingredient":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemDetailIngredient"}]},"recipe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MenuItemDetailRecipe"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"MenuRef":{"type":"object","description":"Lightweight reference to the menu an item belongs to.","required":["id","name","currency","active"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"currency":{"type":"string","maxLength":3},"active":{"type":"boolean"}}},"PluCode":{"type":"object","description":"EPOS PLU code stored against a menu item.","required":["pluCode","eposSystem"],"properties":{"pluCode":{"type":"string"},"eposSystem":{"type":"string"},"servingQty":{"type":"string","format":"decimal","nullable":true},"servingUnitId":{"type":"string","nullable":true},"recipeId":{"type":"string","nullable":true},"recipeVersionId":{"type":"string","nullable":true},"ingredientId":{"type":"string","nullable":true}}},"MenuItemDetailIngredient":{"type":"object","required":["id","name","allergens"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true,"description":"Free-text product description (not the pack size)."},"productCode":{"type":"string","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}},"nutrition":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/StoredNutrition"}]},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"StoredNutrition":{"description":"Current stored nutrition row of an ingredient (`IngredientNutrition`) or a supplier offer (`OfferNutrition`). Never an aggregate.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["referenceUnit","dataSource","version"],"properties":{"referenceUnit":{"type":"string"},"dataSource":{"type":"string"},"sourceReference":{"type":"string","nullable":true},"verifiedAt":{"type":"string","format":"date-time","nullable":true},"version":{"type":"integer"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}},"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}},"MenuItemDetailRecipe":{"allOf":[{"$ref":"#/components/schemas/RecipeRef"},{"type":"object","required":["productType"],"properties":{"productType":{"type":"string","enum":["FOOD","DRINK"]},"currentVersion":{"nullable":true,"type":"object","required":["id","versionNumber","status","servings","allergenOverrides"],"properties":{"id":{"type":"string"},"versionNumber":{"type":"integer"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]},"servings":{"type":"string","format":"decimal"},"portionSizeG":{"type":"string","format":"decimal","nullable":true},"allergenOverrides":{"type":"array","items":{"$ref":"#/components/schemas/AllergenOverride"}},"nutritionOverride":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RecipeNutritionOverride"}]},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]}}}}}]},"RecipeRef":{"type":"object","description":"Lightweight reference to a recipe.","required":["id","name","status"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PUBLISHED","ARCHIVED"]}}},"AllergenOverride":{"description":"Cross-contamination allergen override stored against a recipe version.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]},"reason":{"type":"string","nullable":true}}}]},"RecipeNutritionOverride":{"description":"Manually entered nutrition for a recipe version.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["inputBasis","updatedAt"],"properties":{"inputBasis":{"type":"string","enum":["PER_100G","PER_PORTION","PER_RECIPE"]},"updatedAt":{"type":"string","format":"date-time"}}}]}}}}
```

## The ProductPack object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"ProductPack":{"type":"object","description":"Raw stored pack fields. The calculated `packDisplay` string is not returned by this API — see the endpoint description.","properties":{"packsInCase":{"type":"integer","nullable":true},"unitsInPack":{"type":"integer","nullable":true},"unitCount":{"type":"integer","nullable":true},"unitSize":{"type":"string","format":"decimal","nullable":true},"unitMeasure":{"type":"string","nullable":true}}}}}}
```

## The SupplierOfferSummary object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"SupplierOfferSummary":{"type":"object","description":"Active supplier offer for the product.","required":["id","supplier","hasNutrition"],"properties":{"id":{"type":"string"},"supplierSku":{"type":"string","nullable":true},"packSize":{"type":"string","format":"decimal","nullable":true},"packUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"weightPerUnitG":{"type":"string","format":"decimal","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"supplier":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"hasNutrition":{"type":"boolean","description":"Whether the offer has a current stored nutrition row."}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}}}}}
```

## The ProductDetail object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"ProductDetail":{"type":"object","description":"Product (ingredient) detail. Cost fields are deliberately excluded from this API, and `packDisplay` is not returned.","required":["id","name","active","isNonConsumable","fvnCategory","fvnPercent","pack","tags","allergens","supplierOffers","createdAt","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true,"description":"Free-text product description (not the pack size)."},"imageUrl":{"type":"string","nullable":true},"productCode":{"type":"string","nullable":true},"externalId":{"type":"string","nullable":true},"active":{"type":"boolean"},"isNonConsumable":{"type":"boolean"},"ingredientDeclaration":{"type":"string","nullable":true},"fvnCategory":{"type":"string","enum":["FRUIT","VEGETABLE","NUT","SEED","NONE"]},"fvnPercent":{"type":"string","format":"decimal"},"weightPerUnitG":{"type":"string","format":"decimal","nullable":true},"densityGramsPerMl":{"type":"string","format":"decimal","nullable":true},"sourceSystem":{"type":"string","nullable":true},"defaultUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"category":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/IngredientCategoryRef"}]},"pack":{"$ref":"#/components/schemas/ProductPack"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagRef"}},"allergens":{"type":"array","items":{"$ref":"#/components/schemas/AllergenAssociation"}},"dietarySuitability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/DietarySuitability"}]},"nutrition":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ProductNutrition"}]},"supplierOffers":{"type":"array","description":"Active offers, capped at 50.","items":{"$ref":"#/components/schemas/SupplierOfferSummary"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UnitRef":{"type":"object","description":"Lightweight reference to a measurement unit.","required":["id","name","abbreviation","unitType"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"abbreviation":{"type":"string"},"unitType":{"type":"string","enum":["WEIGHT","VOLUME","COUNT"]}}},"IngredientCategoryRef":{"type":"object","description":"Lightweight reference to an ingredient category.","required":["id","categoryName","categoryCode"],"properties":{"id":{"type":"string"},"categoryName":{"type":"string"},"categoryCode":{"type":"string"}}},"ProductPack":{"type":"object","description":"Raw stored pack fields. The calculated `packDisplay` string is not returned by this API — see the endpoint description.","properties":{"packsInCase":{"type":"integer","nullable":true},"unitsInPack":{"type":"integer","nullable":true},"unitCount":{"type":"integer","nullable":true},"unitSize":{"type":"string","format":"decimal","nullable":true},"unitMeasure":{"type":"string","nullable":true}}},"TagRef":{"type":"object","description":"Lightweight reference to a tag.","required":["id","name","color"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string","description":"Hex colour code."}}},"AllergenAssociation":{"description":"Allergen as stored against an ingredient or supplier offer. `status` is the recorded association, never a calculated roll-up.","allOf":[{"$ref":"#/components/schemas/AllergenRef"},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["NO","YES","MAY_CONTAIN"]}}}]},"AllergenRef":{"type":"object","description":"Lightweight allergen reference as included on a product.","required":["id","code","name","severity"],"properties":{"id":{"type":"string"},"code":{"type":"string","description":"Unique allergen code (e.g. CELERY, EGGS, MILK)."},"name":{"type":"string"},"severity":{"type":"string","enum":["MILD","MODERATE","SEVERE","LIFE_THREATENING"]}}},"DietarySuitability":{"type":"object","description":"Stored dietary-suitability flags. Nulls mean \"not declared\".","properties":{"isVegetarian":{"type":"boolean","nullable":true},"isVegan":{"type":"boolean","nullable":true},"isDairyFree":{"type":"boolean","nullable":true},"isGlutenFree":{"type":"boolean","nullable":true},"isLactoseFree":{"type":"boolean","nullable":true},"isNutFree":{"type":"boolean","nullable":true},"isHalalSuitable":{"type":"boolean","nullable":true},"isKosherSuitable":{"type":"boolean","nullable":true},"isHinduismSuitable":{"type":"boolean","nullable":true}}},"ProductNutrition":{"description":"Stored nutrition resolved for a product, tagged with where it came from.","allOf":[{"$ref":"#/components/schemas/StoredNutrition"},{"type":"object","required":["source"],"properties":{"source":{"type":"string","enum":["INGREDIENT","OFFER"]},"offerId":{"type":"string","nullable":true,"description":"The offer the row came from when source is OFFER."}}}]},"StoredNutrition":{"description":"Current stored nutrition row of an ingredient (`IngredientNutrition`) or a supplier offer (`OfferNutrition`). Never an aggregate.","allOf":[{"$ref":"#/components/schemas/NutritionValues"},{"type":"object","required":["referenceUnit","dataSource","version"],"properties":{"referenceUnit":{"type":"string"},"dataSource":{"type":"string"},"sourceReference":{"type":"string","nullable":true},"verifiedAt":{"type":"string","format":"date-time","nullable":true},"version":{"type":"integer"}}}]},"NutritionValues":{"type":"object","description":"Big-8 plus extended nutrition values. Decimal columns are serialised as strings to preserve precision.","properties":{"energyKcal":{"type":"string","format":"decimal","nullable":true},"energyKj":{"type":"string","format":"decimal","nullable":true},"fatG":{"type":"string","format":"decimal","nullable":true},"saturatedFatG":{"type":"string","format":"decimal","nullable":true},"carbohydrateG":{"type":"string","format":"decimal","nullable":true},"sugarsG":{"type":"string","format":"decimal","nullable":true},"proteinG":{"type":"string","format":"decimal","nullable":true},"saltG":{"type":"string","format":"decimal","nullable":true},"fibreG":{"type":"string","format":"decimal","nullable":true},"monoUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"polyUnsaturatesG":{"type":"string","format":"decimal","nullable":true},"transFatG":{"type":"string","format":"decimal","nullable":true},"sodiumMg":{"type":"string","format":"decimal","nullable":true},"freeSugarsG":{"type":"string","format":"decimal","nullable":true}}},"SupplierOfferSummary":{"type":"object","description":"Active supplier offer for the product.","required":["id","supplier","hasNutrition"],"properties":{"id":{"type":"string"},"supplierSku":{"type":"string","nullable":true},"packSize":{"type":"string","format":"decimal","nullable":true},"packUnit":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UnitRef"}]},"weightPerUnitG":{"type":"string","format":"decimal","nullable":true},"ingredientDeclaration":{"type":"string","nullable":true},"supplier":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"hasNutrition":{"type":"boolean","description":"Whether the offer has a current stored nutrition row."}}}}}}
```

## The SiteRef object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"SiteRef":{"type":"object","description":"Lightweight reference to a site in the hierarchy.","required":["id","name","type","active","deleted","depth","sortOrder","path","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string","nullable":true},"type":{"type":"string","enum":["MANAGEMENT","STANDARD"]},"active":{"type":"boolean"},"deleted":{"type":"boolean"},"depth":{"type":"integer"},"sortOrder":{"type":"integer"},"path":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The SiteDetail object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"SiteDetail":{"type":"object","description":"Site detail with its parent summary and direct children. Deeper descendants are not expanded — use `path`/`depth` with `GET /apim/sites`.","required":["id","name","type","path","depth","sortOrder","active","deleted","childSites","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Unique site identifier (UUID)."},"name":{"type":"string"},"code":{"type":"string","nullable":true},"type":{"type":"string","enum":["MANAGEMENT","STANDARD"]},"parentSiteId":{"type":"string","nullable":true},"path":{"type":"string","description":"Materialised path of the site within the hierarchy."},"depth":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"},"deleted":{"type":"boolean"},"externalId":{"type":"string","nullable":true},"currencyCode":{"type":"string","nullable":true},"preferredCurrencyLocale":{"type":"string","nullable":true},"defaultLanguage":{"type":"string","nullable":true},"timezone":{"type":"string","nullable":true},"sourceTenantIdentifier":{"type":"string","nullable":true},"parentSite":{"nullable":true,"description":"The parent site, or null when there is none or the parent belongs to another organisation.","allOf":[{"$ref":"#/components/schemas/SiteRef"}]},"childSites":{"type":"array","description":"Direct, non-deleted children of this organisation, capped at 500.","items":{"$ref":"#/components/schemas/SiteRef"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"SiteRef":{"type":"object","description":"Lightweight reference to a site in the hierarchy.","required":["id","name","type","active","deleted","depth","sortOrder","path","updatedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string","nullable":true},"type":{"type":"string","enum":["MANAGEMENT","STANDARD"]},"active":{"type":"boolean"},"deleted":{"type":"boolean"},"depth":{"type":"integer"},"sortOrder":{"type":"integer"},"path":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The CarbonAssessmentInput object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"CarbonAssessmentInput":{"type":"object","description":"Carbon assessment payload. When externalStatus is not_assessable the figures and rating are ignored and stored as null.","required":["externalStatus"],"properties":{"externalStatus":{"type":"string","enum":["complete","not_assessable"],"description":"Whether the source system could assess the dish."},"carbonRating":{"type":"string","nullable":true,"enum":["A","B","C","D","E"],"description":"Letter rating for a complete assessment."},"emissionsPerKg":{"type":"number","nullable":true,"description":"kg CO2e per kg of product."},"emissionsPerServing":{"type":"number","nullable":true,"description":"kg CO2e per serving."},"totalEmissions":{"type":"number","nullable":true,"description":"Total kg CO2e for the assessed recipe."},"carMilesEquivalent":{"type":"number","nullable":true,"description":"Equivalent car miles for the total emissions."},"externalStatusReason":{"type":"string","nullable":true,"description":"Empty-state message; only meaningful for not_assessable."},"externalUrl":{"type":"string","nullable":true,"description":"Link to the assessment in the source system."},"labelUrl":{"type":"string","nullable":true,"description":"Link to the generated carbon label image."},"sourceTenantIdentifier":{"type":"string","nullable":true,"description":"Source-system tenant/region identifier (e.g. 'UK')."},"externalId":{"type":"string","nullable":true,"description":"Product/recipe id in the source system."}}}}}}
```

## The CarbonAssessmentResult object

```json
{"openapi":"3.0.1","info":{"title":"EvoDishesRecipes APIM Operations API","version":"0.1"},"components":{"schemas":{"CarbonAssessmentResult":{"type":"object","required":["success","dishId","recipeVersionId","emissions"],"properties":{"success":{"type":"boolean"},"dishId":{"type":"string"},"recipeVersionId":{"type":"string"},"emissions":{"type":"object","required":["assessmentStatus"],"properties":{"assessmentStatus":{"type":"string","enum":["COMPLETE","NOT_ASSESSABLE"]},"statusReason":{"type":"string","nullable":true},"carbonRating":{"type":"string","nullable":true,"enum":["A","B","C","D","E"]},"emissionsPerKg":{"type":"number","nullable":true},"emissionsPerServing":{"type":"number","nullable":true},"totalEmissions":{"type":"number","nullable":true},"carMilesEquivalent":{"type":"number","nullable":true},"externalUrl":{"type":"string","nullable":true},"labelUrl":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time"}}}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.hos.accessacloud.com/evo-recipes-api/models.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
