Audits a German website imprint against § 5 DDG (ex § 5 TMG), § 18 MStV, § 36 VSBG and the Art. 14 ODR-VO aftermath. Flags missing fields,
Postfach-only addresses and stale EU-ODR links (the platform was shut down 2025-07-20). Pure regex + heuristics, zero runtime deps.
Every week a German small business gets an Abmahnung — typically 1.000–3.000 € in legal fees plus a cease-and-desist with a 5.000 €+ contractual penalty per future violation — because their Impressum is missing one field. The most common culprits in 2026:
- Stale EU-ODR link. The EU Online Dispute Resolution platform was shut down on 2025-07-20, but thousands of imprints still link to it. That link is now misleading → abmahnfähig.
- Postfach-only address. § 5 DDG requires a ladungsfähige Anschrift. A P.O. box is not.
- GmbH/UG without Geschäftsführer or Handelsregister. One of the oldest classics.
- No 2nd fast communication channel alongside email (EuGH C-298/07).
- Missing VSBG statement for consumer-facing businesses.
This library runs a single URL (or raw HTML) through a rule-set derived directly from the Gesetze-im-Internet primary source and returns structured errors / warnings. It is not a replacement for a lawyer — but it catches the 80 % of dumb preventable mistakes before your competitor's lawyer does.
npm install impressum-checkRequires Node 18+. ESM only. TypeScript types included.
import { fetchAndCheck } from 'impressum-check';
const result = await fetchAndCheck('https://example.de/impressum', {
isEcommerce: true, // default true — adds VSBG + ODR checks
isJournalistic: false, // adds § 18 MStV V.i.S.d.P. check
isReglementiert: false, // adds Kammer + Berufsbezeichnung check
isZulassungspflichtig: false, // adds Aufsichtsbehörde check
});
if (!result.compliant) {
for (const err of result.errors) {
console.error(`[${err.code}] ${err.message} (${err.basis})`);
}
}import { checkImpressum } from 'impressum-check';
const html = fs.readFileSync('imprint.html', 'utf8');
const result = checkImpressum(html, { isEcommerce: true });{
compliant: boolean,
errors: Array<{ code, message, basis }>, // § violations
warnings: Array<{ code, message, basis }>, // likely-problems
info: Array<{ code, message }>, // best-practice notes
detected: {
legalForm, // e.g. "GmbH & Co. KG" or null
emails, // string[]
hasPhone, // boolean
address: { streets, plzs },
registerNumbers, // e.g. ["HRB 12345"]
ustid, // e.g. "DE123456789" or null
hasVertretung, // Geschäftsführer / Vorstand detected?
}
}node examples/cli-demo.js https://example.de/impressumExit codes: 0 compliant · 2 errors present · 1 fetch failure. Useful for CI / nightly client-portfolio audits.
Flags: --journalistic, --reglementiert, --zulassungspflichtig.
See examples/n8n-code-node.js — drop it in a Code node after a Supabase/Airtable "list of client URLs" trigger, route items with status_for_alert === 'alert' to a Telegram/Slack sink. One workflow audits dozens of client imprints in 30 seconds per night.
| Rule | Basis | Condition |
|---|---|---|
| ladungsfähige Anschrift | § 5 Abs. 1 Nr. 1 DDG | always |
| PLZ + Ort | § 5 Abs. 1 Nr. 1 DDG | always |
| Postfach-only → error | § 5 Abs. 1 Nr. 1 DDG | always |
| Vertretungsberechtigte | § 5 Abs. 1 Nr. 1 DDG | if legal form detected |
| § 5 Abs. 1 Nr. 2 DDG | always | |
| 2nd fast contact | EuGH C-298/07 | warning if only email |
| Handelsregister + Gericht | § 5 Abs. 1 Nr. 4 DDG | if registerpflichtig |
| USt-IdNr. Label | § 5 Abs. 1 Nr. 6 DDG | warning if number w/o label |
| V.i.S.d.P. | § 18 MStV | if isJournalistic |
| Kammer | § 5 Abs. 1 Nr. 5 DDG | if isReglementiert |
| Aufsichtsbehörde | § 5 Abs. 1 Nr. 3 DDG | if isZulassungspflichtig |
| VSBG statement | § 36 VSBG | warning if e-commerce |
| stale EU-ODR link | Art. 14 ODR-VO (Plattform shut down 2025-07-20) | always |
- Cannot detect whether a business is actually reglementiert, journalistic or a 10+ employee shop — those need flags.
- Regex-based address detection may miss rare forms ("Im Winkel 3", non-"straße" endings beyond the common set).
- Does not verify that a USt-IdNr. is valid — only that one is present and formatted correctly.
- Does not crawl the site to find the Impressum page — pass the URL directly, or use your own crawler.
- AGB, Widerrufsbelehrung, DSGVO Art. 13 privacy notice are out of scope.
These rules are derived from the primary source (gesetze-im-internet.de/ddg/__5.html as of April 2026) plus relevant case law. Built by WRLZ.AI — an automation agency that audits imprints for its clients as part of its compliance automation practice. More: wrlz.ai.
npm test17 unit tests, Node's built-in test runner, zero dev dependencies.
MIT — with explicit liability disclaimer. Lawyers still beat regex.
Built by Pascal Jäger · pascal@wrlz.ai · Heidelberg