[{"slug":"ZV-2026-1343","server_name":"openfoodfacts.caseyjhand.com","severity":"breaking","title":"openfoodfacts.caseyjhand.com: Type of labels_tag on off_search_products changed string → unset.","summary":"[safe] Description of off_get_product changed (9% word delta). [safe] Description of off_search_products changed (23% word delta). [risky] Optional field exclude_allergens was added to off_search_products; may shift model behaviour. [risky] Optional field exclude_traces was added to off_search_products; may shift model behaviour. [risky] Optional field ingredients_analysis_tag was added to off_search_products; may shift model behaviour. [risky] Optional field traces_tag was added to off_search_products; may shift model behaviour. [breaking] Type of labels_tag on off_search_products changed string → unset. [risky] Field exclusion_coverage was added to off_search_products output. [risky] Field omitted was added to off_search_products output.","changes":[{"kind":"description_changed","tool":"off_get_product","after":"Fetch a packaged food product by barcode (4–40 digits: EAN-13, EAN-8, UPC, and the shorter and longer codes Open Food Facts also holds) from Open Food Facts. Returns the product name, brand, quantity, ingredients (raw text and parsed list), declared allergens, trace allergens the label warns about, additives, the product-level vegan/vegetarian/palm-oil analysis, computed scores (Nutri-Score a–e, NOVA 1–4, Green-Score), nutrition per 100g and per serving, categories, labels, packaging, origins, countries of sale, image URL, and data completeness. Open Food Facts is a crowd-sourced database — a missing field means \"not yet entered by contributors,\" not that the attribute is absent from the actual product. Computed scores carry regional formula caveats and are indicators, not absolute rankings. Data is under ODbL 1.0 — cite Open Food Facts in downstream use.","before":"Fetch a packaged food product by barcode (EAN-13 or UPC) from Open Food Facts. Returns the product name, brand, quantity, ingredients (raw text and parsed list), declared allergens, trace allergens the label warns about, additives, the product-level vegan/vegetarian/palm-oil analysis, computed scores (Nutri-Score a–e, NOVA 1–4, Green-Score), nutrition per 100g and per serving, categories, labels, packaging, origins, countries of sale, image URL, and data completeness. Open Food Facts is a crowd-sourced database — a missing field means \"not yet entered by contributors,\" not that the attribute is absent from the actual product. Computed scores carry regional formula caveats and are indicators, not absolute rankings. Data is under ODbL 1.0 — cite Open Food Facts in downstream use.","detail":"Description of `off_get_product` changed (9% word delta).","severity":"safe","descriptionDelta":0.08999999999999997},{"kind":"description_changed","tool":"off_search_products","after":"Search Open Food Facts by full-text query, structured tag filters, or both at once. Returns a summary list with barcodes, product names, brands, Nutri-Score, NOVA group, and categories — enough for triage and selection, not full label data. Use off_get_product on the returned barcodes for complete details. A text query and tag filters combine: every word of the query must match the product name, generic name, categories, labels, or brand, and every filter provided must hold (e.g. query \"dark chocolate\" with labels_tag \"en:organic\" and countries_tag \"en:france\" returns organic chocolate sold in France); numeric nutrient_filters express per-100 g thresholds such as sugars below 8 g and combine the same way; additives_tag is the one exception, filtering only on searches carrying neither query nor nutrient_filters. Tag filter values are canonical tag IDs (e.g. \"en:organic\", \"en:no-gluten\") — use off_browse_taxonomy to resolve human terms to tag IDs. A case variant, synonym, or singular of a tag is resolved to its canonical ID where Open Food Facts recognizes it; anything else is matched exactly. exclude_allergens and exclude_traces drop products that declare an allergen or a \"may contain\" trace, but a product with no allergen or trace data entered passes them, so confirm a candidate with off_get_product before relying on it. At least one search parameter is required. The two paths read different indexes: a search carrying query is answered by the text index, a snapshot that lags the live database, while a tag-only search reads the live database and is current — so a recently contributed product can be missing from a text search and present in the same search without query. Data is crowd-sourced; result count reflects contributed products, not all products in the market. Data under ODbL 1.0 — cite Open Food Facts in downstream use.","before":"Search Open Food Facts by full-text query, structured tag filters, or both at once. Returns a summary list with barcodes, product names, brands, Nutri-Score, NOVA group, and categories — enough for triage and selection, not full label data. Use off_get_product on the returned barcodes for complete details. A text query and tag filters combine: results match the query text and satisfy every filter provided (e.g. query \"dark chocolate\" with labels_tag \"en:organic\" and countries_tag \"en:france\" returns organic chocolate sold in France); numeric nutrient_filters express per-100 g thresholds such as sugars below 8 g and combine the same way; additives_tag is the one exception, filtering only on searches carrying neither query nor nutrient_filters. Tag filter values must be canonical tag IDs (e.g. \"en:organic\", \"en:no-gluten\") — use off_browse_taxonomy to resolve human terms to tag IDs. At least one search parameter is required. The two paths read different indexes: a search carrying query is answered by the text index, a snapshot that lags the live database, while a tag-only search reads the live database and is current — so a recently contributed product can be missing from a text search and present in the same search without query. Data is crowd-sourced; result count reflects contributed products, not all products in the market. Data under ODbL 1.0 — cite Open Food Facts in downstream use.","detail":"Description of `off_search_products` changed (23% word delta).","severity":"safe","descriptionDelta":0.23295454545454541},{"kind":"input_property_added","path":"inputSchema.properties.exclude_allergens","tool":"off_search_products","after":{"type":"array","items":{"type":"string","description":"One canonical allergen tag ID to exclude, e.g. \"en:nuts\"."},"maxItems":14,"description":"Allergen tag IDs a product must not declare, all applied. Example: [\"en:nuts\", \"en:peanuts\"]. Each value must be an allergen tag Open Food Facts recognizes — resolve it with off_browse_taxonomy facet=\"allergens\" — and one it does not recognize is rejected rather than sent, because it would exclude nothing. A product with no allergen data entered passes an exclusion, so check a candidate with off_get_product before relying on it."},"detail":"Optional field `exclude_allergens` was added to `off_search_products`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.exclude_traces","tool":"off_search_products","after":{"type":"array","items":{"type":"string","description":"One canonical allergen tag ID to exclude as a trace, e.g. \"en:nuts\"."},"maxItems":14,"description":"Allergen tag IDs a product's label must not warn it may contain as traces, all applied. Example: [\"en:nuts\"]. Values are validated like exclude_allergens. A product with no trace data entered passes, so check a candidate with off_get_product before relying on it."},"detail":"Optional field `exclude_traces` was added to `off_search_products`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.ingredients_analysis_tag","tool":"off_search_products","after":{"enum":["en:palm-oil","en:palm-oil-free","en:may-contain-palm-oil","en:palm-oil-content-unknown","en:vegan","en:maybe-vegan","en:non-vegan","en:vegan-status-unknown","en:vegetarian","en:maybe-vegetarian","en:non-vegetarian","en:vegetarian-status-unknown"],"type":"string","description":"Vegan, vegetarian, or palm-oil verdict Open Food Facts computes from the parsed ingredients. Example: \"en:vegan\", \"en:palm-oil-free\". \"en:maybe-vegan\" and \"en:may-contain-palm-oil\" mean the ingredients could not settle it, and the \"-unknown\" values mean no verdict could be computed."},"detail":"Optional field `ingredients_analysis_tag` was added to `off_search_products`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.traces_tag","tool":"off_search_products","after":{"type":"string","description":"Canonical allergen tag ID the label warns the product may contain as a trace (\"may contain nuts\"). Example: \"en:nuts\". Trace tags are allergen tags, so off_browse_taxonomy with facet=\"allergens\" resolves them. Selects products carrying the warning; to leave them out, use exclude_traces."},"detail":"Optional field `traces_tag` was added to `off_search_products`; may shift model behaviour.","severity":"risky"},{"kind":"input_type_changed","path":"inputSchema.properties.labels_tag","tool":"off_search_products","after":"unset","before":"string","detail":"Type of `labels_tag` on `off_search_products` changed string → unset.","severity":"breaking"},{"kind":"output_property_added","path":"outputSchema.properties.exclusion_coverage","tool":"off_search_products","after":{"type":"string","description":"Present only on searches carrying exclude_allergens or exclude_traces. States that products with no allergen or trace data entered pass an exclusion, so a result is not confirmed free of the excluded allergens, and names the off_get_product fields to check."},"detail":"Field `exclusion_coverage` was added to `off_search_products` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.omitted","tool":"off_search_products","after":{"type":"number","description":"Matches on this page left off because Open Food Facts stores them under a code it cannot serve (not 4–40 digits once leading zeros are stripped), so off_get_product could not look them up either. Absent when none was. total still counts them."},"detail":"Field `omitted` was added to `off_search_products` output.","severity":"risky"}],"published_at":"2026-09-23T06:28:13.687Z"}]