---
title: "PATCH /api/public/nutrition-menus/{menuId}"
method: PATCH
path: "/api/public/nutrition-menus/{menuId}"
tags: ["Nutrition Menus"]
---

# PATCH /api/public/nutrition-menus/{menuId}

`PATCH /api/public/nutrition-menus/{menuId}`

Partially update a nutrition menu. Does not cascade: copies duplicated from this menu are left untouched, unlike the dashboard which offers to push the edit down to them.

## Path parameters

- `menuId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `name` string
  - `description` string
  - `goal` 'Weight Loss' | 'Muscle Gain' | 'Weight Maintenance' | 'Other'
  - `type` 'Vegetarian' | 'Vegan' | 'Keto' | 'Paleo' | 'Low Carbs' | 'Gluten Free' | 'Mediterranean'
  - `totalCalories` number
  - `totalProtein` number
  - `totalCarbs` number
  - `totalFat` number
  - `meals` object[]
    - `id` string — Meal id. Not stable: saving the menu from the dashboard rewrites every meal with a new id, so re-read this endpoint before each write instead of caching it. Ignored on create; resend it on PATCH to keep the meal and its alternatives instead of replacing it with a new one.
    - `title` string — Meal name, e.g. "Breakfast".
    - `foodItems` object[]
      - `name` string — Food name, e.g. "Chicken breast".
      - `quantity` number — Amount in the given unit, e.g. 150.
      - `unit` string — Unit of the quantity, e.g. "g", "ml", "unit".
      - `unitWeight` number — Grams in one unit. The app scales macros as quantity * unitWeight / 100 * the per-100g values, so send it whenever unit is not grams. Take it from the matching entry in the units array of GET /food-items. Defaults to 100.
      - `productCode` number — Food database code, from GET /food-items. Send it to link the food to its catalog entry so replacements and portion data behave like they do in the dashboard.
      - `caloriesPer100g` number
      - `proteinPer100g` number
      - `carbsPer100g` number
      - `fatPer100g` number
    - `calories` number — Total calories for the meal.
    - `protein` number
    - `carbs` number
    - `fat` number
    - `notes` string
    - `alternatives` object[] — Alternatives the trainee may eat instead of this meal. Manage them one at a time with POST/DELETE /nutrition-menus/{menuId}/meals/{mealId}/alternatives, or send the whole array here.
      - `id` string — Alternative id. Read-only; pass it to DELETE /nutrition-menus/{menuId}/meals/{mealId}/alternatives/{alternativeId}. Not stable: saving the menu from the dashboard gives every alternative a new id, so read it fresh rather than caching it.
      - `title` string — Alternative name, e.g. "Omelette instead".
      - `foodItems` object[]
        - `name` string — Food name, e.g. "Chicken breast".
        - `quantity` number — Amount in the given unit, e.g. 150.
        - `unit` string — Unit of the quantity, e.g. "g", "ml", "unit".
        - `unitWeight` number — Grams in one unit. The app scales macros as quantity * unitWeight / 100 * the per-100g values, so send it whenever unit is not grams. Take it from the matching entry in the units array of GET /food-items. Defaults to 100.
        - `productCode` number — Food database code, from GET /food-items. Send it to link the food to its catalog entry so replacements and portion data behave like they do in the dashboard.
        - `caloriesPer100g` number
        - `proteinPer100g` number
        - `carbsPer100g` number
        - `fatPer100g` number
      - `calories` number — Total calories for the alternative.
      - `protein` number
      - `carbs` number
      - `fat` number
      - `notes` string
  - `applyToAllSharedTrainees` boolean — Required (true) to edit a menu shared by multiple trainees; the change then applies to all of them. Without it, a shared menu returns 409.

## Response `200`

Successful response

- object — Successful response
  - `data` object
    - `id` string
    - `coach` string
    - `escorts` string[]
    - `title` string
    - `description` string
    - `goal` string
    - `type` string
    - `totalCalories` number
    - `totalProtein` number
    - `totalCarbs` number
    - `totalFat` number
    - `meals` object[]
      - `id` string — Meal id. Not stable: saving the menu from the dashboard rewrites every meal with a new id, so re-read this endpoint before each write instead of caching it. Ignored on create; resend it on PATCH to keep the meal and its alternatives instead of replacing it with a new one.
      - `title` string — Meal name, e.g. "Breakfast".
      - `foodItems` object[]
        - `name` string — Food name, e.g. "Chicken breast".
        - `quantity` number — Amount in the given unit, e.g. 150.
        - `unit` string — Unit of the quantity, e.g. "g", "ml", "unit".
        - `unitWeight` number — Grams in one unit. The app scales macros as quantity * unitWeight / 100 * the per-100g values, so send it whenever unit is not grams. Take it from the matching entry in the units array of GET /food-items. Defaults to 100.
        - `productCode` number — Food database code, from GET /food-items. Send it to link the food to its catalog entry so replacements and portion data behave like they do in the dashboard.
        - `caloriesPer100g` number
        - `proteinPer100g` number
        - `carbsPer100g` number
        - `fatPer100g` number
      - `calories` number — Total calories for the meal.
      - `protein` number
      - `carbs` number
      - `fat` number
      - `notes` string
      - `alternatives` object[] — Alternatives the trainee may eat instead of this meal. Manage them one at a time with POST/DELETE /nutrition-menus/{menuId}/meals/{mealId}/alternatives, or send the whole array here.
        - `id` string — Alternative id. Read-only; pass it to DELETE /nutrition-menus/{menuId}/meals/{mealId}/alternatives/{alternativeId}. Not stable: saving the menu from the dashboard gives every alternative a new id, so read it fresh rather than caching it.
        - `title` string — Alternative name, e.g. "Omelette instead".
        - `foodItems` object[]
          - `name` string — Food name, e.g. "Chicken breast".
          - `quantity` number — Amount in the given unit, e.g. 150.
          - `unit` string — Unit of the quantity, e.g. "g", "ml", "unit".
          - `unitWeight` number — Grams in one unit. The app scales macros as quantity * unitWeight / 100 * the per-100g values, so send it whenever unit is not grams. Take it from the matching entry in the units array of GET /food-items. Defaults to 100.
          - `productCode` number — Food database code, from GET /food-items. Send it to link the food to its catalog entry so replacements and portion data behave like they do in the dashboard.
          - `caloriesPer100g` number
          - `proteinPer100g` number
          - `carbsPer100g` number
          - `fatPer100g` number
        - `calories` number — Total calories for the alternative.
        - `protein` number
        - `carbs` number
        - `fat` number
        - `notes` string
    - `createdAt` string, date-time

## Other responses

- `400` — Default Response
- `401` — Default Response
- `403` — Default Response
- `404` — Default Response
- `409` — Default Response
- `429` — Default Response
- `500` — Default Response

---

[API](https://skmtc.dev/coach-platform/apis/coach-platform-api.md) · [All operations](https://skmtc.dev/coach-platform/apis/coach-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/coach-platform/coach-platform-api/revisions/3d18b514ae8c/schema)
