List nutrition menus

GET/api/public/nutrition-menus

List nutrition menus. Filter by traineeId.

Authentication

Requires an API key, sent as Authorization: Bearer cp_live_....

API keys carry scopes. Get the catalog of scopes and webhook events lists every scope.

Query parameters

Query parameters
NameTypeDescription
pageinteger

Page number (1-based, default 1)

Minimum: 1

limitinteger

Number of items to return (default 25, max 500)

Minimum: 1

Maximum: 500

traineeIdstring

Request examples

cURL
curl --request GET \
  --url 'https://api.coach-platform.com/api/public/nutrition-menus' \
  --header 'Authorization: Bearer cp_live_...'
JavaScript (fetch)
const response = await fetch('https://api.coach-platform.com/api/public/nutrition-menus', {
  method: 'GET',
  headers: {
    Authorization: 'Bearer cp_live_...',
  },
});

const data = await response.json();

Responses

200 OK

Successful response

Example body (application/json)
{
  "data": [
    {
      "id": "<string>",
      "coach": "<string>",
      "escorts": [
        "<string>"
      ],
      "title": "<string>",
      "description": "<string>",
      "goal": "<string>",
      "type": "<string>",
      "totalCalories": 123,
      "totalProtein": 123,
      "totalCarbs": 123,
      "totalFat": 123,
      "meals": [
        {
          "id": "<string>",
          "title": "<string>",
          "foodItems": [
            {
              "name": "<string>",
              "quantity": 123,
              "unit": "<string>",
              "unitWeight": 123,
              "productCode": 123,
              "caloriesPer100g": 123,
              "proteinPer100g": 123,
              "carbsPer100g": 123,
              "fatPer100g": 123
            }
          ],
          "calories": 123,
          "protein": 123,
          "carbs": 123,
          "fat": 123,
          "notes": "<string>",
          "alternatives": [
            {
              "id": "<string>",
              "title": "<string>",
              "foodItems": [
                {
                  "name": "<string>",
                  "quantity": 123,
                  "unit": "<string>",
                  "unitWeight": 123,
                  "productCode": 123,
                  "caloriesPer100g": 123,
                  "proteinPer100g": 123,
                  "carbsPer100g": 123,
                  "fatPer100g": 123
                }
              ],
              "calories": 123,
              "protein": 123,
              "carbs": 123,
              "fat": 123,
              "notes": "<string>"
            }
          ]
        }
      ],
      "createdAt": "<date-time>"
    }
  ],
  "pagination": {
    "page": 123,
    "limit": 123,
    "total": 123,
    "hasMore": true,
    "truncated": true
  }
}
Response fields (55)
Response fields
NameTypeDescription
dataobject[]
data[].idstring
data[].coachstring
data[].escortsstring[]
data[].titlestring
data[].descriptionstring
data[].goalstring
data[].typestring
data[].totalCaloriesnumber
data[].totalProteinnumber
data[].totalCarbsnumber
data[].totalFatnumber
data[].mealsobject[]
data[].meals[].idstring

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.

data[].meals[].titlestring

Meal name, e.g. "Breakfast".

data[].meals[].foodItemsobject[]
data[].meals[].foodItems[].namestring

Food name, e.g. "Chicken breast".

data[].meals[].foodItems[].quantitynumber

Amount in the given unit, e.g. 150.

data[].meals[].foodItems[].unitstring

Unit of the quantity, e.g. "g", "ml", "unit".

data[].meals[].foodItems[].unitWeightnumber

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.

data[].meals[].foodItems[].productCodenumber

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.

data[].meals[].foodItems[].caloriesPer100gnumber
data[].meals[].foodItems[].proteinPer100gnumber
data[].meals[].foodItems[].carbsPer100gnumber
data[].meals[].foodItems[].fatPer100gnumber
data[].meals[].caloriesnumber

Total calories for the meal.

data[].meals[].proteinnumber
data[].meals[].carbsnumber
data[].meals[].fatnumber
data[].meals[].notesstring
data[].meals[].alternativesobject[]

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.

Maximum items: 20

data[].meals[].alternatives[].idstring

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.

data[].meals[].alternatives[].titlestring

Alternative name, e.g. "Omelette instead".

data[].meals[].alternatives[].foodItemsobject[]
data[].meals[].alternatives[].foodItems[].namestring

Food name, e.g. "Chicken breast".

data[].meals[].alternatives[].foodItems[].quantitynumber

Amount in the given unit, e.g. 150.

data[].meals[].alternatives[].foodItems[].unitstring

Unit of the quantity, e.g. "g", "ml", "unit".

data[].meals[].alternatives[].foodItems[].unitWeightnumber

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.

data[].meals[].alternatives[].foodItems[].productCodenumber

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.

data[].meals[].alternatives[].foodItems[].caloriesPer100gnumber
data[].meals[].alternatives[].foodItems[].proteinPer100gnumber
data[].meals[].alternatives[].foodItems[].carbsPer100gnumber
data[].meals[].alternatives[].foodItems[].fatPer100gnumber
data[].meals[].alternatives[].caloriesnumber

Total calories for the alternative.

data[].meals[].alternatives[].proteinnumber
data[].meals[].alternatives[].carbsnumber
data[].meals[].alternatives[].fatnumber
data[].meals[].alternatives[].notesstring
data[].createdAtstring<date-time>
paginationobject
pagination.pagenumber
pagination.limitnumber
pagination.totalnumber | null

Total number of matching items. null when the underlying source cannot report an exact count for this page; use hasMore to keep paging.

pagination.hasMoreboolean
pagination.truncatedboolean

Present and true when the result set exceeded the in-memory scan cap and was truncated. Narrow your filters to page through all items.

Error responses

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 429 Too Many Requests
  • 500 Internal Server Error

These statuses share the same response body.

Example body (application/json)
{
  "error": {
    "code": "<string>",
    "message": "<string>",
    "fix": "<string>",
    "details": {},
    "retryAfterMs": 123
  }
}
Error fields (6)
Error fields
NameTypeDescription
errorobject
error.codestring
error.messagestring
error.fixstring | null
error.detailsobject | null
error.retryAfterMsnumber | null

This page is also available as Markdown. Browse it in the interactive explorer or download the OpenAPI spec.