# Company Enrichment (`lowlanddata/company-enrichment`) Actor

One list of company names or domains in, a full org-level profile out in one run: website, logo, socials, EU VAT (VIES-validated) and an email-security grade. GDPR-clean, no personal data. Free on no-match.

- **URL**: https://apify.com/lowlanddata/company-enrichment.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 enriched companies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Company Enrichment

You have a list of companies — names, domains, or a messy mix of both — and you
need the full picture on each one: where it lives on the web, what it looks like,
where it is social, whether its VAT id is real, and whether its email can be
spoofed. Doing that means five separate lookups per company, each in a different
tool. This is the one combo that does all five in a single run.

Give it company **names or domains** and each one comes back as a full org-level
profile: website, logo and brand assets, social profiles, EU VAT (validated
against VIES), and an email-security grade. A name is resolved to its domain
first; a domain is enriched directly. It fetches each homepage once and reads
every dimension off it, so five à-la-carte lookups become one run.

This is the front door over the five company-identity primitives — the combo meal
over the ingredients. Its edge over the US-centric incumbents is deliberate:
**EU-first, VAT-validated, and GDPR-clean by construction.** Every field is about
the *organisation*, never a person — no personal names, no personal emails,
LinkedIn *company* pages only and never a `/in/` profile, and the VIES trader name
and address are validated against and thrown away. Only `valid` is kept.

**Live health record:** [lowlanddata.com/status/company-enrichment](https://lowlanddata.com/status/company-enrichment/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/company-enrichment/).

### Quick start (30 seconds)

1. Paste your companies into **companies**, one per line — names, domains, or a
   mix (`Adyen`, `personio.com`, `Back Market`).
2. If they are all from one country, put its two-letter code in **country** (e.g.
   `DE`, `FR`, `BE`) — it makes European companies resolve and VAT-validate far
   more reliably.
3. Leave all four dimensions on for the full profile, or toggle off the ones you
   do not need (**logo**, **socials**, **vat**, **emailSecurity**) to keep the
   rows lean.
4. Click **Start**. Each company comes back as one enriched row.

Filter your results to `status = confirmed` or `given-domain` for the rows you can
trust blindly, and eyeball the `ambiguous` and `unconfirmed` ones.

### What you can build with it

- **Enrich a lead or CRM list in one pass.** You exported 500 company names or
  domains from a conference app, Sales Navigator or a CRM export. Run them through
  once and get website, logo, socials, VAT and email-security back in a single
  dataset — no stitching five tools together.
- **Build EU-first firmographics.** Set the `country` and the national TLDs
  (`colruyt.be`, `doctolib.fr`) resolve and their VAT ids validate where a
  US-centric tool guesses `.com` and skips VAT entirely.
- **Verify EU businesses before you deal with them.** The `vat` field is checked
  against the official VIES register — a `valid: true` is a real, live EU VAT id,
  not a string that merely looks like one.
- **Pre-flight email deliverability and spoofing risk.** The `emailSecurity` grade
  tells you at a glance whether a domain has SPF, DMARC and DKIM in order before
  you send to it — or whether it can be impersonated.
- **Wire it into an automation.** A Make/Zapier/n8n step, or an AI agent, that
  turns each new company name or domain into a full profile the moment it lands.

### What you get

Each company is one row:

```json
{
  "query": "chrono24.de",
  "companyName": null,
  "domain": "chrono24.de",
  "website": "https://chrono24.de",
  "confidence": 1,
  "status": "given-domain",
  "alternativeDomains": [],
  "logo": {
    "iconUrls": ["https://www.chrono24.de/favicon-96x96.png"],
    "faviconUrl": "https://www.chrono24.de/favicon-96x96.png",
    "appleTouchIconUrl": null,
    "ogImageUrl": null,
    "themeColor": null
  },
  "socials": {
    "byPlatform": {
      "linkedin": "https://www.linkedin.com/company/chrono24",
      "instagram": "https://www.instagram.com/chrono24",
      "youtube": "https://www.youtube.com/user/Chrono24",
      "facebook": "https://www.facebook.com/chrono24",
      "tiktok": "https://www.tiktok.com/@chrono24"
    },
    "all": ["..."]
  },
  "vat": { "number": "DE269055220", "valid": true },
  "emailSecurity": {
    "hasMx": true,
    "mxHosts": ["..."],
    "mailProvider": "...",
    "spf": { "present": true, "record": "...", "qualifier": "-" },
    "dmarc": {
      "present": true,
      "policy": "reject",
      "pct": null,
      "aggregateReports": true,
      "record": "..."
    },
    "dkim": { "present": true, "selectors": ["..."] },
    "bimi": false,
    "mtaSts": false,
    "grade": "D"
  },
  "checkedAt": "2026-09-27T12:00:00.000Z"
}
```

Field notes, so you know exactly how much to trust each row:

- `query` is the name or domain you gave, echoed back so you can join the row onto
  your list.
- `companyName` is the name when you gave a name; **`null` when you gave a domain**,
  because there was no name to resolve.
- `domain`, `website` and `confidence` are the resolved company. `confidence` is 0
  to 1, and **`1` whenever you gave a domain directly** — nothing to guess.
- `status` is `confirmed`, `unconfirmed`, `ambiguous`, `no-match`, or
  `given-domain` (you supplied the domain, so it was enriched as-is). A name that
  does not resolve comes back `no-match` with a `null` domain — and a `no-match`
  is **free**. `alternativeDomains` carries the other candidates on an `ambiguous`
  or `unconfirmed` row.
- `logo` is the brand assets read off the homepage: favicon, apple-touch icon,
  og:image and theme colour.
- `socials` is the company's own profiles only — LinkedIn *company* page, X,
  Facebook, Instagram, YouTube, GitHub. **Never a personal profile**, by
  construction.
- `vat` is `{ number, valid }` and nothing else. The EU VAT id is found on the
  legal/imprint page and validated against VIES; the trader name and address VIES
  returns are discarded — only the number and its validity are kept.
- `emailSecurity` grades the domain's email defences (SPF, DMARC, DKIM, MX
  provider, BIMI, MTA-STS) on an A–F scale in `grade`.

