{"openapi":"3.1.0","info":{"title":"Nutriinfo.es API","version":"1.0.0","description":"Base de datos nutricional estructurada del catálogo de Mercadona. Toda nutrición indica su origen: declarado (leído de la etiqueta), estimado o ausente. Por defecto solo productos para consumo humano y a la venta."},"servers":[{"url":"https://www.nutriinfo.es/api"}],"security":[{"clave":[]}],"paths":{"/v1/productos":{"get":{"operationId":"productos","summary":"Buscar productos","description":"Listado con filtros, orden y paginación. Solo productos para consumo humano, visibles y a la venta. Cada producto indica el origen de su nutrición: declarado (etiqueta), estimado o ausente.","parameters":[{"name":"categoria","in":"query","required":false,"description":"Id de categoría (de /v1/categorias). Incluye sus subcategorías.","schema":{"type":"string","format":"uuid"}},{"name":"texto","in":"query","required":false,"description":"Búsqueda de texto en nombre y descripción.","schema":{"type":"string"}},{"name":"marca","in":"query","required":false,"description":"Marca exacta, sin distinguir mayúsculas.","schema":{"type":"string"}},{"name":"base","in":"query","required":false,"description":"Base de la nutrición: por_100 (defecto, la de comparación), escurrido (conservas: lo que se come sin el líquido), racion o reconstituido.","schema":{"type":"string","enum":["por_100","escurrido","racion","reconstituido"]}},{"name":"origen","in":"query","required":false,"description":"Solo nutrición declarada en la etiqueta o solo estimada. Para rankings, origen=declarado excluye los estimados.","schema":{"type":"string","enum":["declarado","estimado"]}},{"name":"nutriente[…]","in":"query","required":false,"description":"nutriente[clave][min] y nutriente[clave][max] con cualquier clave de /v1/nutrientes, en su unidad y sobre la base elegida. Ejemplo: nutriente[proteinas][min]=20","schema":{"type":"number"}},{"name":"alergeno[…]","in":"query","required":false,"description":"alergeno[clave]=estado. Claves: gluten, crustaceos, huevos, pescado, cacahuetes, soja, leche, frutos_de_cascara, apio, mostaza, sesamo, sulfitos, altramuces, moluscos. Estados: contiene, trazas, libre_de (declarado explícitamente; no es lo mismo que no mencionarlo). Varios estados separados por comas. Ejemplo: alergeno[gluten]=libre_de","schema":{"type":"string"}},{"name":"con_ingrediente","in":"query","required":false,"description":"Contiene este ingrediente a cualquier profundidad de la lista. Se puede repetir.","schema":{"type":"string"}},{"name":"sin_ingrediente","in":"query","required":false,"description":"No contiene este ingrediente a ninguna profundidad. Solo devuelve productos cuya lista de ingredientes se conoce. Se puede repetir.","schema":{"type":"string"}},{"name":"nova","in":"query","required":false,"description":"Grupo NOVA (1 a 4); varios separados por comas. Ejemplo: 1,2","schema":{"type":"string"}},{"name":"precio_min","in":"query","required":false,"description":"Precio actual mínimo, en euros por unidad de venta (por kilo en lo que se vende al peso sin formato fijo).","schema":{"type":"number"}},{"name":"precio_max","in":"query","required":false,"description":"Precio actual máximo, en euros por unidad de venta (por kilo en lo que se vende al peso sin formato fijo).","schema":{"type":"number"}},{"name":"graduacion_min","in":"query","required":false,"description":"Graduación alcohólica mínima, en % vol. Solo devuelve productos con graduación conocida.","schema":{"type":"number"}},{"name":"graduacion_max","in":"query","required":false,"description":"Graduación alcohólica máxima, en % vol (p. ej. 0.5 para bebidas sin alcohol que lo declaran). Solo devuelve productos con graduación conocida.","schema":{"type":"number"}},{"name":"orden","in":"query","required":false,"description":"nombre (defecto), precio, precio_por_unidad, proteina_por_euro, graduacion o cualquier clave de nutriente. Con «-» delante, descendente. Ordenar por un valor excluye los productos que no lo tienen. Ejemplo: -proteinas","schema":{"type":"string"}},{"name":"pagina","in":"query","required":false,"description":"Página, desde 1.","schema":{"type":"integer"}},{"name":"por_pagina","in":"query","required":false,"description":"Resultados por página: 20 por defecto, 100 como máximo.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/ProductoResumen"}},"paginacion":{"$ref":"#/components/schemas/Paginacion"},"pendientes":{"type":"object","description":"Solo con texto o categoría, en la primera página, y si los hay: productos que encajarían pero aún no tienen sus datos publicados.","properties":{"productos":{"type":"integer"},"nota":{"type":"string"}}}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/productos/{id}":{"get":{"operationId":"producto","summary":"Ficha de producto","description":"Ficha completa: todas las bases nutricionales con su origen, ingredientes en árbol, alérgenos por fuente, derivados, precio actual e imágenes.","parameters":[{"name":"id","in":"path","required":true,"description":"Id del producto.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"$ref":"#/components/schemas/ProductoFicha"}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/productos/ean/{ean}":{"get":{"operationId":"productoEan","summary":"Buscar por código de barras","description":"Fichas con ese EAN. Un EAN puede repetirse entre productos (pack y unidad suelta), por eso devuelve una lista.","parameters":[{"name":"ean","in":"path","required":true,"description":"EAN de 8 a 14 dígitos.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/ProductoFicha"}}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/productos/{id}/precios":{"get":{"operationId":"productoPrecios","summary":"Histórico de precios","description":"Serie histórica por tramos: cada tramo es un precio vigente entre desde y hasta (null = vigente hoy).","parameters":[{"name":"id","in":"path","required":true,"description":"Id del producto.","schema":{"type":"string","format":"uuid"}},{"name":"desde","in":"query","required":false,"description":"Solo tramos vigentes en esta fecha o después.","schema":{"type":"string","format":"date"}},{"name":"hasta","in":"query","required":false,"description":"Solo tramos vigentes en esta fecha o antes.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/TramoPrecio"}}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cambios-precio":{"get":{"operationId":"cambiosPrecio","summary":"Cambios de precio","description":"Productos que han subido o bajado de precio, en todo el catálogo o en una categoría, con el precio y el precio por kilo o litro de antes y de después, la variación en euros y en %, y si una oferta empieza o acaba. Un producto que entra en el seguimiento no cuenta. Datos desde el 9 de octubre de 2026.","parameters":[{"name":"desde","in":"query","required":false,"description":"Cambios desde esta fecha (AAAA-MM-DD). Para «hoy», la fecha de hoy.","schema":{"type":"string","format":"date"}},{"name":"hasta","in":"query","required":false,"description":"Cambios hasta esta fecha (AAAA-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"tipo","in":"query","required":false,"description":"Solo subidas o solo bajadas.","schema":{"type":"string","enum":["subida","bajada"]}},{"name":"categoria","in":"query","required":false,"description":"Id de categoría (de /v1/categorias). Incluye sus subcategorías.","schema":{"type":"string","format":"uuid"}},{"name":"marca","in":"query","required":false,"description":"Marca exacta, p. ej. Hacendado.","schema":{"type":"string"}},{"name":"variacion_min","in":"query","required":false,"description":"Variación mínima en %, con signo (una bajada del 10 % es -10).","schema":{"type":"number"}},{"name":"variacion_max","in":"query","required":false,"description":"Variación máxima en %, con signo.","schema":{"type":"number"}},{"name":"promociones","in":"query","required":false,"description":"incluir (defecto); solo: cambios en los que empieza o acaba una oferta; excluir: solo cambios de tarifa, sin oferta antes ni después.","schema":{"type":"string","enum":["incluir","solo","excluir"]}},{"name":"orden","in":"query","required":false,"description":"fecha (defecto, lo más reciente primero), variacion (%), variacion_abs (€), precio, precio_por_unidad o cualquier clave de /v1/nutrientes (por 100 g). Con «-» delante, descendente. Ordenar por un valor excluye lo que no lo tiene. Ejemplo: -grasas","schema":{"type":"string"}},{"name":"pagina","in":"query","required":false,"description":"Página, desde 1.","schema":{"type":"integer"}},{"name":"por_pagina","in":"query","required":false,"description":"Resultados por página: 20 por defecto, 100 como máximo.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/CambioPrecio"}},"paginacion":{"$ref":"#/components/schemas/Paginacion"}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cambios-envase":{"get":{"operationId":"cambiosEnvase","summary":"Cambios de envase y reduflación","description":"Productos cuyo envase trae menos o más que antes, con la cantidad y el precio de antes y de después y cuánto ha variado el precio por cantidad. reduflacion marca las reducciones en las que el precio no ha bajado en proporción. Datos desde el 11 de octubre de 2026.","parameters":[{"name":"categoria","in":"query","required":false,"description":"Id de categoría (de /v1/categorias). Incluye sus subcategorías.","schema":{"type":"string","format":"uuid"}},{"name":"tipo","in":"query","required":false,"description":"Solo reducciones (el envase trae menos) o solo aumentos.","schema":{"type":"string","enum":["reduccion","aumento"]}},{"name":"solo_reduflacion","in":"query","required":false,"description":"true: solo reducciones que salen más caras por cantidad.","schema":{"type":"string","enum":["true","false"]}},{"name":"desde","in":"query","required":false,"description":"Solo cambios desde esta fecha (AAAA-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"pagina","in":"query","required":false,"description":"Página, desde 1.","schema":{"type":"integer"}},{"name":"por_pagina","in":"query","required":false,"description":"Resultados por página: 20 por defecto, 100 como máximo.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/CambioEnvase"}},"paginacion":{"$ref":"#/components/schemas/Paginacion"}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/categorias":{"get":{"operationId":"categorias","summary":"Árbol de categorías","description":"Categorías activas en árbol. El id sirve para el filtro categoria de /v1/productos.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/Categoria"}}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/nutrientes":{"get":{"operationId":"nutrientes","summary":"Catálogo de nutrientes","description":"Claves de nutriente que se pueden usar para filtrar y ordenar, con su unidad y cuántos productos las declaran por 100 g/ml.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/Nutriente"}}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ingredientes/buscar":{"get":{"operationId":"ingredientesBuscar","summary":"Productos por ingrediente","description":"Productos que contienen un ingrediente a cualquier profundidad de la lista, con los ingredientes que coinciden.","parameters":[{"name":"q","in":"query","required":true,"description":"Ingrediente a buscar (mínimo 2 letras).","schema":{"type":"string"}},{"name":"base","in":"query","required":false,"description":"Base de la nutrición: por_100 (defecto, la de comparación), escurrido (conservas: lo que se come sin el líquido), racion o reconstituido.","schema":{"type":"string","enum":["por_100","escurrido","racion","reconstituido"]}},{"name":"pagina","in":"query","required":false,"description":"Página, desde 1.","schema":{"type":"integer"}},{"name":"por_pagina","in":"query","required":false,"description":"Resultados por página: 20 por defecto, 100 como máximo.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"type":"array","items":{"$ref":"#/components/schemas/ProductoConIngrediente"}},"paginacion":{"$ref":"#/components/schemas/Paginacion"}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/estado":{"get":{"operationId":"estado","summary":"Estado del catálogo","description":"Última ingesta, productos indexados y cobertura de los datos.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"$ref":"#/components/schemas/Estado"}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Cuota agotada. Cabeceras RateLimit-* y Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/uso":{"get":{"operationId":"uso","summary":"Consumo de la cuota","description":"Plan de la cuenta y consultas usadas y restantes hoy (cuota diaria de esta clave) y este mes (toda la cuenta), con cuándo se renueva cada una. No gasta cuota: se puede consultar aunque esté agotada.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["datos"],"properties":{"datos":{"$ref":"#/components/schemas/Uso"}}}}}},"400":{"description":"Parámetro no válido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Falta la clave o no es válida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Cuenta desactivada, o clave del conector MCP usada fuera de él","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe o no está disponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"openapi","summary":"Esta especificación","description":"Especificación OpenAPI de la API v1.","security":[],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAPI"}}}}}}}},"components":{"securitySchemes":{"clave":{"type":"http","scheme":"bearer","description":"Authorization: Bearer <clave>"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["codigo","mensaje"],"properties":{"codigo":{"type":"string"},"mensaje":{"type":"string"}}}}},"Paginacion":{"type":"object","required":["pagina","por_pagina","total","paginas"],"properties":{"pagina":{"type":"integer"},"por_pagina":{"type":"integer"},"total":{"type":"integer"},"paginas":{"type":"integer"}}},"Nutricion":{"type":"object","description":"Nutrición en una base. origen nunca falta: declarado (etiqueta), estimado o ausente.","required":["base","origen","nutrientes"],"properties":{"base":{"type":"string","enum":["por_100","escurrido","racion","reconstituido"]},"origen":{"type":"string","enum":["declarado","estimado","ausente"]},"unidad_referencia":{"oneOf":[{"type":"string","enum":["g","ml"]},{"type":"null"}]},"cantidad_referencia":{"oneOf":[{"type":"number"},{"type":"null"}]},"nutrientes":{"type":"object","description":"Por clave de nutriente (ver /v1/nutrientes).","additionalProperties":{"type":"object","required":["valor","unidad"],"properties":{"valor":{"oneOf":[{"type":"number"},{"type":"null"}]},"unidad":{"type":"string"},"valor_min":{"type":"number"},"valor_max":{"type":"number"}}}},"nota":{"type":"string"}}},"Precio":{"type":"object","required":["precio","es_promocion","desde"],"properties":{"precio":{"type":"number","description":"Euros por unidad de venta. En lo que se vende al peso sin formato fijo (pescado o marisco a granel), euros por kilo, como en la tienda."},"precio_por_unidad":{"oneOf":[{"type":"number","description":"Euros por kg, l o unidad. Usa el peso escurrido cuando lo hay."},{"type":"null"}]},"unidad_referencia":{"oneOf":[{"type":"string","enum":["kg","l","ud"]},{"type":"null"}]},"es_promocion":{"type":"boolean"},"precio_base":{"oneOf":[{"type":"number","description":"Precio sin promoción."},{"type":"null"}]},"desde":{"type":"string","format":"date"}}},"TramoPrecio":{"allOf":[{"$ref":"#/components/schemas/Precio"},{"type":"object","properties":{"hasta":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"cantidad":{"oneOf":[{"type":"number","description":"Lo que trae el envase en ese tramo, en unidad_cantidad. Null en tramos anteriores a que se registrara."},{"type":"null"}]},"unidad_cantidad":{"oneOf":[{"type":"string","enum":["kg","l","ud"]},{"type":"null"}]},"reduflacion":{"type":"boolean","description":"El envase trae menos que en el tramo anterior y el precio no ha bajado en proporción: sale más caro por cantidad."}}}]},"CambioPrecio":{"type":"object","required":["producto","fecha","tipo","antes","despues","variacion","cambio_envase"],"properties":{"producto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"},"marca":{"oneOf":[{"type":"string"},{"type":"null"}]},"formato":{"oneOf":[{"type":"string"},{"type":"null"}]},"categoria":{"oneOf":[{"$ref":"#/components/schemas/CategoriaRef"},{"type":"null"}]}}},"fecha":{"type":"string","format":"date","description":"Primer día con el precio nuevo."},"tipo":{"type":"string","enum":["subida","bajada"]},"antes":{"$ref":"#/components/schemas/LadoCambioPrecio"},"despues":{"$ref":"#/components/schemas/LadoCambioPrecio"},"unidad_referencia":{"oneOf":[{"type":"string","enum":["kg","l","ud"]},{"type":"null"}]},"variacion":{"type":"object","properties":{"euros":{"type":"number"},"porcentaje":{"type":"number"}}},"cambio_envase":{"type":"boolean","description":"El envase también cambió: parte de la variación es por cantidad."},"valor_orden":{"oneOf":[{"type":"number","description":"Valor por el que se ordena, si orden no es fecha."},{"type":"null"}]}}},"LadoCambioPrecio":{"type":"object","properties":{"precio":{"type":"number"},"precio_por_unidad":{"oneOf":[{"type":"number"},{"type":"null"}]},"es_promocion":{"type":"boolean"}}},"CambioEnvase":{"type":"object","required":["producto","fecha","tipo","antes","despues","variacion","reduflacion"],"properties":{"producto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"},"marca":{"oneOf":[{"type":"string"},{"type":"null"}]},"formato":{"oneOf":[{"type":"string"},{"type":"null"}]},"categoria":{"oneOf":[{"$ref":"#/components/schemas/CategoriaRef"},{"type":"null"}]}}},"fecha":{"type":"string","format":"date","description":"Primer día con el envase nuevo."},"tipo":{"type":"string","enum":["reduccion","aumento"]},"unidad_cantidad":{"type":"string","enum":["kg","l","ud"]},"unidad_referencia":{"oneOf":[{"type":"string","enum":["kg","l","ud"]},{"type":"null"}]},"antes":{"$ref":"#/components/schemas/LadoCambioEnvase"},"despues":{"$ref":"#/components/schemas/LadoCambioEnvase"},"variacion":{"type":"object","description":"En %, con el precio habitual (sin promoción).","properties":{"cantidad":{"type":"number"},"precio":{"type":"number"},"precio_por_cantidad":{"type":"number"}}},"reduflacion":{"type":"boolean","description":"Reducción en la que el precio no ha bajado en proporción: sale más caro por cantidad."}}},"LadoCambioEnvase":{"type":"object","properties":{"cantidad":{"type":"number"},"precio":{"type":"number"},"precio_habitual":{"type":"number","description":"Sin promoción."},"precio_por_unidad":{"oneOf":[{"type":"number"},{"type":"null"}]}}},"CategoriaRef":{"type":"object","required":["id","nombre"],"properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"}}},"ProductoResumen":{"type":"object","required":["id","slug","nombre","nutricion"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"nombre":{"type":"string"},"marca":{"oneOf":[{"type":"string"},{"type":"null"}]},"formato":{"oneOf":[{"type":"string"},{"type":"null"}]},"ean":{"oneOf":[{"type":"string"},{"type":"null"}]},"categoria":{"oneOf":[{"$ref":"#/components/schemas/CategoriaRef"},{"type":"null"}]},"precio":{"oneOf":[{"$ref":"#/components/schemas/Precio"},{"type":"null"}]},"nutricion":{"$ref":"#/components/schemas/Nutricion"},"nova":{"oneOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"graduacion_alcohol":{"oneOf":[{"type":"number"},{"type":"null"}],"description":"Graduación de las bebidas alcohólicas, en % vol."},"imagen":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}]},"valor_orden":{"oneOf":[{"type":"number","description":"Valor por el que se ordena, si orden no es nombre."},{"type":"null"}]}}},"Ingrediente":{"type":"object","required":["nombre","hijos"],"properties":{"nombre":{"type":"string"},"porcentaje_declarado":{"oneOf":[{"type":"number","description":"Relativo a su compuesto, tal como se declara."},{"type":"null"}]},"porcentaje_sobre_producto":{"oneOf":[{"type":"number","description":"Calculado sobre el total del producto."},{"type":"null"}]},"e_number":{"oneOf":[{"type":"string"},{"type":"null"}]},"es_alergeno":{"type":"boolean"},"hijos":{"type":"array","items":{"$ref":"#/components/schemas/Ingrediente"}}}},"ProductoFicha":{"type":"object","required":["id","nombre","nutricion","ingredientes","alergenos"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"nombre":{"type":"string"},"marca":{"oneOf":[{"type":"string"},{"type":"null"}]},"formato":{"oneOf":[{"type":"string"},{"type":"null"}]},"ean":{"oneOf":[{"type":"string"},{"type":"null"}]},"categoria":{"oneOf":[{"$ref":"#/components/schemas/CategoriaRef"},{"type":"null"}]},"precio":{"oneOf":[{"$ref":"#/components/schemas/Precio"},{"type":"null"}]},"nova":{"oneOf":[{"type":"integer","minimum":1,"maximum":4},{"type":"null"}]},"graduacion_alcohol":{"oneOf":[{"type":"number"},{"type":"null"}],"description":"Graduación de las bebidas alcohólicas, en % vol."},"descripcion":{"oneOf":[{"type":"string"},{"type":"null"}]},"denominacion_legal":{"oneOf":[{"type":"string"},{"type":"null"}]},"procedencia":{"oneOf":[{"type":"string"},{"type":"null"}]},"fabricantes":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"conservacion":{"oneOf":[{"type":"string"},{"type":"null"}]},"modo_empleo":{"oneOf":[{"type":"string"},{"type":"null"}]},"tamano":{"type":"object","properties":{"cantidad":{"oneOf":[{"type":"number"},{"type":"null"}]},"unidad":{"oneOf":[{"type":"string"},{"type":"null"}]},"unidades":{"oneOf":[{"type":"integer"},{"type":"null"}]},"peso_escurrido_kg":{"oneOf":[{"type":"number"},{"type":"null"}]},"aproximado":{"type":"boolean"}}},"es_granel":{"type":"boolean"},"nutricion":{"type":"array","items":{"$ref":"#/components/schemas/Nutricion"},"description":"Una entrada por base declarada, cada una con su origen."},"ingredientes":{"type":"array","items":{"$ref":"#/components/schemas/Ingrediente"}},"alergenos":{"type":"array","description":"Una entrada por alérgeno y fuente. Prioridad al resolver: etiqueta > ingredientes > declaracion.","items":{"type":"object","properties":{"alergeno":{"type":"string","enum":["gluten","crustaceos","huevos","pescado","cacahuetes","soja","leche","frutos_de_cascara","apio","mostaza","sesamo","sulfitos","altramuces","moluscos"]},"estado":{"type":"string","enum":["contiene","trazas","libre_de"]},"fuente":{"type":"string","enum":["etiqueta","ingredientes","declaracion"]}}}},"derivados":{"oneOf":[{"type":"object","properties":{"nova":{"oneOf":[{"type":"integer"},{"type":"null"}]},"nova_origen":{"oneOf":[{"type":"string","enum":["regla","modelo","manual"]},{"type":"null"}]},"nova_justificacion":{"oneOf":[{"type":"string"},{"type":"null"}]},"apto_vegano":{"oneOf":[{"type":"boolean"},{"type":"null"}]},"apto_vegetariano":{"oneOf":[{"type":"boolean"},{"type":"null"}]},"sin_gluten_declarado":{"oneOf":[{"type":"boolean"},{"type":"null"}]},"contiene_aceite_palma":{"oneOf":[{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]},"imagenes":{"type":"array","items":{"type":"object","properties":{"rol":{"type":"string"},"grande":{"oneOf":[{"type":"string"},{"type":"null"}]},"media":{"oneOf":[{"type":"string"},{"type":"null"}]},"mini":{"oneOf":[{"type":"string"},{"type":"null"}]}}}}}},"ProductoConIngrediente":{"allOf":[{"$ref":"#/components/schemas/ProductoResumen"},{"type":"object","properties":{"coincidencias":{"type":"array","items":{"type":"string"},"description":"Ruta en el árbol de cada ingrediente que coincide."}}}]},"Categoria":{"type":"object","required":["id","nombre","hijos"],"properties":{"id":{"type":"string","format":"uuid"},"nombre":{"type":"string"},"hijos":{"type":"array","items":{"$ref":"#/components/schemas/Categoria"}}}},"Nutriente":{"type":"object","properties":{"clave":{"type":"string"},"etiqueta":{"type":"string"},"unidad":{"type":"string"},"grupo":{"oneOf":[{"type":"string"},{"type":"null"}]},"productos_con":{"type":"integer"}}},"Estado":{"type":"object","properties":{"ultima_ingesta":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"productos_en_catalogo":{"type":"integer"},"productos_indexados":{"type":"integer"},"cobertura":{"type":"object","properties":{"nutricion_declarada":{"type":"integer"},"nutricion_estimada":{"type":"integer"},"sin_nutricion":{"type":"integer"},"con_ingredientes":{"type":"integer"}}}}},"Uso":{"type":"object","required":["plan","dia","mes"],"properties":{"plan":{"type":"object","properties":{"id":{"type":"string"},"nombre":{"type":"string"},"de_pago":{"type":"boolean"}}},"canal":{"type":"string","enum":["mcp","programatica"],"description":"Tipo de la clave: el MCP puede tener su propia cuota diaria."},"dia":{"$ref":"#/components/schemas/Contador","description":"Cuota diaria de esta clave. Se renueva a medianoche, hora de Madrid."},"mes":{"allOf":[{"$ref":"#/components/schemas/Contador"},{"type":"object","properties":{"excedente_facturado":{"type":"boolean","description":"Pasar de la cuota mensual se factura en vez de cortarse."}}}],"description":"Cuota mensual de toda la cuenta. Se renueva el día 1, hora de Madrid."}}},"Contador":{"type":"object","required":["usadas","limite","restantes","reinicio"],"properties":{"usadas":{"type":"integer"},"limite":{"type":"integer"},"restantes":{"type":"integer"},"reinicio":{"type":"string","format":"date-time"}}},"OpenAPI":{"type":"object"}}}}