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

For example, you send the domains of your trade show contacts to a list. Webmetic adds industry, employee count, and phone number to each row, or closes the row without data.

Lists belong to your account. The API returns the same lists your team sees in the **Enrichment** tab.

Every endpoint needs the Enrichment key, not the Visitor Intelligence key, as described under [Authentication](https://webmetic.de/docs/en/api/authentifizierung).

Enrichment currently costs no credits. For details, see [Credits in the API](https://webmetic.de/docs/en/api/credits).

## List [#list]

A list has no status of its own and is finished when `pending_rows` is 0. How to wait for that is described in [Asynchronous results](https://webmetic.de/docs/en/api/asynchrone-ergebnisse).

| Field | Type | Example | Description |
| --- | --- | --- | --- |
| `id` | `string` | `"6717a3c2e4b0a1f2c3d4e5f6"` | ID of the list, 24 characters |
| `name` | `string` | `"Messe-Kontakte Oktober"` | Name with 1 to 200 characters. Names don't have to be unique |
| `desc` | `string` | `"Gespräche am Messestand"` | Description with up to 1,000 characters, empty if there is none |
| `created_at` | `string` | `"2026-10-22T09:15:04.512000"` | When the list was created, in UTC |
| `updated_at` | `string` | `"2026-10-22T09:15:04.512000"` | Time of the last change, currently the same as `created_at` |
| `total_rows` | `integer` | `120` | All rows in the list |
| `done_rows` | `integer` | `104` | Rows with `done`, shown as **Found** in the dashboard |
| `miss_rows` | `integer` | `16` | Rows with `miss`, shown as **Not found** in the dashboard |
| `pending_rows` | `integer` | `0` | Rows with `pending` or `enriching`, shown as **Pending** in the dashboard |

A new list has 0 in every count. How the API writes timestamps is described in [Date ranges and time zones](https://webmetic.de/docs/en/api/zeitraeume-und-zeitzonen).

You can delete a list only in the dashboard, and you currently can't rename it.

## Row [#row]

A row stands for one domain in a list. Each row starts with six fields of its own, followed by the company's data fields. In `/rows` every row has all fields, and unknown values are `null`.

| Field | Type | Example | Description |
| --- | --- | --- | --- |
| `id` | `string` | `"6717a3c2e4b0a1f2c3d4e601"` | ID of the row, 24 characters |
| `domain` | `string` | `"bergquell.example"` | The shortened domain. If the website redirects to a domain Webmetic already knows, that domain appears here afterwards |
| `status` | `string` | `"done"` | State of the row, see below |
| `src` | `string` or `null` | `"db"` | Where the data comes from: `db` from existing data, `ext` newly gathered, `miss` not found. `null` while the row is open |
| `created_at` | `string` | `"2026-10-22T09:15:09.207000"` | When the row was created, in UTC |
| `enriched_at` | `string` or `null` | `"2026-10-22T09:16:02.418000"` | When the row became `done` or `miss`. `null` before that |

You can edit or remove rows only in the dashboard. Webmetic enriches each row once and doesn't update it afterwards.

### Status [#status]

| `status` | Meaning | In the dashboard |
| --- | --- | --- |
| `pending` | The row is waiting to be processed | **Enriching** |
| `enriching` | Webmetic is enriching the row right now | **Enriching** |
| `done` | Webmetic found data | **Enriched** |
| `miss` | Webmetic found no usable data | **Not found** |

A new row starts as `pending` and changes to `enriching` once Webmetic works on it. It ends up as `done` or `miss`, and both values are final. While Webmetic still has to read the website, a row can go from `enriching` back to `pending`.

Companies Webmetic already knows are finished after about a minute. If Webmetic first has to read the website, it can take hours to a few days.

Because Webmetic writes the data fields in several steps, a row with `enriching` can already be partly filled. A row with `done` can still have fields with `null` if Webmetic doesn't know a value. A row with `miss` keeps the placeholder as its name and the domain. After technical errors it can also carry some data fields.

### Data fields [#data-fields]

The data fields are flat, and every value is a string or `null`. Ranges, industries, and descriptions are always in German, even if your dashboard shows English.

| Field | Type | Example | Description |
| --- | --- | --- | --- |
| `company_name` | `string` or `null` | `"Bergquell Mineralbrunnen GmbH"` | Name of the company. Until data arrives, it holds a placeholder from the domain such as `Bergquell` |
| `company_url` | `string` or `null` | `"bergquell.example"` | Website address without `www.`. After enrichment it is the address the website answers on. This address can therefore contain a subdomain and differ from `domain` |
| `company_logo_url` | `string` or `null` | `"https://logos.docs.example/bergquell.png"` | Address of the logo |
| `industry` | `string` or `null` | `"Industrie & Fertigung"` | Industry as a German label. Several industries are comma-separated, the main one first |
| `nace_codes` | `string` or `null` | `"11.07"` | NACE codes, separated by a comma and a space |
| `wz2025_codes` | `string` or `null` | `"11.07.0"` | WZ 2025 codes, separated like `nace_codes` |
| `employee_count` | `string` or `null` | `"201–500"` | Employee count as a range: `1–10`, `11–50`, `51–200`, `201–500`, `501–1.000`, `1.001–5.000`, `5.001–10.000`, or `10.000+` |
| `revenue` | `string` or `null` | `"50–100 Mio. €"` | Annual revenue as a range, from `< 100 Tsd. €` to `> 500 Mio. €` |
| `address` | `string` or `null` | `"Brunnenweg 4"` | Street and house number |
| `postal_code` | `string` or `null` | `"85354"` | Postal code |
| `city` | `string` or `null` | `"Freising"` | City |
| `country` | `string` or `null` | `"DE"` | Country as a two-letter ISO code. If the country can't be mapped, this holds the name as found |
| `phone_number` | `string` or `null` | `"+49 89 99998214"` | General phone number |
| `fax_number` | `string` or `null` | | Fax number |
| `email_address` | `string` or `null` | `"info@bergquell.example"` | General email address of the company |
| `directors` | `string` or `null` | `"Florian Obermaier"` | Managing directors, comma-separated |
| `organization_type` | `string` or `null` | `"business"` | Type of organization, not the legal form: `business` (company), `academic` (education and research), `government` (public authority), `isp` (internet or hosting provider), or `non_entity` (no organization) |
| `vat_id` | `string` or `null` | `"DE000000000"` | VAT ID |
| `tax_number` | `string` or `null` | `"115/000/00000"` | Tax number |
| `registration_number` | `string` or `null` | `"HRB 000000"` | Commercial register number |
| `registration_court` | `string` or `null` | `"Amtsgericht München"` | Register court |
| `short_description_de` | `string` or `null` | | Short description |
| `full_description_de` | `string` or `null` | | Full description |
| `what_they_do_de` | `string` or `null` | | What the company does |
| `how_they_make_money_de` | `string` or `null` | | Business model |
| `target_audience_de` | `string` or `null` | | Target audience |
| `linkedin`, `facebook`, `instagram`, `youtube`, `twitter` | `string` or `null` | `"https://www.linkedin.com/company/bergquell-mineralbrunnen-example"` | The company's profile on that network. For LinkedIn, company pages only |
| `primary_color`, `secondary_color` | `string` or `null` | `"#1f6feb"` | Main and secondary color from the logo as a hex value |

### Differences from Company [#differences-from-company]

The data fields resemble the [Company](https://webmetic.de/docs/en/api/datenmodell/company) object from Visitor Intelligence, but they have a different, flat shape:

- **Link**: rows have no `company_id`. To join them to visit data, compare `domain` with `company_url` from Company, shortened to the domain without `www.` and subdomain.
- **Ranges**: `employee_count` and `revenue` are strings such as `201–500`, in Company two numbers `[min, max]`.
- **Codes**: `nace_codes` and `wz2025_codes` are comma-separated codes, in Company objects with descriptions.
- **Directors**: `directors` is one string, in Company a list.
- **Country**: `country` is the ISO code, and there is no `country_code` field.
- **Other fields**: scores such as `relevance_score` and English descriptions are missing. In return, `industry` is added.

## Rules for domains [#rules-for-domains]

[`POST /enrichment/lists/{list_id}/domains`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-list-id-domains) takes 1 to 5,000 entries per request. For more domains, send further requests to the same list.

Webmetic shortens every entry to the main domain:

- Webmetic removes the protocol, path, port, `www.`, and subdomains, and writes everything in lowercase.
- From an email address, the part after the @ remains.
- So `https://www.your-website.com/contact`, `shop.your-website.com`, and `info@your-website.com` all become `your-website.com`.
- Because a platform subdomain becomes the platform's domain, enter the company's own domain.

The response with status 202 contains only counts, no rows:

- **`added`**: new rows in the list.
- **`skipped_existing`**: domains already in the list. Webmetic doesn't add them a second time, but the same domain may be in another list.
- **`invalid`**: entries without a domain, for example a company name.

If a domain appears several times in the same request, Webmetic adds it once and doesn't count the repeats.

New lists, new domains, and single lookups only work during the trial and on the Growth and Enterprise plans. Otherwise the API answers with 403 and `PLAN_REQUIRED`.

On Starter and Free you can still read and export lists. The exception is an account that can't use Enrichment at the moment, for example after a cancellation. For such an account, every Enrichment call answers with 403 and `ACCOUNT_NOT_ELIGIBLE`, as described under [Errors](https://webmetic.de/docs/en/api/fehler).

## Pages, filters, and export [#pages-filters-and-export]

`GET /enrichment/lists` and `GET /enrichment/lists/{list_id}/rows` return the newest entries first, page by page with `page` and `page_size`, as described under [Pagination](https://webmetic.de/docs/en/api/paginierung).

The `status` filter takes `pending`, `enriching`, `done`, or `miss`, and `total` then counts only the matching rows. Any other value returns status 422 with `VALIDATION_ERROR`.

[`GET /enrichment/lists/{list_id}/export`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-list-id-export) returns every row of a list in one response as a CSV file. The file is encoded in UTF-8 with a BOM, uses commas as separators, and has German column names such as `Branche` and `Mitarbeiter`.

## Single lookup [#single-lookup]

[`GET /enrichment/company`](https://webmetic.de/docs/en/api/referenz/enrichment/company) returns the same data fields for one domain in the `company` object. Next to it are `"status": "found"` and the shortened `domain`.

Empty fields are left out there instead of being `null`. The `company` object doesn't contain the `id`, `status`, and `src` fields or the timestamps of a row. `industry` there names only the main industry.

If Webmetic knows the domain, the API answers at once. Unknown domains take hours to a few days, as described under [Asynchronous results](https://webmetic.de/docs/en/api/asynchrone-ergebnisse).

If Webmetic cannot read the website or finds no company data there, the API answers with 404 and `"status": "not_found"`.

The single lookup creates no row and doesn't appear in the dashboard.

## Example [#example]

The first example shows a finished list:

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

The second example shows the first page of its rows with `done`, with one row per page:

```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
    }
  ]
}
```

The values are invented, and `bergquell.example` is only an example. The API itself accepts only real domains and counts entries ending in `.example` as `invalid`.

## Used by [#used-by]

- **List endpoints**: [`GET /enrichment/lists`](https://webmetic.de/docs/en/api/referenz/enrichment/lists), [`POST /enrichment/lists`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-post), and [`GET /enrichment/lists/{list_id}`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-list-id)
- **Row endpoints**: [`POST /enrichment/lists/{list_id}/domains`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-list-id-domains), [`GET /enrichment/lists/{list_id}/rows`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-list-id-rows), and [`GET /enrichment/lists/{list_id}/export`](https://webmetic.de/docs/en/api/referenz/enrichment/lists-list-id-export)
- **Single lookup**: [`GET /enrichment/company`](https://webmetic.de/docs/en/api/referenz/enrichment/company) with the same data fields
- **Product pages**: [Enrichment](https://webmetic.de/docs/en/enrichment) and [Results and export](https://webmetic.de/docs/en/enrichment/ergebnisse-und-export) with the same lists in the **Enrichment** tab
- **Webhooks**: [Webhooks](https://webmetic.de/docs/en/api/webhooks) send no Enrichment events
- **AI assistant**: The [AI assistant](https://webmetic.de/docs/en/ki-assistent/tools-und-prompts) has no Enrichment data
