# Company Enrichment by Domain or Name (Company 360) (`locaihost/company-enrichment`) Actor

Enrich company domains or names into one row each: firmographics, traffic, tech stack, hiring, reviews, ads, SEC numbers, LEI, sanctions flag and decision-makers with work emails. Every field shows its source and confidence. Monitor mode reports weekly changes. Not-found rows are free.

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

## Pricing

from $3.30 / 1,000 company (basic)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 by Domain or Name (Company 360)

Give it website domains or company names and get one row per company from about 20 public sources. A row covers firmographics, web traffic, tech stack, hiring, reviews, ads, revenue, compliance and decision-makers with work emails. Every fact says where it came from and how sure we are. Companies we can't find cost nothing.

What people use it for:

- Researching an account before a call: size, HQ, tech, open jobs, reviews and recent news in one row.
- Scoring a lead list: describe your ideal customer and every company gets an `icpScore` from 0 to 100, with the reasons.
- Reaching the right person: up to 5 decision-makers per company, with the work email the company publishes or one built from its own email format.
- Filling a CRM: HubSpot and Salesforce views and CSV files that use their field names.
- Watching a list: monitor mode tells you each week what changed in jobs, tech, pricing, ratings and ads.

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{
    "companies": ["zapier.com", "monzo.com", { "name": "Gymshark", "country": "GB" }]
}
```

You get 3 rows, usually in under a minute. A domain is the fastest and surest input; a name works too (see [How a name becomes a website](#how-a-name-becomes-a-website)). Add `"depth": "basic"` for the faster, cheaper read.

### One row (made-up company, shortened)

```json
{
    "type": "company",
    "input": "acme.com",
    "status": "found",
    "domain": "acme.com",
    "website": "https://www.acme.com/",
    "name": "Acme",
    "legalName": "Acme Ltd",
    "country": "GB",
    "description": "Acme makes stock-control software for independent shops.",
    "firmographics": {
        "industry": "Software Development",
        "employeesRange": "51-200",
        "employeesOnLinkedIn": 134,
        "foundedYear": 2014,
        "hq": { "city": "Manchester", "region": "England", "country": "GB" },
        "isPublic": false,
        "registryStatus": "ACTIVE"
    },
    "contact": { "phone": "+44 161 000 0000", "roleEmails": ["hello@acme.com", "sales@acme.com"], "careersUrl": "https://www.acme.com/careers" },
    "web": { "monthlyVisits": 182000, "globalRank": 211400, "topCountries": ["GB", "US", "IE"], "estimatesBy": "Similarweb" },
    "tech": { "cms": "Webflow", "emailProvider": "Google Workspace", "dmarcPolicy": "reject", "cdn": "Cloudflare" },
    "hiring": { "openJobs": 14, "byDepartment": { "Engineering": 8, "Sales": 4, "Customer": 2 }, "byCountry": { "GB": 11, "IE": 3 }, "remoteShare": 0.36, "atsPlatform": "Ashby" },
    "reputation": { "trustpilot": { "rating": 4.6, "reviews": 812, "replyRate": 0.91, "url": "https://www.trustpilot.com/review/acme.com" }, "overallRating": 4.6 },
    "pricing": { "plans": [{ "name": "Starter", "price": 29, "period": "month" }, { "name": "Growth", "price": 79, "period": "month" }], "hasFreeTrial": true, "contactSales": true },
    "revenueBand": { "label": "$10M–$50M", "source": "estimate", "confidence": "low" },
    "emailInfo": {
        "emailFormat": { "pattern": "{first}.{last}", "example": "jane.doe@acme.com", "confidence": 0.9, "samples": 4 },
        "formatSource": "company website (4 examples)",
        "mailProvider": "Google Workspace",
        "dmarcPolicy": "reject",
        "catchAll": null
    },
    "people": [
        { "name": "Jane Doe", "title": "Chief Executive Officer", "seniority": "c-level", "department": "Executive", "source": "website", "sourceUrl": "https://www.acme.com/about/team", "workEmail": "jane.doe@acme.com", "emailStatus": "published", "emailConfidence": 1 },
        { "name": "John Doe", "title": "Head of Sales", "seniority": "head", "department": "Sales", "source": "website", "sourceUrl": "https://www.acme.com/about/team", "workEmail": "john.doe@acme.com", "emailStatus": "pattern-unverified", "emailConfidence": 0.9, "formatSource": "company website (4 examples)" }
    ],
    "signals": [{ "key": "sponsors-visas", "label": "Sponsors visas", "reason": "UK sponsor licence" }],
    "links": [{ "site": "trustpilot", "url": "https://www.trustpilot.com/review/acme.com", "confidence": 0.95, "evidence": "its page names acme.com" }],
    "rejected": [{ "site": "linkedin", "url": "https://www.linkedin.com/company/acme-widgets", "confidence": 0.2, "why": "its page names a different website (acmewidgets.com)" }],
    "sourcesChecked": { "site": "found", "dns": "found", "jobs": "found", "trustpilot": "found", "sec": "not-found", "g2": "skipped" },
    "fieldSources": { "firmographics.employeesRange": { "source": "linkedin", "url": "https://www.linkedin.com/company/acme", "fetchedAt": "2026-11-04T09:12:31.000Z", "confidence": 0.95 } }
}
```

A field is `null` (or an empty list) when a source had nothing; the reason is in `sourcesChecked` and `sourceNotes`. We never fill a gap with a guess.

### What you get

Sections marked *full* need `"depth": "full"` (the default).

#### Identity

Name, registered name, country, logo, description and website, from the company's own site and GLEIF. `input` echoes what you typed; `status` is `found`, `partial`, `not-found` or `invalid`.

#### Firmographics

Founded year, HQ (city, region, country), public or private, ticker, LEI and registry status, from the website, GLEIF and SEC EDGAR.

Official company registries (UK, France, Norway, Singapore, GLEIF) through the Open Company Graph: the company's record in its own national register (`firmographics.registry`: registered number, legal name, status, incorporation date, industry codes, registered city and postcode, LEI where it has one, a link to the official record, and whether it was matched by the website or by name). It fills the founded year and registry status when nothing else states them, and covers companies with no LEI. Organisations only: no officers or owners. *Full:* employee band, the member count LinkedIn shows, industry, specialities and LinkedIn HQ, from the company's LinkedIn page (company data only). Corporate family (`family`): `parent`, `ultimateParent`, up to 50 `subsidiaries`, `subsidiaryCount` and `familySize`, from the Open Company Graph's ownership links (GLEIF relationship data, UK companies that own other companies on the Companies House PSC register, and SEC 10-K Exhibit 21 subsidiary lists), with GLEIF filling any gap. It works for companies with no LEI too. Companies only: when the owners are individuals, `missingParentReason` says so in plain words ("no parent company: controlled by individuals or a state, per GLEIF") and never names them. `fieldSources` says which source each family field came from. Google Maps places that are the company's (`locations`: count and cities), *full*.

#### Web

*Full:* monthly visits, 3-month trend, global and country rank, top countries, traffic channels, AI chatbot share and bounce rate. These are Similarweb estimates and labelled as such (`estimatesBy`).

#### Tech

Technologies on the homepage, headers and DNS (up to 150, with category, version where the page shows it, and what matched), CMS, e-commerce platform, analytics, CDN, hosting, TLS issuer, domain age and registrar. Blog and changelog cadence (`content`, `productUpdates`: posts per month over 6 months, last post) and the GitHub organisation the website links to (`openSource`: repos, stars, activity, languages).

#### Hiring

Open jobs by department and country, remote share, advertised pay bands and the jobs platform, from Greenhouse, Lever, Ashby, Personio and Teamtailor public boards. `hiringIntel`: jobs posted in 7 and 30 days, seniority mix, trending roles, new locations and the tech named in ads. Visa sponsorship: US H-1B and PERM filings over the last 3 fiscal years (US Department of Labor) and the UK sponsor licence (UK Home Office register).

#### Reputation

Trustpilot and Sitejabber rating, review count and reply rate. *Full:* the Google Maps rating of the main place (counted only when its website is the company's). `overallRating` is weighted by review count. The **review insights** add-on (`includeReviewInsights`) gives the top complaint and praise phrases, a 4-quarter rating trend and the reply rate from up to 100 recent reviews: phrases and counts only, never review text or reviewer names.

#### Marketing

Google ads seen and when (Ads Transparency Centre), the official social accounts the company links to, YouTube subscribers, Instagram followers, and mobile apps with ratings (App Store, Google Play). `socialActivity`: last post, posts per month, engagement rate and average views on its own YouTube and Instagram. `pricing`: plans, prices, billing period, free plan or trial and "contact sales", from its own pricing page. `customers` and `integrations`: named logos and partners from its own pages. `news`: headlines from the last 90 days (Google News). *Full:* whether Meta ads are running and how many, by platform; LinkedIn ad count and formats; up to 10 `competitors` named in "alternatives" search results.

#### Money and public sector

Latest annual revenue and net income for US-listed companies (SEC EDGAR), Form D raises, UK public contracts won (Contracts Finder) and US federal contract awards over 3 years (`usFederal`: count, value, top agencies, from USAspending.gov). `revenueBand` is the revenue a filing states, or a labelled estimate (`source: "estimate"`, `confidence: "low"`, with the method).

#### Compliance

LEI, entity status, registry number, and an entity-only sanctions screen (OFAC, UK FCDO, EU lists; organisations, never people). `certifications`: SOC 2, ISO 27001, GDPR, PCI DSS and so on **as the company lists them**, with the page it says so on.

#### Signals

Plain-English flags worth acting on, each with its numbers: raised money (Form D in 90 days), won a public contract, sponsors visas, running ads, in the news (3+ headlines in 30 days), shipping fast (4+ product updates a month), hiring (25+ open jobs), traffic up or down 25% over 3 months. Monitor mode adds the change signals (see [Monitor mode](#monitor-mode-what-changed-since-last-time)).

#### Decision-makers and work emails

Up to 5 decision-makers per company (`maxPeoplePerCompany`, up to 25), most senior first, from the company's own team, leadership and about pages and, for US-listed companies, the officers named in its own SEC filings. Each person has:

- `name`, `title`, `seniority` (c-level, founder, vp, director, head, manager) and `department`;
- `source` (`website` or `sec`) and `sourceUrl`, the page or filing they came from;
- `workEmail` with `emailStatus`: `published` when the company prints that address for that person, or `pattern-unverified` when we built it from the company's email format (for example `{first}.{last}`), with `emailConfidence` and `formatSource`;
- `workPhone`, only when the company prints a number in that person's own entry (never the switchboard);
- `linkedinUrl`, only when the company's own page links to it.

Filters: `peopleSeniority`, `departments`, and `excludeEuUk` (no people for companies based in the EU, EEA or UK). Set `includePeople` to false to leave people out. A person without a work email is still listed, and is free.

#### Email checks

Every row gets `emailInfo`: the company's email format with a placeholder example (`jane.doe@acme.com`), where the format came from (`formatSource`), the domains it sends mail from, its mail provider, whether it accepts mail, DMARC, SPF, BIMI and its published role addresses (info@, sales@). The format is learned from named addresses on the company's own pages in this run (team, privacy, imprint, press and contact pages and `security.txt`), or, when its pages show none today, from archived copies of its public pages (`web archive (6 examples)`). We keep only the format and counts from archives, never the addresses.

Two more modes use the same engine:

- **Find work emails** (`"mode": "findEmails"`): give `people` as `[{"name": "Jane Doe", "domain": "acme.com"}]` (or `"company": "Acme"` instead of the domain). Each gets `workEmail`, `emailStatus` (`published`, `pattern-unverified` or `not-found`), the `pattern` used with its `formatSource`, `confidence` and `mailProvider`. A personal mail domain is refused and nothing is built.
- **Check email addresses** (`"mode": "verifyEmails"`): give `emails`. Each gets a syntax check, `isRole`, `isDisposable`, `isPersonalDomain`, its mail servers (`mx`) and `mailProvider`. `status` is `invalid` (bad syntax, or the domain takes no mail), `disposable`, `personal-domain` (not checked, free) or `unknown` (the domain takes mail; the mailbox itself was not checked).

#### On every row

- `fieldSources`: for each filled field, the source, the page, when it was read and a confidence from 0 to 1;
- `links`: every matched account or record, with the evidence that ties it to the company;
- `rejected`: the near-misses we did not use, and why;
- `sourcesChecked`: what each source said (`found`, `not-found`, `blocked`, `unavailable`, `skipped`), with notes in `sourceNotes`;
- `icpScore` and `icpReasons`, when you give an `icp` (industries, countries, employee range, required or ruled-out tech, minimum traffic).

### How a name becomes a website

A matched account or record is used only when one of these holds:

1. **It links back.** The profile or record names the company's website (confidence 0.95).
2. **The company links to it.** The company's own website links to that account (0.9).
3. **Name and place agree.** The names match and so does the country (0.75). For a one-word ordinary name such as "Tally" or "Close", the city or the registered name has to agree too.

Anything weaker goes to `rejected`, never into the row. A name with no domain is matched to a website only when that site's own homepage shows the name and something else ties it to the company: Google's results, its country's web address, or its registered name or number on the page. When nothing does, the row is `not-found` and free. `"Monzo"` works; `{"name": "Sage", "country": "GB"}` works better; for ordinary-word names, give the domain.

On a 40-company benchmark checked by hand (4 Nov 2026), 99.2% of matched identities (website, socials, Trustpilot, ticker, LEI, jobs board) were correct; the one miss was a disputed case.

### Depth: basic or full

| | Basic (`"depth": "basic"`) | Full (default) |
|---|---|---|
| What it reads | Everything a plain web request reaches: website, DNS, jobs, visa filings, Trustpilot, Sitejabber, Google ads, YouTube, Instagram, apps, SEC, Form D, GLEIF, official company registries, UK contracts and the intelligence sections | Basic, plus traffic estimates, the LinkedIn company page, Google Maps, Meta and LinkedIn ads and competitors |
| Time | About 10 seconds a company | Up to 30 seconds a company |
| Price | $6 per 1,000 | $25 per 1,000, but only when a full-depth source returned data; otherwise the row is charged at basic |

Several companies are read at once (`concurrency`, default 6). Pick fewer `sections` or `sources` for a faster run.

### CSV, Google Sheet and CRM files

Put a public CSV link, or a Google Sheet shared as "anyone with the link", in **Or a CSV file / Google Sheet**. Columns are found by their headers: domain (or website, url), company (or name), country.

The run also saves `HUBSPOT.csv` and `SALESFORCE.csv` in its key-value store, with HubSpot company property names and Salesforce Account field names, and the dataset has HubSpot and Salesforce views. Only stated values go in: we never fill in an employee count or a revenue figure we didn't read.

### Monitor mode: what changed since last time

Set **Mode** to `monitor` and give the list a **Watch list name** (for example `competitors`). The first run saves a baseline. Each later run with the same name compares every company with its own last snapshot, so a weekly schedule gives you a list of what moved:

- `monitorStatus`: `first-run` (baseline saved), `changed`, `unchanged`, or `not-read` (the company could not be read this time: free, and its snapshot is kept);
- `changes`: field, old value, new value and the date of the snapshot it was compared with; lists give `added` and `removed`;
- `signals`: hiring fast or slowed, hiring in a new country, new ads, rating dropped, tech stack changed, pricing changed, new integrations or customer logos, website redesigned, new parent company (the ultimate parent changed), group growing (3 or more new subsidiaries);
- `changedSince` and `snapshotAt`: when the compared snapshot was taken;
- `stale`: fields this run could not read, or that came back empty for the first time. Their last values are kept and are never reported as changes.

Turn on **Charge only changed companies** (`onlyChanged`) and an unchanged company costs nothing: you get a short row saying it is unchanged and since when. Different watch names are kept apart, so one account can watch several lists. For a ready-made weekly set-up with the change thresholds spelled out, use [Company Change Monitor](https://apify.com/locaihost/company-change-monitor).

### Price

Pay per result, nothing per run. Prices per 1,000 on the Starter tier; Scale pays 25% less and Business 45% less.

| Event | When it is charged | Price per 1,000 |
|---|---|---|
| `company-basic` | A company found or partly found, basic sources only | $6 |
| `company-full` | A company where a full-depth source returned data (charged instead of basic) | $25 |
| `company-update` | A company checked in monitor mode: first run, changed, or unchanged with `onlyChanged` off (full-depth monitor rows are charged `company-full`) | $6 |
| `name-lookup` | Add-on: a company given by name only that needed a web search to find its website | $4 |
| `review-insights` | Add-on, only with `includeReviewInsights`: a company that has review insights | $3 |
| `contact` | A person in a company row who has a work email | $5 |
| `email-found` | A work email found in `findEmails` mode | $3 |
| `email-verified` | An address checked in `verifyEmails` mode | $1 |
| `apify-actor-start` | Once per run | $0.05 (so $0.00005 a run) |

**Free:** not-found and invalid rows, companies given by domain (no `name-lookup`), unchanged companies in monitor mode with `onlyChanged` on, people without a work email, emails not found, and addresses with bad syntax or a personal mail domain.

Example: 1,000 domains at basic depth with people off costs $6. The same list at full depth with up to 5 people each, where 2 per company have a work email, costs at most $25 + $10 = $35.

### Limits, stated up front

- **Work contacts only.** People come with the business details their company publishes: name, title, work email, and a work phone only where the company prints one for them. Never personal emails (Gmail, Outlook.com, Yahoo and the like), personal mobiles, home addresses, personal social profiles or domain registrant details.
- **Work emails need a known format.** A built address appears only when the company's own pages (or archived copies of them) show its email format. We don't check mailboxes, so no address is ever marked verified and `catchAll` stays empty.
- **Logged-out, public data only.** We never log in.
- **Coverage varies by company.** On the 40-company benchmark at full depth, the share of rows with data was: website 95%, tech 95%, Trustpilot 80%, social activity 80%, traffic 70%, industry 70%, LinkedIn employee band 65%, Google Maps 65%, open jobs 45%, pricing plans 45%, news 40%, named customers 35%, registry 35%, visa filings 25%, SEC 10%. Small and private companies have less.
- **Trustpilot** shows a visitor check to plain web requests. At full depth we pass it as a logged-out visitor through a real browser. At basic depth a refused page says `blocked` and, if Sitejabber shows the Trustpilot rating, we use that copy and say where it came from.
- **G2 and Capterra** are not read in this version: their pages refuse requests from cloud servers. They show as `skipped` and never make a row `partial`.
- **`partial`** means a source we expected ran out of time; its section is empty and `sourceNotes` says which. A source that refuses says `blocked`; one that is down or too slow (USAspending can take 20 seconds or more) says `unavailable`.
- **Estimates are labelled.** Traffic numbers are Similarweb's estimates. A revenue band without a filing behind it says `source: "estimate"` and `confidence: "low"`. Neither is ever shown as a fact.
- **Some sources refuse sometimes.** LinkedIn, Meta and Google may ask for a login or rate-limit; that source then says `blocked` or `unavailable` for that company and the rest of the row is unaffected.
- A company's own site sometimes refuses automated visits. Its row then has less, and `sourcesChecked` says why.

### FAQ

#### How much does company enrichment cost?

$6 per 1,000 companies at basic depth, $25 per 1,000 at full depth, plus $5 per 1,000 people with a work email. Companies we can't find are free. See [Price](#price).

#### Can I give company names instead of domains?

Yes. Add the country for common names (`{"name": "Sage", "country": "GB"}`). A name that needs a web search to find its website adds $4 per 1,000. If we can't tie a website to the name, the row is `not-found` and free.

#### Are the work emails verified?

No mailbox is checked. `published` addresses are printed by the company for that person. `pattern-unverified` addresses are built from the company's own email format, with a confidence for how consistent that format is.

#### Can I use it through the API, from Python or from an AI agent?

Yes. Call it like any Apify Actor through the [Apify API](https://docs.apify.com/api/v2) or the [Python client](https://docs.apify.com/api/client/python), connect it to Zapier, Make or n8n, or use it from an AI assistant through [Apify's MCP server](https://docs.apify.com/platform/integrations/mcp): one tool call returns the whole row.

#### Why are some fields empty?

The source had nothing, refused this time, or wasn't asked for. `sourcesChecked` and `sourceNotes` say which, per company.

#### Can I track changes over time?

Yes: monitor mode, above, or the [Company Change Monitor](https://apify.com/locaihost/company-change-monitor).

### Lawful use

Use the data lawfully: for B2B research, account planning and compliance checks. The buyer controls the data and is responsible for using it under the laws that apply to them and to the people they contact, including privacy and marketing rules.

### Removal requests

Anyone can ask to be left out. Email apify@locaihost.org with the work email address, or the name and company, that should be removed. A whole company can also ask for its people to be left out. We add each request to our removal list the same day, and every run checks that list before anything is stored or charged. You don't need to give a reason.

Did it help? A rating helps others find it.

Questions or a correction: apify@locaihost.org

# Changelog

This Actor's version history is a separate document: https://apify.com/locaihost/company-enrichment/changelog.md

# Actor input Schema

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

A website domain ("stripe.com"), a website address, or a company name ("Monzo"). A name is matched to its website first, and only a website whose own homepage names the company is used. For several companies with the same name, add the country as an object: {"name": "Sage", "country": "GB"}, or give the domain too: {"domain": "sage.com", "name": "Sage"}.

## `companiesFile` (type: `string`):

A public CSV link, a Google Sheet shared as "anyone with the link", or the key of a CSV in this run's key-value store. Columns are found by their header: domain (or website, url), company (or name) and country. Its companies are added to the list above.

## `depth` (type: `string`):

Basic reads the sources a plain web request can reach (about 10 seconds a company). Full adds website traffic estimates, the LinkedIn company page (employee band, industry), Google Maps (rating, locations), Meta and LinkedIn ad counts and the competitors section (up to 30 seconds a company). Basic rows cost $6 per 1,000; a row is charged the full price ($25 per 1,000) only when a full-depth source returned data. G2 and Capterra are not read in this version.

## `sources` (type: `array`):

Leave empty for all. Basic: site, dns, jobs, visa, trustpilot, sitejabber, googleAds, youtube, instagram, apps, sec, formD, registry, graph (official national registries), ukContracts. Full depth: traffic, linkedin, metaAds, linkedinAds, maps. Section keys (see Sections) work here too. Sources another one needs are added automatically (jobs needs site).

## `sections` (type: `array`):

Leave empty for all. Sections: tech (technologies with versions), pricing, certifications (as the company lists them), customers (named logos), integrations, content (blog cadence), productUpdates (changelog cadence), siteHtml (page snapshot for monitor mode), openSource (GitHub organisation), usFederal (US federal contract awards), news (90 days of headlines), family (parent and subsidiaries), revenueBand (stated, or a labelled estimate), hiringIntel (posting velocity, seniority, new locations), competitors (full depth), socialActivity (posting cadence and engagement), emailInfo (email format, mail domains and provider), people (decision-makers; also see includePeople). Fewer sections make each company faster.

## `includeReviewInsights` (type: `boolean`):

Top complaint and praise phrases, the rating trend over 4 quarters and the reply rate, from up to 100 recent Trustpilot and Sitejabber reviews. Counts and phrases only, never review text or reviewer names. Charged as an extra event per company that has them.

## `includePeople` (type: `boolean`):

Adds up to maxPeoplePerCompany decision-makers per company: name, job title, seniority and department, from the company's own team and leadership pages and, for US-listed companies, the officers named in its SEC filings. Each gets the work email the company publishes for them, or one built from the format its own published addresses follow (marked pattern-unverified), a work phone only when the company prints it for that person, and a LinkedIn link only when the company's page gives it. Never personal emails, mobile numbers, home addresses or personal social profiles. Charged per person with a work email.

## `maxPeoplePerCompany` (type: `integer`):

At most this many people per company, most senior first.

## `peopleSeniority` (type: `array`):

Leave empty for all. Values: c-level, founder, vp, director, head, manager, other.

## `departments` (type: `array`):

Leave empty for all. Values: Executive, Engineering, Product, Sales, Marketing, Finance, Operations, People, Legal, Design, Customer, Data.

## `excludeEuUk` (type: `boolean`):

On: companies based in the EU, the EEA or the UK get no people (their company data is unchanged).

## `icp` (type: `object`):

Optional. Scores every company 0 to 100 against who you sell to, with the reasons. Fields: industries, countries (ISO codes), employeesMin, employeesMax, requiredTech, forbiddenTech, minMonthlyVisits. Unknown facts count half, a ruled-out technology scores 0.

## `maxCompanies` (type: `integer`):

Stop after this many companies (0 = all, up to 5,000 per run). Useful for a small test first.

## `concurrency` (type: `integer`):

How many companies are read at the same time (1 to 16). Lower it if you run on less memory.

## `mode` (type: `string`):

Enrich gives one row per company. Monitor also remembers each company and adds what changed since the last run (changes, changedSince, snapshotAt): schedule it weekly on the same list. The first monitor run saves the baseline. Find work emails takes a list of people (people) and returns each one's work email. Check email addresses takes a list of addresses (emails) and says what DNS can tell about each.

## `watchName` (type: `string`):

Monitor only. Keeps separate lists apart in your account: "competitors" and "prospects" each remember their own companies. Leave empty for one default list.

## `onlyChanged` (type: `boolean`):

Monitor only. Companies with no change since the last run get a short free row instead of a full one. First runs and changed companies are full rows.

## `people` (type: `array`):

Find work emails mode only. One entry per person: {"name": "Jane Doe", "domain": "acme.com"} (or "company": "Acme" instead of the domain, and an optional "title"). Work domains only: personal mail providers are refused.

## `emails` (type: `array`):

Check email addresses mode only. One address per line.

## Actor input object example

```json
{
  "companies": [
    "zapier.com",
    "monzo.com",
    {
      "name": "Gymshark",
      "country": "GB"
    }
  ],
  "depth": "full",
  "sources": [],
  "sections": [],
  "includeReviewInsights": false,
  "includePeople": true,
  "maxPeoplePerCompany": 5,
  "peopleSeniority": [],
  "departments": [],
  "excludeEuUk": false,
  "icp": {
    "countries": [
      "US",
      "GB"
    ],
    "requiredTech": [
      "HubSpot"
    ],
    "forbiddenTech": [
      "Salesforce"
    ]
  },
  "maxCompanies": 0,
  "concurrency": 6,
  "mode": "enrich",
  "watchName": "",
  "onlyChanged": false,
  "people": [
    {
      "name": "Jane Doe",
      "domain": "acme.com"
    }
  ],
  "emails": [
    "jane.doe@acme.com"
  ]
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per input: every section with its sources, or the reason nothing was found (free).

## `hubspot` (type: `string`):

Found companies under HubSpot company property names, ready to import.

## `salesforce` (type: `string`):

Found companies under Salesforce Account field names, ready to import.

## `summary` (type: `string`):

Statuses, time per company, which sources answered, and the measured cost.

# 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": [
        "zapier.com",
        "monzo.com",
        "Gymshark"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/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": [
        "zapier.com",
        "monzo.com",
        "Gymshark",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("locaihost/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": [
    "zapier.com",
    "monzo.com",
    "Gymshark"
  ]
}' |
apify call locaihost/company-enrichment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,locaihost/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/lNcZylaRwYmyCa0MX/builds/kQPbEckNUJzybkkDH/openapi.json
