Download OpenAPI specification:
REST API for the Intake self-hosted nutrition and activity tracker.
Authentication: JWT stored in an HttpOnly session cookie (intake_session).
All routes except /auth/register, /auth/login, and /auth/logout require a valid session.
Set the AUTH_SECRET environment variable to a stable secret so sessions survive service restarts.
CORS: Credentials allowed from all origins.
Timeout: 10 seconds per request.
Base URL: http://localhost:8080 (direct) or via the web proxy at http://localhost:3001/api.
| email required | string <email> |
| password required | string non-empty |
| display_name | string |
{- "email": "user@example.com",
- "password": "string",
- "display_name": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "display_name": "string",
- "is_first_user": true
}| email required | string <email> |
| password required | string |
{- "email": "user@example.com",
- "password": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "display_name": "string",
- "is_first_user": true
}| date | string <date> Day to summarise (default today) |
{- "date": "2019-08-24",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "calories_in": 0,
- "protein_g": 0,
- "carbs_g": 0,
- "fat_g": 0,
- "fiber_g": 0,
- "steps": 0,
- "active_calories_est": 0
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Chicken Breast",
- "brand": "Generic",
- "serving_label": "100g",
- "calories_per_serving": 165,
- "protein_g_per_serving": 31,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 3.6,
- "fiber_g_per_serving": 0
}
]| name required | string |
| brand | string |
| serving_label | string Default: "1 serving" |
| calories_per_serving | number |
| protein_g_per_serving | number |
| carbs_g_per_serving | number |
| fat_g_per_serving | number |
| fiber_g_per_serving | number |
| recipe_instructions | string |
| recipe_yield_count | integer Default: 1 |
Array of objects |
{- "name": "string",
- "brand": "string",
- "serving_label": "1 serving",
- "calories_per_serving": 0,
- "protein_g_per_serving": 0,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 0,
- "fiber_g_per_serving": 0,
- "recipe_instructions": "string",
- "recipe_yield_count": 1,
- "recipe_ingredients": [
- {
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "amount_g": 0
}
]
}{- "ok": true,
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "recipe_id": "fa7d15d4-7670-4586-a94b-5079ed028135"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "Chicken Breast",
- "brand": "Generic",
- "serving_label": "100g",
- "calories_per_serving": 165,
- "protein_g_per_serving": 31,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 3.6,
- "fiber_g_per_serving": 0
}| id required | string <uuid> |
| name required | string |
| brand | string |
| serving_label | string |
| calories_per_serving | number |
| protein_g_per_serving | number |
| carbs_g_per_serving | number |
| fat_g_per_serving | number |
| fiber_g_per_serving | number |
| recipe_instructions | string |
| recipe_yield_count | integer |
{- "name": "string",
- "brand": "string",
- "serving_label": "string",
- "calories_per_serving": 0,
- "protein_g_per_serving": 0,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 0,
- "fiber_g_per_serving": 0,
- "recipe_instructions": "string",
- "recipe_yield_count": 0
}| date | string <date> Day to query (default today) |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "meal": "breakfast",
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "food_name": "string",
- "serving_label": "string",
- "servings": 0,
- "calories": 0,
- "protein_g": 0,
- "carbs_g": 0,
- "fat_g": 0,
- "fiber_g": 0,
- "occurred_at": "2019-08-24T14:15:22Z"
}
]| food_item_id required | string <uuid> |
| servings required | number >= 0.01 |
| meal | string Default: "breakfast" Enum: "breakfast" "lunch" "dinner" "snack_1" "snack_2" "snack_3" |
| occurred_at | string <date-time> Defaults to now |
| note | string |
{- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "servings": 0.01,
- "meal": "breakfast",
- "occurred_at": "2019-08-24T14:15:22Z",
- "note": "string"
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "brand": "string",
- "serving_label": "string",
- "instructions": "string",
- "yield_count": 0,
- "calories_per_serving": 0,
- "protein_g_per_serving": 0,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 0,
- "fiber_g_per_serving": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "ingredient_count": 0
}
]| name required | string |
| brand | string |
| serving_label | string |
| calories_per_serving | number |
| protein_g_per_serving | number |
| carbs_g_per_serving | number |
| fat_g_per_serving | number |
| fiber_g_per_serving | number |
| instructions | string |
| yield_count | integer Default: 1 |
Array of objects |
{- "name": "string",
- "brand": "string",
- "serving_label": "string",
- "calories_per_serving": 0,
- "protein_g_per_serving": 0,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 0,
- "fiber_g_per_serving": 0,
- "instructions": "string",
- "yield_count": 1,
- "shopping_items": [
- {
- "name": "string",
- "amount": 0,
- "unit": "string",
- "sort_order": 0
}
]
}{- "ok": true,
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}| recipe_ids required | Array of strings <uuid> [ items <uuid > ] |
{- "recipe_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "ok": true,
- "ingredients": [
- {
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "name": "string",
- "brand": "string",
- "total_g": 0
}
]
}| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "name": "string",
- "instructions": "string",
- "yield_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "ingredients": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "food_name": "string",
- "brand": "string",
- "amount_g": 0
}
]
}| id required | string <uuid> |
| name required | string |
| instructions | string |
| yield_count | integer |
{- "name": "string",
- "instructions": "string",
- "yield_count": 0
}| id required | string <uuid> |
| food_item_id required | string <uuid> |
| amount_g required | number |
{- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "amount_g": 0
}| id required | string <uuid> |
Array of objects |
{- "ingredients": [
- {
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "amount_g": 0
}
]
}| id required | string <uuid> |
Array of objects |
{- "items": [
- {
- "name": "string",
- "amount": 0,
- "unit": "string",
- "sort_order": 0
}
]
}[- {
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "food_name": "string",
- "brand": "string",
- "serving_label": "string",
- "calories_per_serving": 0,
- "protein_g_per_serving": 0,
- "carbs_g_per_serving": 0,
- "fat_g_per_serving": 0,
- "quantity": 0,
- "updated_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24"
}
]| food_item_id required | string <uuid> |
| quantity required | number |
| expires_at | string or null <date> |
{- "quantity": 0,
- "expires_at": "2019-08-24"
}| food_item_id required | string <uuid> |
| servings required | number |
{- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "servings": 0
}[- {
- "recipe_id": "fa7d15d4-7670-4586-a94b-5079ed028135",
- "recipe_name": "string",
- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "amount": 0,
- "unit": "string",
- "sort_order": 0
}
]
}
][- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "food_name": "string",
- "remind_at": "09:00",
- "enabled": true,
- "logged_today": true
}
]| food_item_id required | string <uuid> |
| remind_at required | string |
| webhook_url required | string <uri> |
{- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "remind_at": "09:00",
}| id required | string <uuid> |
| remind_at | string |
| webhook_url | string <uri> |
| enabled | boolean |
{- "remind_at": "string",
- "enabled": true
}| date required | string <date> |
| meal required | string |
| food_item_id required | string <uuid> |
| servings required | number |
{- "date": "2019-08-24",
- "meal": "string",
- "food_item_id": "2c3a1b3b-36cc-416d-bb39-8acf0e0f9d7a",
- "servings": 0
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "days": [
- 0
], - "exercises": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "name": "string",
- "sets": 0,
- "reps_min": 0,
- "reps_max": 0,
- "sort_order": 0
}
], - "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| name required | string |
| sets | integer Default: 3 |
| reps_min | integer |
| reps_max | integer |
| sort_order | integer |
{- "name": "string",
- "sets": 3,
- "reps_min": 0,
- "reps_max": 0,
- "sort_order": 0
}| date | string <date> Defaults to today |
[- {
- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "program_name": "string",
- "exercises": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "name": "string",
- "sets": 0,
- "reps_min": 0,
- "reps_max": 0,
- "sort_order": 0,
- "logged_sets": [
- {
- "set_number": 0,
- "weight_kg": 0,
- "reps_actual": 0,
- "completed": true
}
], - "prev_logged_sets": [
- {
- "set_number": 0,
- "weight_kg": 0,
- "reps_actual": 0,
- "completed": true
}
]
}
]
}
]| program_id required | string <uuid> |
| date required | string <date> |
{- "program_id": "70c1146b-e933-4cb2-a789-bbca5312b517",
- "date": "2019-08-24"
}| session_id required | string <uuid> |
| exercise_id required | string <uuid> |
| set_number required | integer >= 1 |
| weight_kg | number or null |
| reps_actual | integer or null |
| completed | boolean |
{- "session_id": "1ffd059c-17ea-40a8-8aef-70fd0307db82",
- "exercise_id": "506f9fcd-d1ac-40ff-8eae-940f7fd80178",
- "set_number": 1,
- "weight_kg": 0,
- "reps_actual": 0,
- "completed": true
}| custom_prompt | string Replaces the default macro-summary task |
| date | string <date> |
{- "custom_prompt": "string",
- "date": "2019-08-24"
}{- "ok": true,
- "text": "string",
- "provider": "string",
- "date": "2019-08-24",
- "run_at": "2019-08-24T14:15:22Z"
}