Each dimension is `null` when you turned its toggle off, or when nothing was
found. A `no-match` row carries the resolution fields and `null` for all four
dimensions.

### How it enriches a company

For a name, it resolves the domain first — building likely domains from the name
and a country-aware set of TLDs, keeping the ones that resolve in DNS, and
confirming each against the company's own homepage. For a domain, it skips
straight to enrichment. Then it **fetches the homepage once** and reads the logo,
socials and VAT-imprint off that single page, runs a handful of DNS queries for
the email-security grade, and makes one VIES call to validate the VAT id. That is
the whole point of the combo: five separate runs collapse into one fetch per
company.

Well-known companies and any company you supply by domain enrich very reliably.
Ambiguous or generic names are where the `confidence` and `status` fields earn
their keep — read them rather than trusting the top row blindly.

### What does enriching a company cost?

**$0.04 per enriched company** — one flat charge per company that resolved to a
domain (given or found), whatever dimensions it filled. A company that comes back
`no-match` is **free**: you pay only for real profiles, never for the misses. A run
that resolves nothing costs the $0.00005 actor start and nothing else.

- **A 500-company list, ~85% resolving ≈ $17**, once (425 enriched × $0.04).
- Turning a dimension off does not change the price — it is one charge per
  company, not per field.

The price is all-inclusive: platform usage, the homepage fetch, the DNS queries
and the VIES validation are all covered, there is no separate compute bill, and
failed runs are free. The Apify free plan returns a 5-item sample per run, enough
to see the full output shape against your own list before scaling up.

### Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and
follow the conversation:

```text
Help me set up the "Company Enrichment" actor on Apify
(https://apify.com/lowlanddata/company-enrichment). Guide me one step at a time.

What I have: [E.G. "a spreadsheet of 200 German company names and domains I want
enriched with website, logo, socials, VAT and email-security"]

Guide me to:
1. Create a free Apify account (apify.com), open the actor page, and paste my
   company names or domains into the companies field, one per line.
2. Set the country code if my list is all from one country (e.g. DE for Germany),
   so European companies resolve and VAT-validate more reliably.
3. Turn off any dimensions I don't need (logo, socials, vat, emailSecurity), then
   start a run and export the results as CSV or Excel, or read them from the API
   if I write code.
4. Explain the columns — domain, confidence, status, vat, emailSecurity grade —
   so I know which rows I can trust and which to double-check.
5. If it works, remind me to leave a quick rating on the actor page and to report
   anything wrong on its Issues tab.
```

### Input

