> 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/contact-enrichment/

# Contact enrichment: which inputs work, which fields you get, and how to run it on a CSV or CRM export

A field guide to enriching people records. It covers the keys that match, the fields you can add, how to read each status, consent rules, a refresh schedule, and three ways to run a list.

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

**Short answer:** Contact enrichment adds person-level details, such as a work email, mobile number, job title and employer, to a record you already have. Send the strongest key you hold: a LinkedIn URL, then a work email, then a name plus a company website. Keep the status with every value, drop opted-out people before you run, and re-check an email before each send.

## Key takeaways

- Three keys match a person: a LinkedIn URL, a work email, or a name plus a company website. Enrich.chat does not look up personal mailboxes such as Gmail, and HubSpot's enrichment skips them too.
- Keep the status next to the value. A work email comes back as verified, catch_all or unknown, a mobile with a line type of mobile or unknown, and a miss uses 0 credits.
- A work email found uses 10 credits and a mobile 250, so ask for mobiles only on the rows you plan to call.
- Finding a contact is not permission to contact them. The FTC says CAN-SPAM has no exception for B2B email, and it requires honoring an opt-out within 10 business days.
- A CSV can go through the dashboard's Bulk enrich, up to 5,000 rows a run, or through a script, an n8n workflow or an AI agent.

## What is contact enrichment?

Contact enrichment adds person-level details to a contact record you already hold. A row with a name and a company website can come back with a work email, a mobile number, a job title and an employer. [Zapier describes data enrichment](https://zapier.com/blog/data-enrichment-tools/) as taking the data you have on a lead and expanding it with data you lack. Contact enrichment is the person-level half of that idea.

Company enrichment is the other half. It starts from a website and adds industry, headcount and location. Our guides to [company data enrichment](https://enrich.chat/blog/company-data-enrichment/) and [what data enrichment is](https://enrich.chat/blog/what-is-data-enrichment/) cover those. This page is the how-to for people records, from the first key to a finished CSV.

## Which inputs work for contact enrichment?

Three inputs work: a LinkedIn profile URL, a work email address, or a full name plus a company website. Enrich.chat's `GET /v1/person` takes any one of them, and one is enough for a match.

| Input | Example | Why use it | Watch out for |
| --- | --- | --- | --- |
| LinkedIn URL | `linkedin.com/in/jane-doe-ops` | Points to one person. It also works on `/v1/mobile`. | Members can change their URL. [LinkedIn keeps the old one linked for six months](https://www.linkedin.com/help/linkedin/answer/a542685). |
| Work email | `jane.doe@acme.com` | Finds the person behind an address you already hold. | Personal mailboxes such as Gmail are not looked up. |
| Name plus company website | `name=Jane Doe` and `company=acme.com` | Works when you have no URL or email. | The company must be a website, not a name. Common names can match the wrong person. |

Four things are not accepted as keys: a company name in place of a website, a personal mailbox, a first name alone, and a phone number on its own. The [API reference](https://enrich.chat/docs/) lists the parameters.

When a row has more than one key, send the strongest first: the LinkedIn URL, then the work email, then the name plus website. That is the order in Enrich.chat's [agents.md](https://enrich.chat/agents.md). HubSpot's own enrichment is stricter. It [uses a first name, last name and work email](https://knowledge.hubspot.com/records/get-started-with-data-enrichment) for a contact, and it [skips personal domains](https://knowledge.hubspot.com/records/enrich-your-contact-and-company-data) such as Gmail and Yahoo.

### What if a row has no usable key?

Find the person first. `/v1/search` and `/v1/company/people` return names, titles, ids and LinkedIn URLs, and each id or URL can go into `/v1/person`. Each person a search returns uses 5 credits. The [people search API](https://enrich.chat/api/people-search/) page covers the filters, and the [LinkedIn URL to contact API](https://enrich.chat/api/linkedin-to-contact/) page covers the URL formats it accepts.

## Which fields can you add to a contact record?

Enrich.chat adds a work email with a status, a mobile number with a line type, a job title, an employer, a level and department, a location and a LinkedIn URL to a contact. Name, title and company come free with a work email or mobile match. A lookup that finds nothing uses 0 credits.

**Figure 1: What one person lookup adds to a contact row.** A contact row with only a LinkedIn URL goes in, with fields set to email and mobile. Back come a title, an employer, a work email marked verified and a mobile with the line type mobile. The title and employer use no extra credits, the work email uses 10 credits and the mobile 250, so credits_used is 260. The values are made up.

*One lookup with `fields=email,mobile` adds a title, an employer, a work email with a status and a mobile with a line type. The values are made up and follow the sample response in [Enrich.chat's agents.md](https://enrich.chat/agents.md).*

| Field | Comes back as | Values | Credits when found |
| --- | --- | --- | --- |
| Work email | `work_email.value` and `work_email.status` | verified, catch_all, unknown | 10 |
| Mobile | `mobile.value` and `mobile.line` | mobile, unknown | 250 |
| Name, title, employer, level, department, location | `name`, `title`, `company`, `level`, `function`, `location` | Text | Free with an email or mobile match, 5 for a profile-only lookup |
| LinkedIn URL | `linkedin_url` | Profile URL | Returned in the same response |

Ask only for the fields you need. Run `fields=email` for the whole list first, then ask for mobiles on the rows you plan to call. A mobile uses far more credits than an email. The table shows an example export of 1,000 rows if every row matches. Real runs use less, because a miss uses nothing.

| 1,000-row export | Credits if every row matches | Plan that covers it |
| --- | --- | --- |
| Work email for all 1,000 | 10,000 | Growth, $29 a month |
| Emails for 1,000, mobiles for the 100 you will call | 35,000 | Growth, $29 a month |
| Emails and mobiles for all 1,000 | 260,000 | Scale, $90 a month |

Your CRM may already fill some fields. HubSpot's enrichment [fills job title, role, seniority, LinkedIn URL and location](https://knowledge.hubspot.com/records/enrich-your-contact-and-company-data) on a contact, but its list has no email or mobile property. Our [CRM data enrichment guide](https://enrich.chat/blog/crm-data-enrichment/) shows which fields to fill first.

## How do you match and dedupe contacts before you enrich?

Reduce every contact to one normalized key, merge the rows that share it, and only then run the lookups. Duplicates cost you twice: two lookups use two sets of credits, and two answers can land on one person.

Normalize the key you will match on:

- **Work email.** Trim spaces and lowercase it before you compare. [RFC 5321](https://www.rfc-editor.org/rfc/rfc5321.html) treats the part before the @ as case sensitive in principle, discourages relying on that, and treats the domain as case insensitive. Compare in lowercase and keep the original for sending.
- **LinkedIn URL.** Keep the part after `/in/` and drop the protocol, `www`, query string and trailing slash. Enrich.chat accepts those variants, so you do not have to rewrite the URL you send.
- **Phone.** Store numbers in E.164 form: a plus sign, the country code and the number, [15 digits at most in total](https://www.twilio.com/docs/glossary/what-e164), per Twilio's documentation.
- **Company.** Use the website domain, such as `acme.com`, in lowercase with no `www` or path. Enrich.chat takes a website, not a company name, and HubSpot matches companies by domain.

Then check how your CRM dedupes. [HubSpot deduplicates contacts by email address and companies by domain name](https://knowledge.hubspot.com/records/deduplication-of-records). An import file with no email or other unique identifier creates a new contact for every row, and companies created through its API are not deduplicated by domain. Salesforce has its own rules, covered in the CRM guide linked above. For wider cleanup, see [database hygiene](https://enrich.chat/blog/database-hygiene/).

### When are two rows the same person?

- Same LinkedIn URL, or same work email: the same person. Merge them.
- Same name and company domain, nothing else: probably the same person. Review before you merge.
- Same name, different companies: often a job change, sometimes two people. Keep both until a key settles it.

When you merge, keep the row with the newest lookup date, and keep a verified email over a catch_all one.

### How do you avoid enriching the wrong person?

A name plus a company website can match a namesake, so compare the returned title and employer with your row. If they differ, flag the row for review instead of overwriting it. Also store the `linkedin_url` the API returns beside the one you sent. [LinkedIn lets members change their custom URL up to five times in six months](https://www.linkedin.com/help/linkedin/answer/a542685), so URLs drift.

## What do verified, catch_all, unknown and not found mean?

Enrich.chat marks each work email verified, catch_all or unknown, marks each mobile with a line type of mobile or unknown, and marks a lookup with no match as `found: false`. Read the status before you use the value, and store it beside the value.

| Result | What it means | What to do |
| --- | --- | --- |
| `verified` email | The mailbox carries the verified label. | Add it to your send list. It is still a strong lead, not a guarantee. |
| `catch_all` email | The domain accepts every address, so the mailbox cannot be confirmed. | Hold it. Send a small share, or use another channel. |
| `unknown` email | The status could not be told. Emails from a search with `with_email=true` also show unknown. | Do not send in bulk without another check. Call `/v1/person` for a status. |
| `mobile` line | The number is a mobile number. That is its type, not proof the line works or belongs to the person. | Call or text only where the rules allow it. |
| `unknown` line | The number's type could not be told. | Confirm the number before you rely on it. |
| `found: false` | Nothing matched. The lookup uses 0 credits. | Mark the row not_found and try another key. |
| `null` field | You asked for the field and there was no data. | Leave the cell blank. |

**Figure 2: What to do with each lookup result.** One lookup result splits into six outcomes. Found false means skip the row, it used 0 credits, and try another key. A verified email goes on the send list with its status and date stored. A catch_all email is held, and only a small share is sent or another channel is used. An unknown email is held, with no bulk send without another check. A mobile line type of mobile is a number type, not consent, so follow the call and text rules. An unknown line type should be confirmed before use.

*What to do with each result. The status names come from [Enrich.chat's agents.md](https://enrich.chat/agents.md). The hold rules are our suggested policy, not an industry standard.*

A status is a label, not a delivery guarantee. The free [phone number validator](https://enrich.chat/tools/phone-number-validator/) tests a single number.

### Why treat catch_all differently?

A catch-all domain accepts mail for any address, even one with no mailbox. A server check cannot tell good addresses from bad ones there. [Hunter tested 100 accept-all addresses and 100 valid ones](https://hunter.io/email-verification-guide/accept-all-catch-all/) in the same campaign. In the accept-all group 27% bounced, against 1% in the valid group. Hunter does not tell you to drop them or to trust them. It suggests limiting them to a small share of a campaign, such as 2 to 5%, and using other channels for low-confidence contacts. Our guide to [email bounce rate](https://enrich.chat/blog/email-bounce-rate/) explains the send limits.

## What do consent and opt-out rules mean for enriched contacts?

Finding a contact's details does not give you permission to contact them. The rules depend on the channel and the country, so check each one before you send, and keep your own do-not-contact list. This is general information, not legal advice, and using any data source does not make your outreach compliant.

- **Email in the US.** The FTC's CAN-SPAM guide says the law [makes no exception for business-to-business email](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business). You must honor an opt-out within 10 business days, and you cannot sell or transfer the addresses of people who opted out, except to a firm that helps you comply. The guide lists penalties of up to $53,088 for each violating email.
- **Email in the UK.** The ICO says an address like name@company.com [identifies a person](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/business-to-business-marketing/), so UK GDPR applies. Individual business contacts have an absolute right to object to direct marketing. Companies need no consent for B2B email under PECR, but sole traders and some partnerships do, unless the soft opt-in applies.
- **Telling people where you got their data.** When you did not collect personal data from the person, [Article 14 of the GDPR](https://gdpr-info.eu/art-14-gdpr/) asks you to name the source. You must do so within a reasonable period and at the latest within one month, or at the first message if you use the data to contact them. Article 14(5) lists exceptions.
- **Calls and texts to mobiles in the US.** [47 U.S.C. 227](https://www.law.cornell.edu/uscode/text/47/227) bars autodialed or prerecorded calls to a cell number without the called party's prior express consent. It has no exception for business phones, and a person can recover $500 per violation or actual loss, whichever is greater. A line type of mobile tells you what kind of number it is, not that anyone agreed to a call. Read our [TCPA guide](https://enrich.chat/blog/tcpa-b2b-cold-calling/) before a call campaign.

Keep a suppression list. The ICO advises putting objections on a suppression list rather than deleting them, so the person is not added again. Check every enriched batch against your list before you write it to the CRM or send to it.

Anyone can ask to be removed from Enrich.chat at [enrich.chat/opt-out/](https://enrich.chat/opt-out/), and requests are processed within 15 days. That does not change your CRM or your sending tool, so your own opt-outs stay your job. You are responsible for following TCPA, CAN-SPAM and GDPR rules. Accounts are covered by our [terms](https://enrich.chat/terms/).

## How often should you refresh enriched contacts?

Re-check a contact when you are about to use it, and on a schedule for the rest: the email before each send, title and employer every quarter for accounts you work, and the whole list once a year. People change jobs often enough to make that worth the credits.

The [US Bureau of Labor Statistics](https://www.bls.gov/news.release/tenure.nr0.htm) reported that 20.6 percent of wage and salary workers had been with their employer 12 months or less in January 2026, and that median tenure was 4.1 years.

Three events should trigger an early re-check: a bounce, a reply or auto-reply saying the person has left, and a deal or campaign about to start. Check a mobile before a call campaign, not on a calendar.

Enrich.chat has no scheduled refresh and sends no job-change alerts. It answers when you call it, so you set the schedule. A refresh is a new lookup, and it uses credits when it finds a match. Re-checking 2,500 work emails uses 25,000 credits, which fits the Growth plan. The sample response in agents.md has no lookup date, so add your own date column. HubSpot's continuous enrichment, by contrast, [updates enriched records monthly](https://knowledge.hubspot.com/records/get-started-with-data-enrichment) when new data is available. For decay rates, read [B2B data decay](https://enrich.chat/blog/b2b-data-decay/). For field-by-field schedules, read [CRM data enrichment](https://enrich.chat/blog/crm-data-enrichment/).

## How do you enrich a CSV or CRM export, step by step?

Export the records, clean and dedupe the keys, pilot on 25 rows, run the lookups, then write the results back by rule. The quickest way is the dashboard's [Bulk enrich](https://enrich.chat/features/bulk-enrichment/), which takes a CSV of up to 5,000 rows a run. Choose "Run it on the server" and the job keeps going after you close the tab, as a [background job](https://enrich.chat/features/background-jobs/). The three options below run the same job from code, a workflow tool or an agent, where a list is a loop of single calls or batches of up to 25.

**Figure 3: Six steps to enrich a CSV or CRM export.** A two-row flow of six steps. One, export a CRM view as a CSV with a record ID. Two, clean and dedupe the keys. Three, pilot 25 rows and read every result. Four, look up each row with Bulk enrich or one call per row, best key first. Five, write back by filling blanks and keeping the status and date. Six, re-apply opt-outs by dropping anyone on your do-not-contact list.

*The six steps for a list. In code, step 4 is a loop because a single call looks up one record, and a batch call takes up to 25, as described in [agents.md](https://enrich.chat/agents.md). The workflow is our suggestion.*

1. **Export.** Save a CRM view as a CSV and keep the CRM's record ID column, so each result maps back to the right record.
2. **Clean and dedupe.** Rename the key columns to `linkedin_url`, `email`, `name` and `company_domain`. Apply the normalizing rules above and merge repeat rows.
3. **Pilot 25 rows.** Read every result against your record before you spend on the rest.
4. **Look up each row.** Send the best key, ask only for the fields you need, and keep the status, credits and date.
5. **Write back by rule.** Fill blanks, hold changes to title and employer for review, and never replace a working email with a catch_all or unknown one. For HubSpot, import the file as an update. Our [HubSpot](https://enrich.chat/integrations/hubspot/) and [Salesforce](https://enrich.chat/integrations/salesforce/) enrichment guides show the steps.
6. **Re-apply opt-outs.** Drop anyone on your do-not-contact list before the file reaches a sending tool.

### Option 1: a Python script

This script reads `contacts.csv`, sends the best key for each row, and writes `enriched.csv` with the value, its status, the credits used and the lookup date. It waits when the API says to, and it stops on a key or limit problem. Run it again and it picks up where it stopped. The free tier needs no key, so leave `ENRICH_KEY` unset to try it on a pilot file.

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

import requests

URL = "https://enrich.chat/v1/person"
KEY = os.environ.get("ENRICH_KEY")  # optional: leave unset on the free tier
HEADERS = {"Authorization": "Bearer " + KEY} if KEY else {}
NEW = ["work_email", "email_status", "found_title", "found_company",
       "lookup", "credits_used", "looked_up"]

def pick_key(row):  # best key first
    if row.get("linkedin_url"):
        return {"linkedin_url": row["linkedin_url"]}
    if row.get("email"):
        return {"email": row["email"]}
    if row.get("name") and row.get("company_domain"):
        return {"name": row["name"], "company": row["company_domain"]}

def call(key):
    while True:
        r = requests.get(URL, params={**key, "fields": "email"},
                         headers=HEADERS, timeout=30)
        if r.status_code not in (429, 503):
            return r
        time.sleep(r.json().get("retry_after", 5))  # wait as told

with open("contacts.csv", newline="") as f:
    reader = csv.DictReader(f)
    columns = reader.fieldnames + [c for c in NEW if c not in reader.fieldnames]
    rows = list(reader)
if os.path.exists("enriched.csv"):  # resume: keep rows already done
    with open("enriched.csv", newline="") as f:
        for row, old in zip(rows, csv.DictReader(f)):
            if old.get("lookup"):
                row.update(old)

try:
    for row in rows:
        key = None if row.get("lookup") else pick_key(row)
        if key is None:
            row.setdefault("lookup", "no_key")
            continue
        r = call(key)
        if r.status_code in (401, 402):  # key or limit problem: stop here
            break
        data = r.json()
        row["looked_up"] = date.today().isoformat()
        if not r.ok:
            row["lookup"] = "error_" + str(data.get("error"))
        elif data.get("found"):
            email = data.get("work_email") or {}
            row.update(lookup="found",
                       work_email=email.get("value", ""),
                       email_status=email.get("status", ""),
                       found_title=data.get("title", ""),
                       found_company=(data.get("company") or {}).get("name", ""),
                       credits_used=data.get("credits_used", 0))
        else:
            row.update(lookup="not_found", credits_used=0)
        time.sleep(0.25)  # pace the calls; limits are in the API reference
finally:
    with open("enriched.csv", "w", newline="") as f:
        out = csv.DictWriter(f, fieldnames=columns, restval="")
        out.writeheader()
        out.writerows(rows)
```

The script asks for `fields=email` because a mobile uses far more credits. Change it to `email,mobile` only for rows you will call. A 402 reply stops the run. Free lookups come back after `resets_at`, and plan credits come back with the next monthly payment. A reply of `found: false` is marked not_found and uses 0 credits.

### Option 2: n8n or another workflow tool

In n8n, read your rows with a node such as Google Sheets, then add an HTTP Request node. Set the method to GET and the URL to `https://enrich.chat/v1/person`, turn on Send Query Parameters, and map `linkedin_url` from the row. In the node options, turn on [Include Response Headers and Status and Never Error](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/), so a 402 or 429 reaches a Switch node instead of stopping the run. Use the Batching options, Items per Batch and Batch Interval, to pace the calls. Our [n8n lead enrichment guide](https://enrich.chat/blog/n8n-lead-enrichment/) lists every setting, and the [Google Sheets guide](https://enrich.chat/integrations/google-sheets/) covers Make and Zapier.

### Option 3: an AI agent prompt

Give the file to Claude, ChatGPT or Cursor and paste a prompt. The agent reads [agents.md](https://enrich.chat/agents.md), which tells it to pick the best key per row, return the original rows with new columns, mark misses as not found, and report the matched rows and the total `credits_used`. Start with a pilot.

```text
Use www.enrich.chat to enrich only the first 25 rows of contacts.csv with fields=email. Use the LinkedIn URL, else the work email, else the name and company website. Show each result with its status before you write anything, flag rows where the title or company differs from my copy, and tell me the credits_used
```

When the pilot looks right, run the full file with this prompt.

```text
Use www.enrich.chat to enrich contacts.csv. For each row send the LinkedIn URL, else the work email, else the name and company website. Add work_email, email_status, mobile and mobile_line columns, mark rows with no match as not_found, keep my original columns, and tell me the total credits_used
```

### Which option should you pick?

| Option | Best for | You maintain |
| --- | --- | --- |
| Python script | A job you repeat, with every step in code you can version | The script and its schedule |
| n8n or another workflow tool | New rows arriving from a sheet, a form or a CRM event | The nodes and the error branches |
| AI agent prompt | A one-off list, or a pilot before you automate | Nothing, but read the agent's output before you write it back |

## What does Enrich.chat do for contact enrichment, and when is another tool better?

Enrich.chat is a contact and company data API and dashboard built for AI agents and apps. For people it has `/v1/person`, `/v1/email`, `/v1/mobile` and `/v1/search`. Each work email comes back as verified, catch_all or unknown, each mobile with a line type, and a lookup with no match uses 0 credits. Treat every contact as a strong lead, not a guarantee.

You get 10 free API lookups a day with no signup. A key is optional: paying subscribers get one at enrich.chat/account/ after they log in and pick a plan. Plans bill monthly, include unlimited seats and need no annual contract: Growth $29 for 100,000 credits, Scale $90 for 500,000 credits, Pro $299 for 2,500,000 credits. A work email found uses 10 credits and a mobile 250. Credits renew with each monthly payment, and unused credits do not roll over. See [pricing](https://enrich.chat/pricing/) for the full list, and the [agents guide](https://enrich.chat/agents/) for setup in one prompt or through the [MCP server](https://enrich.chat/install/).

### What to watch out for

- A single call looks up one record. For lists, `POST /v1/batch` takes up to 25 records per call, and the dashboard's Bulk enrich takes up to 5,000 rows a run. "Run it on the server" keeps a job going after you close the tab, and a webhook can tell your app when it finishes, but a job holds at most 5,000 rows and its results are kept 30 days.
- It has no CRM sync, no scheduled refresh and no job-change alerts. You write results back and set the refresh schedule.
- It is not a standalone email verifier. A status comes with the contacts it returns, not for addresses from other sources.

### When is another tool the better choice?

- **You want a HubSpot list sync or a waterfall.** [FullEnrich's homepage](https://www.fullenrich.com/) lists a CSV or Excel upload and a HubSpot list sync, and describes a waterfall across 20+ vendors. It offers 50 free leads with no credit card, checked October 16, 2026. Our guide to [waterfall enrichment](https://enrich.chat/blog/waterfall-enrichment/) explains when that pays off.
- **You need titles and company fields inside HubSpot.** HubSpot's enrichment [comes with its paid hubs](https://knowledge.hubspot.com/records/enrich-your-contact-and-company-data) and enriches up to 100 records at a time from a record index page. Its automatic mode fills blanks and does not overwrite values a user or another system set. It adds no email or mobile.
- **You want phone numbers delivered by webhook.** [Apollo's bulk people enrichment endpoint](https://docs.apollo.io/reference/people-enrichment) takes up to ten people per call. Its phone numbers arrive later at a webhook URL, and its docs say that can take several minutes. Enrich.chat returns a mobile in the lookup response, and its webhooks announce finished background jobs only.

For side-by-side lists, see [data enrichment platforms](https://enrich.chat/blog/data-enrichment-platforms/) and the [best data enrichment tools](https://enrich.chat/blog/best-data-enrichment-tools/).

## Frequently asked questions

### What is contact enrichment?

Contact enrichment adds person-level details, such as a work email, mobile number, job title and employer, to a contact record you already have. You send one key, such as a LinkedIn URL or a work email, and the data source returns the fields you lack. It is the people side of [data enrichment](https://enrich.chat/blog/what-is-data-enrichment/). Company enrichment starts from a website and adds industry and headcount instead.

### What do you need to enrich a contact?

You need one key per contact. Enrich.chat accepts a LinkedIn profile URL, a work email address, or a full name plus a company website such as acme.com. It does not accept a company name in place of a website, and it does not look up personal mailboxes such as Gmail. When a row has several keys, send the LinkedIn URL first, then the email, then the name plus website.

### How do you enrich a CSV file of contacts?

Export the records with a record ID, clean and dedupe the keys, test 25 rows, then run the file. The dashboard's Bulk enrich takes a CSV of up to 5,000 rows a run, on the server as a [background job](https://enrich.chat/features/background-jobs/) or in your browser tab, and a script, an n8n workflow or an AI agent can call the API instead, one row per request or up to 25 per batch call. Add the value, its status, the credits used and a lookup date as new columns. The [person enrichment API](https://enrich.chat/api/person-enrichment/) page lists every field.

### Is there a free way to enrich contacts?

Yes, with limits. Enrich.chat gives each IP address 10 free API lookups a day with no signup, and a lookup that finds nothing does not count. [FullEnrich's homepage](https://www.fullenrich.com/) offers 50 free leads with no credit card, checked October 16, 2026. HubSpot's built-in enrichment comes with its paid hubs and fills no email or mobile. See [Enrich.chat pricing](https://enrich.chat/pricing/) for plans.

### What does catch_all mean for an enriched email?

Catch_all means the email domain accepts mail for every address, so the mailbox cannot be confirmed. Enrich.chat marks these work emails catch_all instead of verified. Treat them as risky: hold them, send only a small share, or use another channel. The free [catch-all checker](https://enrich.chat/tools/catch-all-checker/) shows whether a domain behaves this way, and [email bounce rate](https://enrich.chat/blog/email-bounce-rate/) explains the limits to stay under.

### Can you contact a person you enriched without their consent?

It depends on the channel and the country. The FTC says CAN-SPAM has [no exception for business-to-business email](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business). The TCPA requires consent for autodialed or prerecorded calls to a cell number, with no business-phone exception. The UK ICO says a work email can be personal data. This is general information, not legal advice. Our [TCPA guide](https://enrich.chat/blog/tcpa-b2b-cold-calling/) covers calls and texts.

## Sources

1. [The best data enrichment software](https://zapier.com/blog/data-enrichment-tools/)
2. [Enrich your contact and company data](https://knowledge.hubspot.com/records/enrich-your-contact-and-company-data)
3. [Get started with data enrichment](https://knowledge.hubspot.com/records/get-started-with-data-enrichment)
4. [Deduplication of records](https://knowledge.hubspot.com/records/deduplication-of-records)
5. [FullEnrich](https://www.fullenrich.com/)
6. [People Enrichment endpoint](https://docs.apollo.io/reference/people-enrichment)
7. [What are accept-all email addresses, and how to use them](https://hunter.io/email-verification-guide/accept-all-catch-all/)
8. [RFC 5321: Simple Mail Transfer Protocol](https://www.rfc-editor.org/rfc/rfc5321.html)
9. [What is E.164?](https://www.twilio.com/docs/glossary/what-e164)
10. [Change your custom public profile URL](https://www.linkedin.com/help/linkedin/answer/a542685)
11. [CAN-SPAM Act: A compliance guide for business](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business)
12. [Business-to-business marketing](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/business-to-business-marketing/)
13. [Article 14, General Data Protection Regulation](https://gdpr-info.eu/art-14-gdpr/)
14. [47 U.S. Code 227: Restrictions on use of telephone equipment](https://www.law.cornell.edu/uscode/text/47/227)
15. [Employee Tenure in 2026](https://www.bls.gov/news.release/tenure.nr0.htm)
16. [HTTP Request node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/)

## Try this prompt

Enrich a contact CSV from your agent

```text
Use www.enrich.chat to enrich contacts.csv. For each row send the LinkedIn URL, else the work email, else the name and company website. Add work_email, email_status, mobile and mobile_line columns, mark rows with no match as not_found, keep my original columns, and tell me the total credits_used
```

## Related

- [CRM data enrichment: what, how often, how](https://enrich.chat/blog/crm-data-enrichment/)
- [Person enrichment API](https://enrich.chat/api/person-enrichment/)
- [n8n lead enrichment: HTTP Request node, step by step](https://enrich.chat/blog/n8n-lead-enrichment/)
