> Enrich.chat gives AI agents verified work emails and mobiles. To use it from an agent, read https://enrich.chat/agents.md . This is the Markdown version of https://enrich.chat/blog/company-data-enrichment/

# Company data enrichment: which fields to fill, how to match records and how often to refresh them

Enriching a company record is easy to start and easy to get wrong. Here are the fields worth filling, the lookup key, the match check, the conflict rules and the refresh schedule, plus a script, n8n and agent route for bulk runs.

By Enrich.chat Editorial. Updated October 16, 2026.

**Short answer:** Company data enrichment adds missing facts to a company record, such as industry, headcount, location, tech stack and key people, by looking the company up on an outside source. Use the website domain as the key, check that the returned domain and name match yours, and give each field one owner. Enrich.chat's [company enrichment API](https://enrich.chat/api/company-enrichment/) takes a domain, a LinkedIn company page or a company_id.

## Key takeaways

- The website domain is the standard key. HubSpot's company enrichment [uses only the company domain](https://knowledge.hubspot.com/records/get-started-with-data-enrichment), and Apollo wants it without www. Enrich.chat takes a domain, a LinkedIn company page or a company_id, not a company name.
- Clean domains before you look anything up. HubSpot's automatic company creation makes a separate record for each subdomain, so careers.acme.com and acme.com become two accounts.
- Compare employee counts by band, not by raw number. LinkedIn's size bands put 420 and 480 employees in the same 201 to 500 band, and a buffer stops a company near 500 from flipping bands.
- Re-check by field and never faster than the source updates. HubSpot's continuous enrichment and People Data Labs' API data update monthly, and Salesforce's company info rules run about every 14 days, so a daily re-check buys little.
- Enrich.chat's POST /v1/batch takes up to 25 lookups per call, and the dashboard's Bulk enrich takes a CSV of up to 5,000 rows, so a list run is a short loop in a script, n8n or an agent. A lookup that finds nothing uses 0 credits.

## What is company data enrichment?

Company data enrichment fills in what you do not know about a business by looking it up on an outside source. You send a key, usually the company's website domain, and the source returns fields such as industry, headcount, location, tech stack and the people who work there. HubSpot describes its own version this way: it [compares a company domain](https://knowledge.hubspot.com/records/how-data-enrichment-works-in-hubspot) against its commercial dataset, third-party providers and public information, then updates the record when it finds verified information.

