Glossary

Domain and technical terms you meet when using lebensmittel. For the option reference see the README and the full cookbook in Usage.md.

The portal

lebensmittelwarnung.de. Germany’s official portal for public product warnings, run by the Bundesamt für Verbraucherschutz und Lebensmittelsicherheit (BVL) together with the sixteen Länder. Each Land’s competent authority publishes its own warnings; the BVL operates the portal and app. It is the single national place where food and consumer-product recalls are announced to the public.

BVL — Bundesamt für Verbraucherschutz und Lebensmittelsicherheit. The federal agency that operates the portal and is the responsible publisher for warnings marked as covering “Deutschland” (nationwide).

Warnings

Warnung / Rückruf (warnings). A public product warning — usually a recall: a notice that a specific product (by name, batch and best-before) may pose a risk and should not be consumed/used. In this CLI each warning is one item of the RSS feed.

Produktbezeichnung / -beschreibung (product, title). The product name as the notice body gives it, e.g. “KIMCHI 300 Gramm”. title is normally the feed item’s own <title>; in September 2026 the portal served every <title> as the unrendered template $esc.escapeXml($cms.oneLineText($m.title)) (real names were back by 2026-10-05), and when it serves one, the CLI takes title from this field. --search (the library’s search option) matches both, with case, umlaut spelling (Käse/Kaese/Kase), ß/ss and accents folded away; it is a substring match, so search a word stem (Tahin for Tahini/Tahina).

Grund der Meldung (reason). The reason the warning was issued, as a category label. On 2026-09-15 the live feed used seven: Allergene (allergens), Fremdkörper (foreign body), Gesundheitsschädliche Substanz (harmful substance), Irreführung und Täuschung (misleading labelling), Krankheitserreger (pathogens such as Listeria or Salmonella, which the feed doesn’t name), Rückstände und Kontaminanten (residues and contaminants) and Sonstige Gründe (other). A warning can carry several, joined with , . The single most useful field for triage.

Hersteller / Inverkehrbringer (manufacturer). The manufacturer or the party that placed the product on the market. The feed embeds the full postal address over several lines; this CLI keeps its line breaks (\n).

Betroffene Bundesländer nach derzeitigem Stand (affectedStates). The list of Länder where the product was distributed as currently known — it is updated over time, and a Land can add or remove itself after publication. Surfaced as a string[]. The --state feed filter selects by this list: a state feed holds the warnings whose affectedStates name that Land, whoever issued them.

Chargennummer / Los-Kennzeichnung (lotNumbers). The batch / lot identifiers of the affected units — the codes on the packaging that tell you whether your item is in scope. A notice for several products or batches often gives one per line; the line breaks are kept (\n).

Haltbarkeit (bestBefore). Durability information — a best-before (Mindesthaltbarkeitsdatum, MHD) or use-by date, again for matching your unit.

Verpackungseinheit (packaging). The packaging unit / size, e.g. “175 Gramm-Packung”.

Bildquelle. The image credit for a product photo (© the manufacturer or an agency). The notice gives one per photo, and they can differ (on 2026-09-26, 6 of 265 warnings had photos from different sources). images pairs each photo URL with its own credit; the generic fields map joins the distinct credits with ; , without saying which photo each belongs to. The images themselves (imageUrls, images) are copyright-protected — see DATA_LICENSE.md.

Product types (--type / types)

The type= feed filter accepts five product-category slugs:

Slug German What it covers
lebensmittel Lebensmittel Food and drink (the bulk of warnings)
kosmetischemittel Kosmetische Mittel Cosmetics
bedarfsgegenstaende Bedarfsgegenstände Consumer goods in food contact / everyday use (packaging, kitchenware, textiles, …)
mittelzumtaetowieren Mittel zum Tätowieren Tattoo inks / agents
babyundkinderprodukte Baby- und Kinderprodukte Baby and children’s products

Federal states (--state / states)

The state= feed filter accepts sixteen Bundesland slugs (lowercase, no spaces or umlauts). Run lebensmittel states for the authoritative list; the mapping is:

Slug Bundesland
badenwuerttemberg Baden-Württemberg
bayern Bayern
berlin Berlin
brandenburg Brandenburg
bremen Bremen
hamburg Hamburg
hessen Hessen
mecklenburgvorpommern Mecklenburg-Vorpommern
niedersachsen Niedersachsen
nordrheinwestfalen Nordrhein-Westfalen
rheinlandpfalz Rheinland-Pfalz
saarland Saarland
sachsen Sachsen
sachsenanhalt Sachsen-Anhalt
schleswigholstein Schleswig-Holstein
thueringen Thüringen

--state filters by the affectedStates distribution list, not by the Land that issued the warning. On 2026-09-15 --state thueringen returned exactly the warnings listing „Thüringen” in affectedStates, and only 4 of those 179 were issued by Thüringen. The feed has no issuer field; the notice URL carries the issuing Land as a code in its folder name (see Usage.md).

Technical terms

RSS 2.0. The XML feed format the portal publishes. Each warning is an <item> with <title>, <link>, <pubDate> and an HTML <description> (in a CDATA section). This CLI parses it with a hand-rolled, dependency-free parser.

pubDate / published. pubDate is the RFC-822 timestamp as served, in German time (“Wed, 8 Jul 2026 16:00:00 +0200”); published is that value normalised to an ISO-8601 UTC string. --since (the library’s since option) filters on it but compares calendar days in German time (Europe/Berlin): a notice stamped 00:00:00 +0200 counts for its own day, although the date part of published is the day before. pubDate is often the time of the last update rather than of first publication (on 2026-09-26, 45 of 265 were more than three days after the notice date in the URL’s folder name, YYMMDD_ or for a few notices YYYYMMDD_), so --since means “published or updated since”.

fields (label→value map). The complete set of <b>Label:</b> value pairs parsed from the description, keyed by the German label (trailing colon stripped). A superset of the typed accessors — anything the CLI doesn’t model first-class is still here.

Log record. Every diagnostic line the CLI writes to stderr: a timestamp, a level (ERROR, WARN, INFO) and a topic lebensmittel.<area>, as text (log4j style) or with --log-format jsonl as one JSON object per line. The areas: cli (usage errors, commander’s messages, unexpected errors, Node’s own process warnings), api (the feed’s answers and the notes on them: an error status, the 3xx hint, a malformed answer — the HTML shell, an empty body, no RSS —, the missing-label warning, the --since note), http (the connection, the size-cap hint, the cleartext warning, one WARN per retry before it waits) and output (the -o file and a failed write to stdout). A record is always one line; control characters in it are escaped.

Legacy JSON API (defunct). The old megov.bayern.de JSON API (documented in the bundesAPI / bund.dev project) that used to serve this data. It has returned an empty body since the portal relaunch and is not used — this CLI wraps the RSS feeds. See DEVELOPING.md.

View the source on GitHub →