Skip to content

pasco1280/impressum-check

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

impressum-check

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.

License: MIT Node 🇩🇪 Deutsche Version


Why this exists

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:

  1. 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.
  2. Postfach-only address. § 5 DDG requires a ladungsfähige Anschrift. A P.O. box is not.
  3. GmbH/UG without Geschäftsführer or Handelsregister. One of the oldest classics.
  4. No 2nd fast communication channel alongside email (EuGH C-298/07).
  5. 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.

Install

npm install impressum-check

Requires Node 18+. ESM only. TypeScript types included.

Usage

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})`);
  }
}

Or audit raw HTML

import { checkImpressum } from 'impressum-check';

const html = fs.readFileSync('imprint.html', 'utf8');
const result = checkImpressum(html, { isEcommerce: true });

Result shape

{
  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?
  }
}

CLI

node examples/cli-demo.js https://example.de/impressum

Exit codes: 0 compliant · 2 errors present · 1 fetch failure. Useful for CI / nightly client-portfolio audits.

Flags: --journalistic, --reglementiert, --zulassungspflichtig.

n8n nightly audit

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.

What it checks (and what it doesn't)

✅ Checks

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
E-Mail § 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

⚠ Known blind spots

  • 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.

Provenance

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.

Tests

npm test

17 unit tests, Node's built-in test runner, zero dev dependencies.

License

MIT — with explicit liability disclaimer. Lawyers still beat regex.


Built by Pascal Jäger · pascal@wrlz.ai · Heidelberg

About

Audits German website imprints against §5 DDG (ex TMG), §18 MStV, §36 VSBG. Flags missing mandatory fields, Postfach-only addresses and stale EU-ODR links. Zero deps, MIT.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors