Enrichment list
An Enrichment list collects domains for which Webmetic adds company data, with one row per domain.
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.
Enrichment currently costs no credits. For details, see Credits in the API.
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.
| 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.
You can delete a list only in the dashboard, and you currently can't rename it.
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 | 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
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
The data fields resemble the Company object from Visitor Intelligence, but they have a different, flat shape:
- Link: rows have no
company_id. To join them to visit data, comparedomainwithcompany_urlfrom Company, shortened to the domain withoutwww.and subdomain. - Ranges:
employee_countandrevenueare strings such as201–500, in Company two numbers[min, max]. - Codes:
nace_codesandwz2025_codesare comma-separated codes, in Company objects with descriptions. - Directors:
directorsis one string, in Company a list. - Country:
countryis the ISO code, and there is nocountry_codefield. - Other fields: scores such as
relevance_scoreand English descriptions are missing. In return,industryis added.
Rules for domains
POST /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, andinfo@your-website.comall becomeyour-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.
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.
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 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
GET /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.
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
The first example shows a finished list:
{
"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:
{
"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
- List endpoints:
GET /enrichment/lists,POST /enrichment/lists, andGET /enrichment/lists/{list_id} - Row endpoints:
POST /enrichment/lists/{list_id}/domains,GET /enrichment/lists/{list_id}/rows, andGET /enrichment/lists/{list_id}/export - Single lookup:
GET /enrichment/companywith the same data fields - Product pages: Enrichment and Results and export with the same lists in the Enrichment tab
- Webhooks: Webhooks send no Enrichment events
- AI assistant: The AI assistant has no Enrichment data