Cook Nutrition API

Plan-aware reports

When the input is a .menu meal plan, templates receive a plan value.

{{ plan.start_date }} โ€“ {{ plan.end_date }}
{{ plan.total_meal_count }} meals ยท {{ plan.unique_recipe_count }} unique recipes

{% for day in plan.days %}
  {{ day.date }}
  {% set t = macros(day.ingredients) %}
  {% for meal in day.meals %}{% for recipe in meal.recipes %}โ€ฆ{% endfor %}{% endfor %}
{% endfor %}

{{ plan.all_ingredients }}   {# flat, scaled list for whole-plan aggregation #}

Available fields: plan.days, plan.all_ingredients, plan.total_meal_count, plan.unique_recipe_count, plan.start_date, plan.end_date. Each day exposes day.date, day.meals, and day.ingredients; each meal exposes meal.recipes.

Allergens

Plan reports get the batch allergen rollup the same way recipes do โ€” via aggregate_nutrition(plan.all_ingredients).allergen_summary for the whole plan, or aggregate_nutrition(day.ingredients).allergen_summary per day. Render the standard Contains/incomplete lines with the registered "allergens" partial:

{% set alg = aggregate_nutrition(plan.all_ingredients).allergen_summary -%}
{% if alg %}{% filter trim %}{% include "allergens" %}{% endfilter %}{% endif %}

contains unions verified items only โ€” a floor, not a ceiling, whenever unverified_ingredients is non-empty; unverified never means allergen-free. See the allergens section of the function reference for the full field reference.

Variety checks across a plan

category_servings(plan, slug) counts meals containing at least one ingredient in a category (tree-aware), which powers variety targets like omega-3 servings:

{% import "ck" as ck %}
{{ ck.min(category_servings(plan, "omega3_source"), client.targets.omega3_servings, "Omega-3 servings") }}

See Checks & client profiles for the ck macros and Confidence & provenance for whole-plan estimate quality.