| Field           | Description                                                                                                                                                       |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `companies`     | The company names or domains to enrich, one per line. A name is resolved to its domain first; a domain (e.g. `adyen.com`) is enriched directly. Required.         |
| `country`       | Optional ISO 3166-1 alpha-2 code (e.g. `DE`, `FR`, `BE`, `US`) applied to every entry. Biases the domain guesses and the expected VAT format toward that country. |
| `logo`          | Include the favicon, apple-touch icon, og:image and theme colour. Boolean, default `true`.                                                                        |
| `socials`       | Include the company's LinkedIn (company page only), X, Facebook, Instagram, YouTube and GitHub links. Boolean, default `true`.                                    |
| `vat`           | Find the EU VAT number on the legal/imprint page and validate it against VIES. Boolean, default `true`.                                                           |
| `emailSecurity` | Grade the domain's email defences (SPF, DMARC, DKIM, MX provider) A–F. Boolean, default `true`.                                                                   |
| `maxItems`      | Stop after this many companies. Default 1000; free-plan runs are capped at 5.                                                                                     |

### Use it from your code

Run it synchronously and read the enriched rows straight back:

```bash
curl -X POST "https://api.apify.com/v2/acts/lowlanddata~company-enrichment/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["Adyen", "personio.com", "Back Market"], "country": "DE"}'
```

Larger lists run better asynchronously: start the run, let the finished-run
webhook fire, then fetch the dataset. Schedules, webhooks and the Make/Zapier/n8n
integrations all apply. This is a standard Apify actor.

### Use it with AI agents (MCP)

