# Enrichment-Liste (https://webmetic.de/docs/api/datenmodell/enrichment-liste)

Ein Beispiel: Sie senden die Domains Ihrer Messekontakte an eine Liste. Webmetic ergänzt jede Zeile um Branche, Mitarbeiterzahl und Telefonnummer oder schließt sie ohne Daten ab.

Listen gehören zu Ihrem Konto. Die API liefert dieselben Listen, die Ihr Team im Tab **Enrichment** sieht.

Alle Endpunkte brauchen den Enrichment-Schlüssel, nicht den Schlüssel für Visitor Intelligence, wie unter [Authentifizierung](https://webmetic.de/docs/api/authentifizierung) beschrieben.

Enrichment kostet derzeit keine Credits. Mehr dazu unter [Credits in der API](https://webmetic.de/docs/api/credits).

## Liste [#liste]

Eine Liste hat keinen eigenen Status und ist fertig, wenn `pending_rows` 0 ist. Wie Sie darauf warten, steht unter [Asynchrone Ergebnisse](https://webmetic.de/docs/api/asynchrone-ergebnisse).

| Feld | Typ | Beispiel | Beschreibung |
| --- | --- | --- | --- |
| `id` | `string` | `"6717a3c2e4b0a1f2c3d4e5f6"` | ID der Liste, 24 Zeichen |
| `name` | `string` | `"Messe-Kontakte Oktober"` | Name mit 1 bis 200 Zeichen. Namen müssen nicht eindeutig sein |
| `desc` | `string` | `"Gespräche am Messestand"` | Beschreibung mit bis zu 1.000 Zeichen, leer ohne Beschreibung |
| `created_at` | `string` | `"2026-10-22T09:15:04.512000"` | Wann die Liste angelegt wurde, in UTC |
| `updated_at` | `string` | `"2026-10-22T09:15:04.512000"` | Zeitpunkt der letzten Änderung, derzeit gleich `created_at` |
| `total_rows` | `integer` | `120` | Alle Zeilen der Liste |
| `done_rows` | `integer` | `104` | Zeilen mit `done`, im Dashboard **Gefunden** |
| `miss_rows` | `integer` | `16` | Zeilen mit `miss`, im Dashboard **Nicht gefunden** |
| `pending_rows` | `integer` | `0` | Zeilen mit `pending` oder `enriching`, im Dashboard **Ausstehend** |

Eine neue Liste hat in allen Zählern 0. Wie die API Zeitangaben schreibt, steht unter [Zeiträume und Zeitzonen](https://webmetic.de/docs/api/zeitraeume-und-zeitzonen).

Sie können eine Liste nur im Dashboard löschen und derzeit nicht umbenennen.

## Zeile [#zeile]

Eine Zeile steht für eine Domain in einer Liste. Jede Zeile beginnt mit sechs eigenen Feldern, auf die die Datenfelder des Unternehmens folgen. In `/rows` hat jede Zeile alle Felder, und unbekannte Werte stehen als `null` darin.

| Feld | Typ | Beispiel | Beschreibung |
| --- | --- | --- | --- |
| `id` | `string` | `"6717a3c2e4b0a1f2c3d4e601"` | ID der Zeile, 24 Zeichen |
| `domain` | `string` | `"bergquell.example"` | Die gekürzte Domain. Wenn die Website auf eine Domain weiterleitet, die Webmetic schon kennt, steht danach diese Domain hier |
| `status` | `string` | `"done"` | Stand der Zeile, siehe unten |
| `src` | `string` oder `null` | `"db"` | Herkunft der Daten: `db` aus vorhandenen Daten, `ext` neu ermittelt, `miss` nicht gefunden. `null`, solange die Zeile offen ist |
| `created_at` | `string` | `"2026-10-22T09:15:09.207000"` | Wann die Zeile angelegt wurde, in UTC |
| `enriched_at` | `string` oder `null` | `"2026-10-22T09:16:02.418000"` | Wann die Zeile `done` oder `miss` wurde. Vorher `null` |

Sie können Zeilen nur im Dashboard ändern oder entfernen. Webmetic reichert jede Zeile einmal an und aktualisiert sie danach nicht.

### Status [#status]

| `status` | Bedeutung | Im Dashboard |
| --- | --- | --- |
| `pending` | Die Zeile wartet auf die Bearbeitung | **Enriching** |
| `enriching` | Webmetic reichert die Zeile gerade an | **Enriching** |
| `done` | Webmetic hat Daten gefunden | **Enriched** |
| `miss` | Webmetic hat keine verwertbaren Daten gefunden | **Nicht gefunden** |

Eine neue Zeile startet als `pending` und wechselt zu `enriching`, sobald Webmetic sie bearbeitet. Am Ende steht `done` oder `miss`, und beide Werte sind endgültig. Solange Webmetic die Website noch lesen muss, kann eine Zeile von `enriching` zurück auf `pending` wechseln.

Unternehmen, die Webmetic schon kennt, sind nach etwa einer Minute fertig. Wenn Webmetic die Website erst lesen muss, kann das Stunden bis einige Tage dauern.

Weil Webmetic die Datenfelder in mehreren Schritten schreibt, kann eine Zeile mit `enriching` schon teilweise gefüllt sein. Auch eine Zeile mit `done` kann Felder mit `null` haben, wenn Webmetic einen Wert nicht kennt. Eine Zeile mit `miss` behält den Platzhalter als Namen und die Domain. Nach technischen Fehlern kann sie auch einige Datenfelder tragen.

### Datenfelder [#datenfelder]

Die Datenfelder sind flach, und jeder Wert ist Text oder `null`. Spannen, Branchen und Beschreibungen sind immer deutsch, auch wenn Ihr Dashboard Englisch zeigt.

| Feld | Typ | Beispiel | Beschreibung |
| --- | --- | --- | --- |
| `company_name` | `string` oder `null` | `"Bergquell Mineralbrunnen GmbH"` | Name des Unternehmens. Bis Daten ankommen, steht hier ein Platzhalter aus der Domain wie `Bergquell` |
| `company_url` | `string` oder `null` | `"bergquell.example"` | Adresse der Website ohne `www.`. Nach dem Anreichern ist es die Adresse, unter der die Website antwortet. Diese Adresse kann deshalb eine Subdomain enthalten und von `domain` abweichen |
| `company_logo_url` | `string` oder `null` | `"https://logos.docs.example/bergquell.png"` | Adresse des Logos |
| `industry` | `string` oder `null` | `"Industrie & Fertigung"` | Branche als deutsche Bezeichnung. Mehrere Branchen stehen kommagetrennt, die wichtigste zuerst |
| `nace_codes` | `string` oder `null` | `"11.07"` | NACE-Codes, getrennt durch Komma und Leerzeichen |
| `wz2025_codes` | `string` oder `null` | `"11.07.0"` | Codes der WZ 2025, getrennt wie `nace_codes` |
| `employee_count` | `string` oder `null` | `"201–500"` | Mitarbeiterzahl als Spanne: `1–10`, `11–50`, `51–200`, `201–500`, `501–1.000`, `1.001–5.000`, `5.001–10.000` oder `10.000+` |
| `revenue` | `string` oder `null` | `"50–100 Mio. €"` | Jahresumsatz als Spanne, von `< 100 Tsd. €` bis `> 500 Mio. €` |
| `address` | `string` oder `null` | `"Brunnenweg 4"` | Straße und Hausnummer |
| `postal_code` | `string` oder `null` | `"85354"` | Postleitzahl |
| `city` | `string` oder `null` | `"Freising"` | Ort |
| `country` | `string` oder `null` | `"DE"` | Land als ISO-Code mit zwei Buchstaben. Wenn sich das Land nicht zuordnen lässt, steht hier der Name wie gefunden |
| `phone_number` | `string` oder `null` | `"+49 89 99998214"` | Allgemeine Telefonnummer |
| `fax_number` | `string` oder `null` | | Faxnummer |
| `email_address` | `string` oder `null` | `"info@bergquell.example"` | Allgemeine E-Mail-Adresse des Unternehmens |
| `directors` | `string` oder `null` | `"Florian Obermaier"` | Geschäftsführung, kommagetrennt |
| `organization_type` | `string` oder `null` | `"business"` | Art der Organisation, keine Rechtsform: `business` (Unternehmen), `academic` (Bildung und Forschung), `government` (Behörde), `isp` (Internet- oder Hosting-Anbieter) oder `non_entity` (keine Organisation) |
| `vat_id` | `string` oder `null` | `"DE000000000"` | Umsatzsteuer-ID |
| `tax_number` | `string` oder `null` | `"115/000/00000"` | Steuernummer |
| `registration_number` | `string` oder `null` | `"HRB 000000"` | Handelsregisternummer |
| `registration_court` | `string` oder `null` | `"Amtsgericht München"` | Registergericht |
| `short_description_de` | `string` oder `null` | | Kurze Beschreibung |
| `full_description_de` | `string` oder `null` | | Ausführliche Beschreibung |
| `what_they_do_de` | `string` oder `null` | | Was das Unternehmen tut |
| `how_they_make_money_de` | `string` oder `null` | | Geschäftsmodell |
| `target_audience_de` | `string` oder `null` | | Zielgruppe |
| `linkedin`, `facebook`, `instagram`, `youtube`, `twitter` | `string` oder `null` | `"https://www.linkedin.com/company/bergquell-mineralbrunnen-example"` | Profil des Unternehmens im jeweiligen Netzwerk. Bei LinkedIn nur Unternehmensseiten |
| `primary_color`, `secondary_color` | `string` oder `null` | `"#1f6feb"` | Haupt- und Zweitfarbe aus dem Logo als Hex-Wert |

### Unterschiede zu Company [#unterschiede-zu-company]

Die Datenfelder ähneln dem Objekt [Company](https://webmetic.de/docs/api/datenmodell/company) aus Visitor Intelligence, haben aber eine andere, flache Form:

- **Verbindung**: Zeilen haben keine `company_id`. Um sie mit Besuchsdaten zu verbinden, vergleichen Sie `domain` mit `company_url` aus Company, gekürzt auf die Domain ohne `www.` und Subdomain.
- **Spannen**: `employee_count` und `revenue` sind Text wie `201–500`, in Company zwei Zahlen `[min, max]`.
- **Codes**: `nace_codes` und `wz2025_codes` sind kommagetrennte Codes, in Company Objekte mit Beschreibungen.
- **Geschäftsführung**: `directors` ist ein Text, in Company eine Liste.
- **Land**: `country` ist der ISO-Code, und ein eigenes Feld `country_code` fehlt.
- **Weitere Felder**: Scores wie `relevance_score` und englische Beschreibungen fehlen. Dafür kommt `industry` hinzu.

## Regeln für Domains [#regeln-für-domains]

[`POST /enrichment/lists/{list_id}/domains`](https://webmetic.de/docs/api/referenz/enrichment/lists-list-id-domains) nimmt 1 bis 5.000 Einträge pro Anfrage an. Für mehr Domains senden Sie weitere Anfragen an dieselbe Liste.

Webmetic kürzt jeden Eintrag auf die Hauptdomain:

- Webmetic entfernt Protokoll, Pfad, Port, `www.` und Subdomains und schreibt alles klein.
- Von einer E-Mail-Adresse bleibt der Teil nach dem @.
- Aus `https://www.ihre-website.de/kontakt`, `shop.ihre-website.de` und `info@ihre-website.de` wird so `ihre-website.de`.
- Weil die Subdomain einer Plattform zur Domain der Plattform wird, geben Sie die eigene Domain des Unternehmens an.

Die Antwort mit Status 202 enthält nur Zähler, keine Zeilen:

- **`added`**: neue Zeilen in der Liste.
- **`skipped_existing`**: Domains, die schon in der Liste stehen. Webmetic legt sie kein zweites Mal an, aber in einer anderen Liste darf dieselbe Domain stehen.
- **`invalid`**: Einträge ohne Domain, zum Beispiel ein Unternehmensname.

Wenn eine Domain in derselben Anfrage mehrmals steht, legt Webmetic sie einmal an und zählt die Wiederholungen nicht.

Neue Listen, neue Domains und Einzelabfragen funktionieren nur in der Testphase und in den Plänen Growth und Enterprise. Sonst antwortet die API mit 403 und `PLAN_REQUIRED`.

In Starter und Free lesen und exportieren Sie bestehende Listen weiter. Die Ausnahme sind Konten, die Enrichment derzeit nicht nutzen können, zum Beispiel nach einer Kündigung. Für diese Konten antwortet jeder Enrichment-Aufruf mit 403 und `ACCOUNT_NOT_ELIGIBLE`, wie unter [Fehler](https://webmetic.de/docs/api/fehler) beschrieben.

## Seiten, Filter und Export [#seiten-filter-und-export]

`GET /enrichment/lists` und `GET /enrichment/lists/{list_id}/rows` liefern die neuesten Einträge zuerst, seitenweise mit `page` und `page_size`, wie unter [Paginierung](https://webmetic.de/docs/api/paginierung) beschrieben.

Der Filter `status` nimmt `pending`, `enriching`, `done` oder `miss` an, und `total` zählt dann nur die passenden Zeilen. Ein anderer Wert ergibt Status 422 mit `VALIDATION_ERROR`.

[`GET /enrichment/lists/{list_id}/export`](https://webmetic.de/docs/api/referenz/enrichment/lists-list-id-export) liefert alle Zeilen einer Liste in einer Antwort als CSV-Datei. Die Datei ist in UTF-8 mit BOM kodiert, trennt mit Komma und hat deutsche Spaltennamen wie `Branche` und `Mitarbeiter`.

## Einzelabfrage [#einzelabfrage]

[`GET /enrichment/company`](https://webmetic.de/docs/api/referenz/enrichment/company) liefert dieselben Datenfelder für eine Domain im Objekt `company`. Daneben stehen `"status": "found"` und die gekürzte `domain`.

Leere Felder fehlen dort ganz, statt `null` zu sein. Das Objekt `company` enthält die Felder `id`, `status`, `src` und die Zeitangaben einer Zeile nicht. `industry` nennt dort nur die wichtigste Branche.

Wenn Webmetic die Domain kennt, antwortet die API sofort. Unbekannte Domains brauchen Stunden bis einige Tage, wie unter [Asynchrone Ergebnisse](https://webmetic.de/docs/api/asynchrone-ergebnisse) beschrieben.

Wenn Webmetic die Website nicht lesen kann oder dort keine Unternehmensdaten findet, antwortet die API mit 404 und `"status": "not_found"`.

Die Einzelabfrage legt keine Zeile an und erscheint nicht im Dashboard.

## Beispiel [#beispiel]

Das erste Beispiel zeigt eine fertige Liste:

```json title="GET /enrichment/lists/6717a3c2e4b0a1f2c3d4e5f6"
{
  "list": {
    "id": "6717a3c2e4b0a1f2c3d4e5f6",
    "name": "Messe-Kontakte Oktober",
    "desc": "Gespräche am Messestand",
    "created_at": "2026-10-22T09:15:04.512000",
    "updated_at": "2026-10-22T09:15:04.512000",
    "total_rows": 120,
    "done_rows": 104,
    "miss_rows": 16,
    "pending_rows": 0
  }
}
```

Das zweite Beispiel zeigt die erste Seite ihrer Zeilen mit `done`, mit einer Zeile pro Seite:

```json title="GET /enrichment/lists/6717a3c2e4b0a1f2c3d4e5f6/rows?status=done&page_size=1"
{
  "rows": [
    {
      "id": "6717a3c2e4b0a1f2c3d4e601",
      "domain": "bergquell.example",
      "status": "done",
      "src": "db",
      "created_at": "2026-10-22T09:15:09.207000",
      "enriched_at": "2026-10-22T09:16:02.418000",
      "company_name": "Bergquell Mineralbrunnen GmbH",
      "company_url": "bergquell.example",
      "company_logo_url": "https://logos.docs.example/bergquell.png",
      "industry": "Industrie & Fertigung",
      "nace_codes": "11.07",
      "employee_count": "201–500",
      "revenue": "50–100 Mio. €",
      "city": "Freising",
      "country": "DE",
      "phone_number": "+49 89 99998214",
      "email_address": "info@bergquell.example",
      "short_description_de": "Mineralbrunnen mit eigener Abfüllung für Mineralwasser und Erfrischungsgetränke.",
      "full_description_de": null,
      "what_they_do_de": null,
      "how_they_make_money_de": null,
      "target_audience_de": null,
      "linkedin": "https://www.linkedin.com/company/bergquell-mineralbrunnen-example",
      "facebook": null,
      "instagram": null,
      "youtube": null,
      "twitter": null,
      "directors": "Florian Obermaier",
      "organization_type": "business",
      "address": "Brunnenweg 4",
      "postal_code": "85354",
      "vat_id": "DE000000000",
      "tax_number": null,
      "registration_number": "HRB 000000",
      "registration_court": "Amtsgericht München",
      "fax_number": null,
      "primary_color": "#1f6feb",
      "secondary_color": null,
      "wz2025_codes": "11.07.0"
    }
  ],
  "total": 104,
  "pagination": [
    {
      "total": 104,
      "page_total": 104,
      "isFirst": true,
      "current": 1,
      "isLast": false,
      "page_size": 1
    }
  ]
}
```

Die Werte sind erfunden, und `bergquell.example` dient nur als Beispiel. Die API selbst nimmt nur echte Domains an und zählt Einträge mit der Endung `.example` als `invalid`.

## Verwendet von [#verwendet-von]

- **Endpunkte für Listen**: [`GET /enrichment/lists`](https://webmetic.de/docs/api/referenz/enrichment/lists), [`POST /enrichment/lists`](https://webmetic.de/docs/api/referenz/enrichment/lists-post) und [`GET /enrichment/lists/{list_id}`](https://webmetic.de/docs/api/referenz/enrichment/lists-list-id)
- **Endpunkte für Zeilen**: [`POST /enrichment/lists/{list_id}/domains`](https://webmetic.de/docs/api/referenz/enrichment/lists-list-id-domains), [`GET /enrichment/lists/{list_id}/rows`](https://webmetic.de/docs/api/referenz/enrichment/lists-list-id-rows) und [`GET /enrichment/lists/{list_id}/export`](https://webmetic.de/docs/api/referenz/enrichment/lists-list-id-export)
- **Einzelabfrage**: [`GET /enrichment/company`](https://webmetic.de/docs/api/referenz/enrichment/company) mit denselben Datenfeldern
- **Produktseiten**: [Enrichment](https://webmetic.de/docs/enrichment) und [Ergebnisse und Export](https://webmetic.de/docs/enrichment/ergebnisse-und-export) mit denselben Listen im Tab **Enrichment**
- **Webhooks**: Die [Webhooks](https://webmetic.de/docs/api/webhooks) senden keine Enrichment-Ereignisse
- **KI-Assistent**: Auch der [KI-Assistent](https://webmetic.de/docs/ki-assistent/tools-und-prompts) liefert keine Enrichment-Daten
