LogMeal Custom Recipes API
Create and assign custom recipes accessible by all the users in the company.⚡ Monitor plan or above ⚡
Create and assign custom recipes accessible by all the users in the company.⚡ Monitor plan or above ⚡
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/logmeal:logmeal-custom-recipes-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
version: 2.1.0
title: Food AI Engine API Documentation Custom Recipes API
description: Please, refer to https://docs.logmeal.com to find the most up-to-date version of the Food AI Engine API documentation.
contact:
email: support@logmeal.com
servers:
- url: https://api.logmeal.com
description: Production
tags:
- name: Custom Recipes
description: 'Create and assign custom recipes accessible by all the users in the company.
⚡ Monitor plan or above ⚡'
externalDocs:
url: https://docs.logmeal.com/docs/guides-features-custom-recipes#/
paths:
/v2/custom_recipe:
post:
tags:
- Custom Recipes
summary: 🔵⚫ Create a custom recipe
description: 'Allows creating a custom recipe that will only be visible by your company. You can create recipes that will be consumed exclusively by your users. You can provide a default dish name, ingredient_list and nutritional_indicators for each custom recipe. Note that all ingredients and nutrients quantities must be introduced for the standard serving size of the recipe.
Furthermore, you can optionally provide a set of translations for your dish to all the available languages (see endpoint /v2/info/languages to know which is the set of valid languages). The users will visualize the translation corresponding to his/her language. If a language''s value is set to null, the stored translation for that language will be deleted. **IMPORTANT: note that at least the language ''eng'' MUST be provided if you want the recognition algorithms to automatically detect the custom recipes.**
To identify an ingredient it can be done in two different ways. Either passing an ''ingredientId'' (it must be a valid ingredient id from the LogMeal system) or an ''ingredientName''. When passing a Name, the ingredient, will be present in the recipe and will be usable but it will not have some functionalities since it is not in the system and there is no data associated to it. It could be anything.
Refer to GET ''/v2/info/nutrients'' to see a list of valid nutrient codes. Where you can find the ''indicatorCode'' and unit for the ''indicatorAmount'' for all the available nutrients. Refer to GET ''/v2/dataset/ingredients'', it will return all the valid ingredients names and their ids. All values for ''ingredientAmount'' must be reported in grams and all values for ''indicatorAmount'' must be reported in the indicator-specific unit reported in ''/v2/info/nutrients''.
If a list of ingredients is provided but not a list of nutrients, the nutritional information will be automatically calculated based on the list of ingredients stored in the system. It''s important to note that only ingredients with a valid, existing and associated ID will be considered.
Alternatively, it is also possible to provide only the nutritional indicators without specifying any ingredients. In this case, the system will use the provided nutritional data as-is, without performing any automatic calculation or ingredient validation. This option can be useful when the exact composition of the recipe is unknown or when you only need to register the nutritional profile directly.
The request must be sent as `multipart/form-data` because an image is required when creating a custom recipe. Recipe fields are provided as form fields. Complex fields such as `ingredient_list`, `nutritional_indicators` and `translations` must contain JSON-serialized values.'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- image
- dish_name
anyOf:
- required:
- ingredient_list
- required:
- nutritional_indicators
properties:
image:
type: string
format: binary
description: Required image for the custom recipe.
dish_name:
type: string
example: Salad with tomato and seeds
sugar_modulation:
type: boolean
example: true
default: false
description: Whether added sugar modulation can be applied to the recipe.
auto_computed_nutritional_indicators:
type: boolean
example: false
default: false
ingredient_list:
type: string
description: 'JSON-serialized array of ingredients.
Each ingredient must contain `ingredientAmount` and exactly one of `ingredientId` or `ingredientName`.
'
example: '[{"ingredientId":14,"ingredientAmount":3.0},{"ingredientId":59,"ingredientAmount":4.5}]'
nutritional_indicators:
type: string
description: 'JSON-serialized array of nutritional indicators.
If omitted while `ingredient_list` is provided, nutritional information is calculated automatically from valid LogMeal ingredients.
'
example: '[{"indicatorCode":"FE","indicatorAmount":6.7},{"indicatorCode":"CA","indicatorAmount":2.8}]'
translations:
type: string
description: 'JSON-serialized object whose keys are valid 3-letter language codes.
'
example: '{"eng":"Salad with tomato and seeds","spa":"Ensalada con tomate y semillas"}'
responses:
'200':
description: Custom recipe successfully created!
content:
application/json:
schema:
type: object
properties:
message:
type: string
example: Custom recipe successfully created!
custom_recipe_id:
type: integer
example: 1
'400':
description: Bad request
content:
application/json:
schema:
type: object
properties:
code:
type: integer
message:
type: string
'401':
description: Unauthorized, invalid token.
'403':
description: Forbidden
'404':
description: Not found
security:
- Bearer: []
operationId: postV2CustomRecipe
x-operation-id-source: derived
get:
tags:
- Custom Recipes
summary: 🔵⚫🔴 Get some basic information about all the active custom recipes
description: This endpoint is used to get all active custom recipes.
parameters:
- in: query
name: language
schema:
type: string
enum:
- spa
- cat
- eng
- ita
- nld
- fre
- ger
- tur
- gre
- heb
description: Desired language for the response. It must be a three-letter ISO 639-2/T code. Defaults to the APIUser's assigned language or english.
required: false
responses:
'200':
description: Custom recipes retrieved successfully.
content:
application/json:
schema:
type: object
properties:
custom_recipes:
type: array
items:
type: object
properties:
custom_recipe_id:
type: integer
example: 1
description: ID of a custom recipe.
dish:
type: string
example: spaghetti bolognese
description: Name of the dish.
image_url:
type: string
description: URL to access the reference image.
example: https://storage.logmeal.com/apiImages/123.jpg
result:
type: string
example: Custom recipes retrieved successfully.
'400':
description: Bad request
content:
application/json:
schema:
type: object
properties:
code:
type: integer
message:
type: string
'401':
description: Unauthorized, invalid token.
'403':
description: Forbidden
'404':
description: Not found
security:
- Bearer: []
operationId: getV2CustomRecipe
x-operation-id-source: derived
/v2/custom_recipe/{custom_recipe_id}:
get:
tags:
- Custom Recipes
summary: 🔵⚫🔴 Get the complete information for a specific custom recipe
description: This endpoint is used to get a single custom recipe referred by the provided 'custom_recipe_id' parameter. It returns all the information associated to that specific recipe (dish name, image url, ingredients list, nutritional indicators, etc.).
parameters:
- in: path
name: custom_recipe_id
schema:
type: integer
required: true
description: ID of the custom recipe to get the information from.
- in: query
name: language
schema:
type: string
enum:
- spa
- cat
- eng
- ita
- nld
- fre
- ger
- tur
- gre
- heb
description: Desired language for the response. It must be a three-letter ISO 639-2/T code. Defaults to the APIUser's assigned language or english.
required: false
responses:
'200':
description: Custom recipe retrieved successfully.
content:
application/json:
schema:
type: object
properties:
custom_recipe:
type: object
properties:
custom_recipe_id:
type: integer
example: 1
description: ID of a custom recipe.
dish:
type: string
example: spaghetti bolognese
description: Name of the dish.
sugar_modulation:
type: boolean
example: 'true'
enum:
- 'true'
- 'false'
description: Whether the user could possibly choose to include added sugar to the recipe (e.g. coffees, yogurts, etc.).
image_url:
type: string
description: URL to access the image.
example: https://storage.logmeal.com/apiImages/123.jpg
ingredient_list:
type: array
items:
type: object
properties:
ingredientId:
type: integer
example: 12
ingredientName:
type: string
example: oil
ingredientAmount:
type: number
format: float
example: 5
nutritional_indicators:
type: array
items:
type: object
properties:
indicatorCode:
type: string
example: FE
indicatorAmount:
type: number
format: float
example: 6.7
translations:
type: object
properties:
default:
type: string
example: spaghetti bolognese
eng:
type: string
example: spaghetti bolognese
spa:
type: string
example: espagueti a la boloñesa
result:
type: string
example: Custom recipe retrieved successfully.
'400':
description: Bad request
content:
application/json:
schema:
type: object
properties:
code:
type: integer
message:
type: string
'401':
description: Unauthorized, invalid token.
'403':
description: Forbidden
'404':
description: Not found
security:
- Bearer: []
operationId: getV2CustomRecipeByCustomRecipeId
x-operation-id-source: derived
delete:
tags:
- Custom Recipes
summary: 🔵⚫ Deactivate an existing custom recipe
description: This endpoint is used to deactivate an existing custom recipe created by APICompany and APIUserManager. This means that all the food intakes attached to this custom recipe will remain untouched but the recipe will not be available anymore for future intake assignments.
parameters:
- in: path
name: custom_recipe_id
schema:
type: integer
required: true
description: Custom recipe ID to delete an existing custom recipe.
responses:
'200':
description: Custom recipe deleted successfully.
'400':
description: Bad request
'401':
description: Unauthorized, invalid token.
'403':
description: Forbidden
'404':
description: Not found
security:
- Bearer: []
operationId: deleteV2CustomRecipeByCustomRecipeId
x-operation-id-source: derived
patch:
tags:
- Custom Recipes
summary: 🔵⚫ Edit an existing custom recipe
description: 'Updates the details of an existing custom recipe identified by `custom_recipe_id`.
All recipe fields are optional and only the provided fields are updated.
If an ingredient list is provided without nutritional indicators, the nutritional information is automatically calculated from the valid LogMeal ingredients included in the recipe.
For `translations`, each language code maps to the translated dish name. A string value adds or updates the translation.
A null value deletes the stored translation for that language.
The request can be sent in two formats:
- `application/json`: use this format when updating recipe data without uploading an image.
- `multipart/form-data`: use the `data` field containing the JSON-serialized recipe payload and optionally provide the image in the `image` field.
The `data` object follows the same structure as the `application/json` payload.
Legacy multipart requests that provide recipe fields directly as form fields remain supported for backwards compatibility, but new integrations should use the `data` field.'
parameters:
- in: path
name: custom_recipe_id
schema:
type: integer
example: 123
required: true
description: ID of the custom recipe.
requestBody:
description: 'Custom recipe fields to update.
Use `application/json` when no image needs to be uploaded.
When using `multipart/form-data`, serialize the same JSON object in the `data` field and optionally attach the new recipe image in the `image` field.
'
content:
application/json:
schema:
type: object
properties:
dish_name:
type: string
example: Salad with tomato and seeds
sugar_modulation:
type: boolean
example: true
default: false
description: Whether added sugar modulation can be applied to the recipe. (e.g. coffees, yogurts, etc.).
ingredient_list:
type: array
description: Ingredient can only be identified by ingredientId or by ingredientName. Not both. Provide only one.
items:
type: object
properties:
ingredientId:
type: integer
example: 15
ingredientName:
type: string
example: Spirulina
ingredientAmount:
type: number
format: float
example: 5
example:
- ingredientId: 14
ingredientAmount: 3
- ingredientId: 59
ingredientAmount: 4.5
nutritional_indicators:
type: array
items:
type: object
properties:
indicatorCode:
type: string
example: FE
indicatorAmount:
type: number
format: float
example: 6.7
example:
- indicatorCode: FE
indicatorAmount: 6.7
- indicatorCode: CA
indicatorAmount: 2.8
auto_computed_nutritional_indicators:
type: boolean
example: false
description: Indicates whether the nutritional information was automatically calculated.
translations:
type: object
properties:
eng:
type: string
example: Salad with tomato and seeds
spa:
type:
- string
- 'null'
example: Ensalada con tomate y semillas
cat:
type:
- string
- 'null'
example: null
example:
dish_name: Updated salad
ingredient_list:
- ingredientId: 14
ingredientAmount: 30
translations:
eng: Updated salad
multipart/form-data:
schema:
type: object
properties:
data:
type: string
description: 'JSON-serialized object matching `EditCustomRecipes`.
'
example: '{"dish_name":"Updated salad","ingredient_list":[{"ingredientId":14,"ingredientAmount":30}],"translations":{"eng":"Updated salad"}}'
image:
type: string
format: binary
description: Optional new image for the custom recipe.
responses:
'200':
description: Custom recipe edited successfully.
content:
application/json:
schema:
type: object
required:
- result
properties:
result:
type: string
example: Custom recipe edited successfully.
'400':
description: Bad request
'401':
description: Unauthorized, invalid token.
'403':
description: Forbidden
'404':
description: Not found
security:
- Bearer: []
operationId: patchV2CustomRecipeByCustomRecipeId
x-operation-id-source: derived
components:
securitySchemes:
Bearer:
type: http
scheme: bearer
bearerFormat: JWT
x-build:
time: '2026-10-19T02:02:11.433999Z'
x-provenance:
method: harvested
publisher: LogMeal
source: https://docs.logmeal.com/openapi/logmeal_openapi.yaml
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)