Stateless — nothing is stored. Ingredients with the same name are combined, letter case ignored and the first spelling kept, and unit-converted, then grouped into aisle categories from aisle.conf; a category with no matching entries is omitted from categories entirely, and ingredients that match no aisle category land in other, sorted alphabetically. Quantities are reduced by anything in pantry.conf; pantry_items lists the ingredient names that were found there (with a nonzero or unlim quantity) and subtracted. pantry_error is null, or, when there is a pantry file but it could not be read or parsed, why: the list is then made without the pantry, and the error is the one the pantry page shows. checked echoes the server's current persistent checked state, unrelated to the recipes in this request. warnings says why the list is not what its recipes say, one line each in the language of the request (lang cookie, then Accept-Language), starting with the path of the recipe concerned: for now, a sub-recipe reference that could not be scaled to the amount it asks for, which is then listed as written rather than as its ingredients. Parse warnings of the recipes are not included. Empty when there is nothing to say. A recipe's optional ingredients are left out unless they are listed in optional_ingredients; those come back with optional: true, as separate items from any required amount of the same ingredient. An element may also be a free-hand item, { "name": "almonds", "quantity": "50%g" } as GET /api/shopping_list/extra_items returns it, merged with the recipes' required ingredients of the same name.
Response
{
"categories": [
{
"category": "fruit and veg",
"items": [
{
"name": "ripe tomatoes",
"optional": false,
"quantities": [
{
"scalable": true,
"unit": "large",
"value": { "type": "number", "value": { "type": "regular", "value": 3.0 } }
}
]
}
]
},
{
"category": "milk and dairy",
"items": [
{
"name": "fresh mozzarella",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "g",
"value": { "type": "number", "value": { "type": "regular", "value": 200.0 } }
}
]
},
{
"name": "mozzarella cheese",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "g",
"value": { "type": "number", "value": { "type": "regular", "value": 200.0 } }
}
]
}
]
},
{
"category": "tinned goods and baking",
"items": [
{
"name": "tipo zero flour",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "g",
"value": { "type": "number", "value": { "type": "regular", "value": 1680.0 } }
}
]
},
{
"name": "fresh yeast",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "g",
"value": { "type": "number", "value": { "type": "regular", "value": 3.2 } }
}
]
}
]
},
{
"category": "dried herbs and spices",
"items": [
{
"name": "salt",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "tsp",
"value": {
"type": "number",
"value": { "type": "fraction", "value": { "whole": 0, "num": 1, "den": 8, "err": 0.0 } }
}
},
{
"scalable": false,
"unit": "g",
"value": { "type": "number", "value": { "type": "regular", "value": 49.2 } }
}
]
},
{
"name": "black pepper",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "tsp",
"value": { "type": "number", "value": { "type": "regular", "value": 0.0625 } }
}
]
}
]
},
{
"category": "oils and dressings",
"items": [
{
"name": "Dijon mustard",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "tsp",
"value": {
"type": "number",
"value": { "type": "fraction", "value": { "whole": 0, "num": 1, "den": 4, "err": 0.0 } }
}
}
]
},
{
"name": "honey",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "tsp",
"value": {
"type": "number",
"value": { "type": "fraction", "value": { "whole": 0, "num": 1, "den": 4, "err": 0.0 } }
}
}
]
},
{
"name": "red wine vinegar",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "ml",
"value": { "type": "number", "value": { "type": "regular", "value": 10.0 } }
}
]
}
]
},
{
"category": "other",
"items": [
{ "name": "basil leaves", "quantities": [] },
{
"name": "San Marzano tomato sauce",
"optional": false,
"quantities": [
{
"scalable": false,
"unit": "tbsp",
"value": { "type": "number", "value": { "type": "regular", "value": 10.0 } }
}
]
},
{ "name": "semolina", "quantities": [] }
]
}
],
"pantry_items": ["flour", "water", "salt", "tipo zero flour", "olive oil", "fresh basil", "black pepper"],
"pantry_error": null,
"checked": [],
"warnings": []
}