Through Apify's hosted MCP server, Claude, Cursor and other MCP-capable agents can
call this as a tool: the agent hands over the companies and reads the enriched
profiles back, no glue code involved.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/company-enrichment"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/company-enrichment
```

**Prefer the à-la-carte primitives?** Point one connector at all five company
tools instead of the combo:

```text
https://mcp.apify.com?actors=lowlanddata/company-domain-finder,lowlanddata/company-logo-finder,lowlanddata/company-socials-finder,lowlanddata/company-vat-finder,lowlanddata/company-email-security
```

Runs bill to the Apify account you sign in with. Per-client setup: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

Prompts that work once connected:

- "Enrich these 40 companies — I've got a mix of names and domains — with website, socials, VAT and email-security, and flag any that didn't resolve."
- "Enrich adyen.com and personio.com, but only the VAT id and the email-security grade."

### Is it legal to enrich a company?

Everything it returns is public commercial information about a business: its
domain and homepage, the brand assets and social links published on that homepage,
its VAT id from the official VIES register, and the public DNS records that carry
its email policy. Nothing gated, nothing personal, nothing bypassed — a handful of
ordinary requests per company, no login, no CAPTCHA.

No personal data enters the output, by construction rather than by setting: there
are no name, email or phone fields to fill, LinkedIn is captured as the *company*
page and never a `/in/` personal profile, and the trader name and address VIES
returns are validated against and discarded. That is what makes the output safe to
store and share, and it is a permanent property of the tool.

### Is there a company enrichment API?

This is one. Send a list of names or domains to `run-sync-get-dataset-items` and
read the full profiles straight back as JSON, or run it on a schedule, or drive it
as an MCP tool. One request replaces the five separate calls — domain, logo,
socials, VAT, email-security — you would otherwise wire together yourself,
pay-per-company, no contract.

### How accurate is it?

Companies you supply by domain enrich exactly as given; well-known names resolve
very reliably. Rather than paper over the ambiguous cases with a single
"98% accurate" number, every row carries its own `confidence` and `status`: a
`confirmed` or `given-domain` row is one you can trust blindly, and an uncertain
one says so and hands you the alternatives. The VAT id is not "probably right" —
it is checked against VIES and marked `valid` or not. You decide the bar instead
of trusting one average that hides the misses.

### How do I enrich a whole list of companies?

Paste the whole list into `companies` (names, domains or both), set the `country`
if they share one, leave the dimensions you want switched on, and run it once.
Export the dataset as CSV/Excel, or read it from the API, then join it back onto
your list on `query`. For a recurring feed — new form fills, new CRM rows — put it
on a Schedule with a Make/Zapier/n8n or webhook step so each new company is
enriched as it arrives.

### FAQ

**Can I give it domains, names, or both?** All three. A domain is enriched
directly (`status: given-domain`, `confidence: 1`); a name is resolved to its
domain first, then enriched. Mix them freely in one list.

**Do I pay for a company that didn't resolve?** No. A name that comes back
`no-match` is free — you pay $0.04 only for companies that resolved to a domain.

**Does it return emails, phone numbers or contact people?** No, and not via any
setting. Every field is organisation-level. Personal data is never collected —
that is what makes the output safe to store and share.

**What exactly is kept from VIES?** Only the VAT `number` and whether it is
`valid`. The trader name and address VIES also returns are discarded and never
written to the dataset.

**Can I run just one dimension?** Yes. Turn off the toggles you do not want; the
row carries only what you asked for and the rest come back `null`. The price is
the same either way — one charge per enriched company.

**Can I export the results to Excel?** Yes: any dataset exports as Excel, CSV,
JSON or XML from the Apify Console or API.

**Why did I only get 5 results?** The Apify free plan caps this actor at a 5-item
sample. Any paid plan lifts the cap to your `maxItems`.

**Can ChatGPT or Claude use it?** Yes: connect it through Apify's MCP server
(section above) and an agent can hand over the companies and read the profiles
back in one conversation.

### The company-identity family

This is the combo — the one run that returns the full org-level profile. Under it
sit five small, composable, GDPR-clean primitives, each doing one job. Reach for
them à la carte when you want a single layer rather than the whole profile:

- [Company Domain Finder](https://apify.com/lowlanddata/company-domain-finder) — a company name to its website domain, with a confidence score.
- [Company Logo & Favicon Finder](https://apify.com/lowlanddata/company-logo-finder) — a domain's favicon, logo and social image.
- [Company Socials Finder](https://apify.com/lowlanddata/company-socials-finder) — a domain's LinkedIn, X, Instagram and more.
- [EU Company VAT Finder](https://apify.com/lowlanddata/company-vat-finder) — the official EU VAT id behind a domain, VIES-validated.
- [Company Email Security Checker](https://apify.com/lowlanddata/company-email-security) — a domain's SPF, DMARC, DKIM and email-spoofing grade.

### Troubleshooting

Failures are loud and named in the run's status message:

- **"Provide at least one company."** `companies` was empty; add at least one name or domain.
- **"country must be an ISO 3166-1 alpha-2 code..."** Use the two-letter code (`DE`, not `Germany`).
- **A row came back `no-match` you expected to resolve.** Check the spelling and set the `country`; the `alternativeDomains` field often holds the domain it saw but could not confirm. Supplying the domain directly enriches it as-is.
- **A dimension is `null` on a resolved row.** Either its toggle was off, or nothing was found — an `emailSecurity` grade always fills for a resolved domain, but a company may simply have no VAT id on its site or no social links.
- **5 results instead of your maxItems**: the free-plan sample cap; a paid Apify plan removes it.

### Support

Enriched a company wrong, or missing something you need? Open a report on the
actor's **Issues tab**; this tool is actively maintained and reports get acted on.

If it earns its keep, a **rating on this page** takes ten seconds, helps the next
buyer find the GDPR-clean option, and tells us which enrichment tool to build next.

# Actor input Schema

## `companies` (type: `array`):

Company names or domains to enrich, one per line. A name is resolved to its domain first; a domain (e.g. adyen.com) is enriched directly. A single entry is a batch of one.

## `country` (type: `string`):

ISO 3166-1 alpha-2 code (e.g. DE, FR, BE, US) applied to every entry. It biases the domain guesses toward that country's TLD and the expected VAT format, so European companies enrich more reliably. Leave empty to guess the common TLDs.

## `logo` (type: `boolean`):

Include the favicon, apple-touch icon, og:image and theme colour.

## `socials` (type: `boolean`):

Include the company's LinkedIn (company page only), X, Facebook, Instagram, YouTube and GitHub links.

## `vat` (type: `boolean`):

Find the EU VAT number on the company's legal/imprint page and validate it against VIES. Only the number and its validity are kept - never the trader's name or address.

## `emailSecurity` (type: `boolean`):

Grade the domain's email defences (SPF, DMARC, DKIM, MX provider) A-F.

## `maxItems` (type: `integer`):

Stop after this many companies. Default 1000; free-plan runs are capped at 5.

## Actor input object example

```json
{
  "companies": [
    "Adyen",
    "personio.com",
    "Back Market"
  ],
  "logo": true,
  "socials": true,
  "vat": true,
  "emailSecurity": true,
  "maxItems": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

One JSON object per company: domain, logo, socials, EU VAT and email-security grade.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "Adyen",
        "personio.com",
        "Back Market"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/company-enrichment").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "Adyen",
        "personio.com",
        "Back Market",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/company-enrichment").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "Adyen",
    "personio.com",
    "Back Market"
  ]
}' |
apify call lowlanddata/company-enrichment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lowlanddata/company-enrichment"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Wbqw6FhWYnZxfWWTc/builds/jsqrbSz77DNdhDzQz/openapi.json