It is the account-side twin of [contact enrichment](https://enrich.chat/blog/contact-enrichment/). Contact enrichment adds emails and phones to people. Company enrichment adds facts about accounts, and those facts drive segments, lead scoring, routing and territories. Our guides to [firmographic data](https://enrich.chat/blog/firmographic-data/) and [technographic data](https://enrich.chat/blog/technographic-data/) define each field, and [what data enrichment is](https://enrich.chat/blog/what-is-data-enrichment/) covers the general idea.

This page is the how-to: which fields to fill, which key to look up, how to check a match, what to do when sources disagree, how often to refresh, and how to run a whole list. If your CRM has built-in enrichment, try it first, as [Zapier's tool roundup](https://zapier.com/blog/data-enrichment-tools/) advises. The steps work with any source.

## Which company fields are worth enriching?

Enrich the fields your team filters, routes or writes with: domain, name, industry, size, location, tech stack and key people. Add revenue, funding or founding year only if your ideal customer profile uses them. The table shows what each field drives and what Enrich.chat returns today.

| Field | What it drives | Enrich.chat returns | Watch for |
| --- | --- | --- | --- |
| **Domain** | The lookup key, and the way to deduplicate accounts | You send it. The response echoes `domain` | HubSpot's automatic company creation makes [a record for each subdomain](https://knowledge.hubspot.com/object-settings/automatically-create-and-associate-companies-with-contacts) |
| **Company name** | The display name, and a check that the match is right | `name` | Brand and legal names differ. Use it to check the match, not to overwrite yours |
| **Industry** | Segments, routing and message | `industry`, a short label | Providers use their own lists, and HubSpot's industry property has [about 150 preset options](https://knowledge.hubspot.com/properties/hubspot-crm-default-company-properties) |
| **Size** | Tiers, territories and scoring | `size`, a band, and `employees_on_linkedin` | The count is a signal for size, not an exact headcount: Apollo names its field [`estimated_num_employees`](https://docs.apollo.io/reference/organization-enrichment). Compare bands |
| **Location** | Territories and regional routing | `city`, `state` and `country` | Headquarters differ from branch offices |
| **Tech stack** | Fit, integrations and messaging | `/v1/company/tech`: each tool with a category | A tool that is missing is unknown, not unused. See [technographic data](https://enrich.chat/blog/technographic-data/) |
| **Key people** | Who to contact | `/v1/company/people`: name, title and LinkedIn URL | Titles change, so confirm before you write to someone |
| **Parent company** | Roll-ups, so a group is not counted twice | Not returned | [Apollo](https://docs.apollo.io/reference/organization-enrichment) and [ZoomInfo](https://docs.gtm.ai/reference/enrichinterface_enrichcompany) return parent fields |
| **Revenue, funding, founded** | Fit scoring when your ICP uses money or age | `revenue` as a band, the latest `funding` stage and the `founded` year, where we have them | A band is not an exact figure, and a blank means unknown. Apollo and ZoomInfo return them too, per their docs |

Map each field to your CRM once. [HubSpot's default company properties](https://knowledge.hubspot.com/properties/hubspot-crm-default-company-properties) include Company domain name, Industry, Number of employees, Employee range, Country/Region, State/Region and City. Because an industry label usually has to match a preset list, keep the provider's raw label in its own field and write the mapped value into the CRM field.

Skip fields nobody reads. A field that no filter, score or message uses costs credits and clutters the record. Our [ideal customer profile](https://enrich.chat/blog/ideal-customer-profile/) guide shows how to pick the fields that decide fit.

## What should you look a company up by?

Look a company up by its website domain. HubSpot says its company enrichment [uses only the company domain](https://knowledge.hubspot.com/records/get-started-with-data-enrichment). Apollo's organization endpoint [takes a domain, a LinkedIn URL or a website](https://docs.apollo.io/reference/organization-enrichment). Enrich.chat's `/v1/company` takes a domain, a LinkedIn company page or a company_id.

A company name is a weak key, because many firms share a name. [People Data Labs' docs](https://docs.peopledatalabs.com/docs/reference-company-enrichment-api) say a website, ticker or profile is more likely to match than a name. They also say that a name fitting several companies resolves to the one whose name appears most often in their data. That is the likeliest answer, not always yours. [ZoomInfo's endpoint](https://docs.gtm.ai/reference/enrichinterface_enrichcompany) accepts a name but says more details give a better match. Enrich.chat does not support names yet.

If your list has only names, get the domain first. Three routes work:

- **A website field** in your CRM or sheet.
- **A contact's work email.** HubSpot [matches the email domain](https://knowledge.hubspot.com/object-settings/automatically-create-and-associate-companies-with-contacts) of a contact to a company domain, and for a free-mail address it falls back to the contact's Website URL. Do the same and skip addresses at gmail.com and similar.
- **An agent search** for the official site. Confirm it against the name the lookup returns.

Then clean every domain before you use it. Enrich.chat reduces a full URL to its domain for you, but you need clean values to deduplicate your own list before you spend credits.

| What you have | Clean key | Rule |
| --- | --- | --- |
| `HTTPS://WWW.Acme.com/about?ref=x` | `acme.com` | Hostnames are [case-insensitive under RFC 3986](https://www.rfc-editor.org/rfc/rfc3986.html), so lowercase them. Drop the scheme, path and query. Apollo's docs say [not to include www](https://docs.apollo.io/reference/organization-enrichment) |
| `careers.acme.com` | `acme.com` | Roll subdomains up to the registrable domain, unless the subdomain is a separate business |
| `acme.co.uk` | `acme.co.uk` | Do not keep the last two labels, because `co.uk` is a suffix. The [Public Suffix List](https://publicsuffix.org/learn/) exists because there is no algorithmic way to find where the registrable part starts |
| `jane@acme.com` | `acme.com` | Take the part after the @ sign. Skip free providers such as gmail.com, which say nothing about an employer |
| `acme.io`, which redirects to `acme.com` | `acme.com`, with `acme.io` as an alias | A [301 status means moved permanently](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/301). HubSpot lets a company hold [a primary domain and secondary domains](https://knowledge.hubspot.com/records/deduplication-of-records) |
| `Acme Logistics` | None yet | Find the website first, then look up the domain |

## How do you match records and confirm you found the right company?

Match on the cleaned domain, then confirm the answer before you write anything. Compare the returned domain and name with yours. A lookup that returns the wrong company does more harm than one that returns nothing.

**Figure 1: Five steps for each company in a list.** A list of company websites goes through five steps. Clean the domain, deduplicate it, look it up once, check that the returned domain and name match, and write the result with a status and date. Only the look-up step uses credits, and a miss uses 0. A not-found result is logged and retried much later, and a mismatch goes to a review queue.

*The five steps for each company in a list. Source: [Enrich.chat agent docs](https://enrich.chat/agents.md).*

1. **Clean the domain.** Use the rules in the table above. Clean and merge duplicate accounts first, as our [database hygiene checklist](https://enrich.chat/blog/database-hygiene/) suggests.
2. **Deduplicate on the clean domain.** HubSpot deduplicates companies on domain name, but [companies created through its API are not deduplicated](https://knowledge.hubspot.com/records/deduplication-of-records) that way. Do it in your own sheet. Each unique domain then costs one lookup.
3. **Look up each domain once.** Send `GET /v1/company?domain=acme.com`.
4. **Check the match.** The response echoes `domain` and `name`. If the domain differs from the one you sent, the site probably redirects to a parent or a new brand: keep the old domain as an alias. If the name looks nothing like yours, send the row to review. People Data Labs returns [a likelihood score from 1 to 10](https://docs.peopledatalabs.com/docs/reference-company-enrichment-api). Enrich.chat's response has no match score, so you compare the fields yourself.
5. **Record every outcome.** Store ok, not found or review, plus the date. A lookup cannot change a miss unless the source has new data, so retry misses on a slow cycle, such as monthly, or when you have a better domain.

### How do parents and subsidiaries fit?

One domain is not always one company. A parent and its brands can share a site, and a subsidiary can have its own. [Apollo's endpoint](https://docs.apollo.io/reference/organization-enrichment) returns owner and ultimate parent fields, and [ZoomInfo's](https://docs.gtm.ai/reference/enrichinterface_enrichcompany) returns parent and ultimate parent IDs and names. For legal entities, [GLEIF's Level 2 data](https://www.gleif.org/en/lei-data/access-and-use-lei-data/level-2-data-who-owns-whom) shows each LEI holder's direct and ultimate accounting parent. Enrich.chat returns no parent field, so keep your own parent-account field and roll up in your CRM.

## What do you do when two sources disagree?

First check whether they truly disagree, then apply one rule per field. Most differences vanish once both values are on the same scale. For the rest, pick a winner, and keep the loser.

### Why compare bands instead of raw counts?

Employee counts rarely match across sources, because each source counts in its own way. LinkedIn's Page count comes from members who list the company, and [it can take up to 30 days to update](https://www.linkedin.com/help/linkedin/answer/a541828). So store the number with its date, and map it to a band as well. [LinkedIn's size bands](https://learn.microsoft.com/en-us/linkedin/shared/references/reference-tables/company-size-codes) are 1 to 10, 11 to 50, 51 to 200, 201 to 500, 501 to 1,000, 1,001 to 5,000, 5,001 to 10,000 and 10,001 or more. Figure 2 shows three counts from three sources.

**Figure 2: Three headcounts against LinkedIn size bands.** Three sources report 420, 480 and 520 employees for one company. The 201 to 500 band ends at 500, so 420 and 480 share a band and 520 falls in the 501 to 1,000 band. Because 520 is only about 8 percent above 480, a 10 percent buffer keeps the stored band at 201 to 500.

*Illustrative counts against LinkedIn's company size codes. The 10% buffer is our suggested rule, not a standard. Source: [LinkedIn on Microsoft Learn](https://learn.microsoft.com/en-us/linkedin/shared/references/reference-tables/company-size-codes).*

Boundaries need a buffer. A company with about 500 staff would flip between two bands on every refresh. Our suggested rule: change the stored band only when the new count falls in a different band and sits more than 10% away from the stored count.

### Which source should win for each field?

When values truly differ, set a rule per field and write it down. Salesforce's Data 360 offers three reconciliation rules for conflicting values, [Last Updated, Most Frequent and Source Sequence](https://trailhead.salesforce.com/content/learn/modules/data-and-identity-in-salesforce-cdp/select-identity-resolution-match-rules), and you can set them at object or field level. Salesforce also notes that [source records are not altered](https://trailhead.salesforce.com/content/learn/projects/explore-data-cloud-core-functionality/unify-your-data): only one value shows in the unified profile. Copy that idea. Keep every source's value and choose which one shows.

*Our suggested winners, a policy to adapt rather than a standard.*

| Field | Who wins | Why |
| --- | --- | --- |
| **Domain** | The domain a lookup confirms, with redirects kept as aliases | It is your join key, so a wrong value breaks every other field |
| **Name** | Your CRM | Your team knows it. Use the provider's name to check the match |
| **Industry** | Your segment label, with the provider's label in a second field | Vendors keep their own industry lists, as our [firmographic data guide](https://enrich.chat/blog/firmographic-data/) explains |
| **Size** | The newest count, with its date and the 10% buffer | Counts move all the time and bands should not flip |
| **Location** | The provider for headquarters country and state. You for branches | You collected the branch addresses yourself |
| **Tech stack** | All sources combined, each tool with a seen date | One scan can miss what another finds |
| **Key people** | The newest record, confirmed by a person lookup | Titles and employers change often |

Give each field one writer. HubSpot's continuous enrichment [stops updating a property](https://knowledge.hubspot.com/records/enrich-your-contact-and-company-data) once a user or another system edits it, so if your workflow writes a field, the provider's refresh of it ends. Snowflake warns that [an outdated source can overwrite accurate data](https://www.snowflake.com/en/fundamentals/data-enrichment/) with stale information, so check results after each integration. Our [CRM data enrichment guide](https://enrich.chat/blog/crm-data-enrichment/) has a write-back rule for a single field.

## How often should you refresh company records?

Re-check slow fields once a year and fast fields every quarter, and never faster than the source updates. Our suggested schedule: tech stack and headcount every quarter for accounts you work, industry and location once a year, and key people before each outreach. It is a policy, not a standard.

Sources update on their own timetable. HubSpot says continuous enrichment [updates enriched records monthly](https://knowledge.hubspot.com/records/get-started-with-data-enrichment) when new data is available. People Data Labs says its [API data updates monthly](https://docs.peopledatalabs.com/docs/data-updates). Salesforce says its [company info rules run approximately every 14 days](https://help.salesforce.com/s/articleView?language=en_US&id=data_integration_rule_configure_all.htm&type=0). None of these refreshes daily, so a daily re-check mostly repeats the last answer. Figure 3 puts the cadences on one scale.

**Figure 3: How often sources update and how often to re-check.** A log-scale timeline from one week to one year. Salesforce company info rules run about every 14 days, LinkedIn Page member counts can take up to 30 days, and HubSpot and People Data Labs API data update monthly. Our suggested re-checks are quarterly for tech stack, headcount and key people, and yearly for industry and location.

*Source update cadences from [Salesforce](https://help.salesforce.com/s/articleView?language=en_US&id=data_integration_rule_configure_all.htm&type=0), [LinkedIn](https://www.linkedin.com/help/linkedin/answer/a541828), [HubSpot](https://knowledge.hubspot.com/records/get-started-with-data-enrichment) and [People Data Labs](https://docs.peopledatalabs.com/docs/data-updates). The re-check intervals are our suggestion, and key people are also re-checked before each outreach.*

Add triggers to the calendar. An email bounce, a redirect on a domain you hold, a reply saying someone left, or news of a funding round or acquisition can each justify an early re-check. A company that matched before and now returns nothing deserves a look. It may have closed, merged or moved to a new domain. BLS data shows how often young businesses disappear: of private-sector [establishments that opened in the year to March 2015, 34.7% were still open ten years later](https://www.bls.gov/bdm/us_age_naics_00_table7.txt). BLS counts work locations, not whole companies, so read it as a guide to young businesses. Our [B2B data decay guide](https://enrich.chat/blog/b2b-data-decay/) compares published rates.

People move faster than the accounts they work for. BLS reports that median tenure with a current employer was [4.1 years in January 2026](https://www.bls.gov/news.release/tenure.nr0.htm), so half of workers had been with their employer for 4.1 years or less. Re-check a person before you write to them.

Store a checked date next to every enriched field. It turns the schedule into a filter, such as every account with a headcount older than 90 days. Enrich.chat has no scheduled refresh and sends no change alerts: its webhooks announce finished jobs only. It answers when you call it, so your workflow sets the schedule.

## How do you enrich a list of companies in bulk?

Enrich.chat's `POST /v1/batch` takes up to 25 lookups per call, and the dashboard's [Bulk enrich](https://enrich.chat/features/bulk-enrichment/) takes a CSV of up to 5,000 rows, which it can run on the server as a [background job](https://enrich.chat/features/background-jobs/). Either way a bulk run is a loop: clean, deduplicate, call, check, write. You can run the loop from a script, from n8n or from an AI agent. Other APIs batch too: [ZoomInfo takes up to 25 companies](https://docs.gtm.ai/reference/enrichinterface_enrichcompany) in one request, and [Apollo's bulk endpoint takes up to ten](https://docs.apollo.io/reference/organization-enrichment).

### Route 1: a script

This Python script reads a CSV with a `website` column. It cleans each domain, looks up each unique domain once, waits when the API returns 429, stops on a 402, and writes a status and a date for every row. The 429 response says how long to wait, and the HTTP [Retry-After header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After) means the same thing.

```
import csv, os, time
from datetime import date

import requests

URL = "https://enrich.chat/v1/company"
KEY = os.environ.get("ENRICH_KEY")  # optional: a plan key lifts the free limit
HEADERS = {"Authorization": "Bearer " + KEY} if KEY else {}
FIELDS = ["name", "industry", "size", "employees_on_linkedin", "state", "country", "credits_used"]

def clean(raw):
    host = raw.strip().lower().split("//")[-1].split("/")[0].split("?")[0]
    return host.removeprefix("www.")

def lookup(domain):
    while True:
        r = requests.get(
            URL, params={"domain": domain}, headers=HEADERS, timeout=30
        )
        if r.status_code == 429:  # slow down: wait as long as the API says
            time.sleep(r.json().get("retry_after", 5))
            continue
        return r.status_code, r.json()

def pick(data):
    return dict((k, data.get(k)) for k in FIELDS)

rows = list(csv.DictReader(open("accounts.csv")))  # needs a "website" column
seen = {}  # one lookup per unique domain
for row in rows:
    domain = clean(row["website"])
    row["domain"] = domain
    if not domain:
        row["status"] = "no domain"
    elif domain in seen:
        row.update(seen[domain], credits_used=0)  # repeat: no call, no credits
    else:
        code, data = lookup(domain)
        if code == 402:  # free limit or credits used up: stop, resume later
            print("stopped at", domain, "-", data.get("error"))
            break
        if not data.get("found"):
            result = dict(status="not found")
        elif data.get("domain") != domain:
            result = dict(status="review: domain differs", **pick(data))
        else:
            result = dict(status="ok", **pick(data))
        result["checked"] = date.today().isoformat()
        seen[domain] = result
        row.update(result)

cols = ["website", "domain", "status", "checked"] + FIELDS
with open("accounts_enriched.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=cols, extrasaction="ignore")
    writer.writeheader()
    writer.writerows(rows)
```

Rows after a stop have no status, so run the script again on those. The `clean` function handles case, scheme, `www` and path. To roll subdomains up to the registrable domain, add the [tldextract package](https://pypi.org/project/tldextract/), which reads the Public Suffix List.

### Route 2: n8n

n8n can run the same loop without code. Our [n8n lead enrichment guide](https://enrich.chat/blog/n8n-lead-enrichment/) walks through the nodes, and the [Google Sheets, n8n, Zapier and Make](https://enrich.chat/integrations/google-sheets/) page covers the other tools.

1. Read the rows from a sheet, Airtable or a CSV file, and compute the clean domain.
2. Add a [Remove Duplicates node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.removeduplicates/) set to remove items repeated within the current input, comparing the domain field. Its second mode skips items processed in earlier runs, which lets a re-run skip finished domains.
3. Call `GET https://enrich.chat/v1/company` with the HTTP Request node. Under its options, the [Batching settings](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) Items per Batch and Batch Interval set the pace. By default the node counts only a 2xx response as a success, so turn on Never Error if you want a 402 or 429 to reach a branch.
4. Branch on `found`. Write matched rows with a status of ok and misses with a status of not found.

### Route 3: an AI agent

Paste a prompt like the one below into ChatGPT, Claude, Cursor or Codex. The agent reads [agents.md](https://enrich.chat/agents.md), which tells it to pick the best identifier for each row, call the API for each row, singly or in batches of up to 25, wait when it gets a 429, mark misses as not found and report the total `credits_used`. For an agent that works inside your CRM, see the [HubSpot data enrichment](https://enrich.chat/integrations/hubspot/) page.

```text
Use www.enrich.chat to look up each domain in my list of company websites: its industry, size band, state and country, and its tech stack. Show the returned domain next to mine, flag any row where the name or domain does not match, mark misses as not found, and tell me the total credits_used
```

### What does a bulk run cost?

A company profile or tech stack found uses 5 credits, and a miss uses 0. Take 5,000 accounts with a profile, a tech stack and one head of sales each. The most that run can use is 75,000 credits, which fits the Growth plan at $29 a month. Every miss lowers the total. Each IP address also gets 10 free lookups a day with no signup, enough to pilot a few domains. Credits renew with each monthly payment and do not roll over. See [pricing](https://enrich.chat/pricing/) for every plan.

## How does Enrich.chat fit, and when is something else better?

Enrich.chat suits company enrichment when your list has domains and you work through an AI agent, a script or n8n. Three GET endpoints cover it: `/v1/company` for name, domain, industry, size and revenue bands, founded year, location, funding stage, growth and traffic, `/v1/company/tech` for the technologies a company runs, and `/v1/company/people` for names, titles and LinkedIn URLs. Pass a LinkedIn URL to `/v1/person` for a work email with a status. The [company enrichment API page](https://enrich.chat/api/company-enrichment/) has the request and response details, and [best company data APIs](https://enrich.chat/blog/best-company-data-apis/) compares the vendors. To find companies rather than look them up, use `/v1/companies` or [company search](https://enrich.chat/features/company-search/) in the dashboard.

### When is another tool the better choice?

- **You need a parent company or an exact revenue figure.** Apollo's organization endpoint and ZoomInfo's company endpoint return parent fields, per their docs. Enrich.chat returns no parent company, and its revenue is a band, not an exact figure.
- **Your list has only company names.** People Data Labs accepts a name and fuzzy-matches it. Enrich.chat needs a website, a LinkedIn company page or a company_id.
- **You need very large files.** ZoomInfo and Apollo batch companies. Enrich.chat takes 25 lookups per batch call, and a background job holds at most 5,000 rows, so a bigger file needs several jobs. For bulk files, ask about Enterprise at sales@enrich.chat.
- **Your records live in HubSpot.** HubSpot says its data enrichment [does not use HubSpot Credits](https://knowledge.hubspot.com/records/get-started-with-data-enrichment), on the subscriptions that include it. See [waterfall enrichment](https://enrich.chat/blog/waterfall-enrichment/) if one source is not enough.

### What to watch out for with Enrich.chat

- Company lookups take a website, a LinkedIn company page or a company_id, not a company name. Revenue is a band, funding is the latest stage only, and there is no parent company. `employees_on_linkedin` is a signal for size, not an exact headcount.
- There is no spreadsheet-style table builder like Clay's, native CRM app or scheduled refresh. You work through the dashboard, an AI agent, the free tools such as the [tech stack lookup](https://enrich.chat/tools/tech-stack-lookup/), or your own code. SDKs are planned, and plain HTTPS works today.

### Privacy and opt-out

The people returned by `/v1/company/people` are individuals. Anyone can remove their data at [enrich.chat/opt-out/](https://enrich.chat/opt-out/), and requests are processed within 15 days. If you contact people you find, you are responsible for the rules that apply to you, such as TCPA, CAN-SPAM and GDPR. Accounts are covered by our [terms](https://enrich.chat/terms/). This is not legal advice.

## Frequently asked questions

### What is company data enrichment?

Company data enrichment fills gaps in an account record by matching it to an outside source. You send a key such as the website domain and get back fields like industry, headcount, location, tech stack and key people. It feeds segmentation, scoring and routing. It differs from [contact enrichment](https://enrich.chat/blog/contact-enrichment/), which adds emails and phones for people. Our guide to [data enrichment](https://enrich.chat/blog/what-is-data-enrichment/) covers both.

### What do you need to enrich a company record?

You need a lookup key, and the website domain works best. [HubSpot's company enrichment](https://knowledge.hubspot.com/records/get-started-with-data-enrichment) uses only the company domain, and [Apollo's organization endpoint](https://docs.apollo.io/reference/organization-enrichment) takes a domain, a LinkedIn URL or a website. [Enrich.chat's company endpoint](https://enrich.chat/api/company-enrichment/) takes a domain, a LinkedIn company page or a company_id, and company names are not supported yet. If you only have a name, find the website first.

### How often should you refresh company data?

Match the schedule to the field. We suggest re-checking tech stack and headcount every quarter for accounts you work, industry and location once a year, and key people before each outreach. Sources update on their own timetable: [HubSpot's continuous enrichment is monthly](https://knowledge.hubspot.com/records/get-started-with-data-enrichment), and [People Data Labs' API data is monthly](https://docs.peopledatalabs.com/docs/data-updates). Re-checking faster than the source updates buys little.

### What should you do when two sources give different company data?

First put both values on the same scale, such as a size band, because most differences vanish. For real conflicts, set a rule per field: last updated wins, most frequent wins, or a ranked list of sources. [Salesforce Data 360 offers those three reconciliation rules](https://trailhead.salesforce.com/content/learn/modules/data-and-identity-in-salesforce-cdp/select-identity-resolution-match-rules). Keep the losing value and its source in a separate field, and let a person decide close calls.

### Can you enrich a company from its name alone?

Sometimes, with weaker matches. [People Data Labs fuzzy-matches names](https://docs.peopledatalabs.com/docs/reference-company-enrichment-api) and says a website or profile is more likely to match. [Apollo's API definition says](https://docs.apollo.io/reference/organization-enrichment) a name alone is not supported. Enrich.chat does not support names yet and needs a website, a LinkedIn company page or a company_id. Find the website from your CRM, a contact's work email domain or an agent search, then confirm the returned name.

### Can an AI agent or n8n enrich a list of companies in bulk?

Yes. Enrich.chat's POST /v1/batch takes up to 25 lookups per call, so an agent or workflow can send a list in groups. In n8n, deduplicate the domains, then use the [HTTP Request node's batching options](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/) to space the calls. An agent reads [agents.md](https://enrich.chat/agents.md) and works through your rows. A lookup that finds nothing uses 0 credits, and each response shows `credits_used`.

## Sources

1. [Get started with data enrichment](https://knowledge.hubspot.com/records/get-started-with-data-enrichment)
2. [How data enrichment works in HubSpot](https://knowledge.hubspot.com/records/how-data-enrichment-works-in-hubspot)
3. [Enrich your contact and company data](https://knowledge.hubspot.com/records/enrich-your-contact-and-company-data)
4. [Deduplication of records](https://knowledge.hubspot.com/records/deduplication-of-records)
5. [Automatically create and associate companies with contacts](https://knowledge.hubspot.com/object-settings/automatically-create-and-associate-companies-with-contacts)
6. [HubSpot's default company properties](https://knowledge.hubspot.com/properties/hubspot-crm-default-company-properties)
7. [Company Enrichment API (reference)](https://docs.peopledatalabs.com/docs/reference-company-enrichment-api)
8. [Data Updates](https://docs.peopledatalabs.com/docs/data-updates)
9. [Organization Enrichment](https://docs.apollo.io/reference/organization-enrichment)
10. [Enrich Companies (API reference)](https://docs.gtm.ai/reference/enrichinterface_enrichcompany)
11. [Public Suffix List: learn more](https://publicsuffix.org/learn/)
12. [tldextract](https://pypi.org/project/tldextract/)
13. [RFC 3986: Uniform Resource Identifier (URI): Generic Syntax](https://www.rfc-editor.org/rfc/rfc3986.html)
14. [301 Moved Permanently](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/301)
15. [Retry-After header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After)
16. [Company Size Codes](https://learn.microsoft.com/en-us/linkedin/shared/references/reference-tables/company-size-codes)
17. [Employees associated with a LinkedIn Page](https://www.linkedin.com/help/linkedin/answer/a541828)
18. [Things to Know About Data Integration Rules](https://help.salesforce.com/s/articleView?language=en_US&id=data_integration_rule_configure_all.htm&type=0)
19. [Select identity resolution match rules](https://trailhead.salesforce.com/content/learn/modules/data-and-identity-in-salesforce-cdp/select-identity-resolution-match-rules)
20. [Unify your data](https://trailhead.salesforce.com/content/learn/projects/explore-data-cloud-core-functionality/unify-your-data)
21. [Level 2 data: who owns whom](https://www.gleif.org/en/lei-data/access-and-use-lei-data/level-2-data-who-owns-whom)
22. [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)
23. [Remove Duplicates node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.removeduplicates/)
24. [Employee Tenure in 2026](https://www.bls.gov/news.release/tenure.nr0.htm)
25. [Survival of private sector establishments by opening year](https://www.bls.gov/bdm/us_age_naics_00_table7.txt)
26. [What Is Data Enrichment? Benefits and Best Practices](https://www.snowflake.com/en/fundamentals/data-enrichment/)
27. [The 11 best data enrichment tools in 2026](https://zapier.com/blog/data-enrichment-tools/)
28. [Enrich.chat agents.md](https://enrich.chat/agents.md)

## Try this prompt

Enrich a list of company domains

```text
Use www.enrich.chat to look up each domain in my list of company websites: its industry, size band, state and country, and its tech stack. Show the returned domain next to mine, flag any row where the name or domain does not match, mark misses as not found, and tell me the total credits_used
```

## Related

- [Company enrichment API](https://enrich.chat/api/company-enrichment/)
- [CRM data enrichment: what, how often, how](https://enrich.chat/blog/crm-data-enrichment/)
- [Firmographic vs technographic data](https://enrich.chat/blog/firmographic-data/)
