> 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/features/bulk-enrichment/

# Bulk email finder: enrich a CSV with work emails, people and companies

Upload a CSV, match your columns, pick what to find and run it on the server or in your tab. Each run takes up to 5,000 rows, and a row that finds nothing uses 0 credits.

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

**Short answer:** Enrich.chat's Bulk enrich screen turns a CSV of up to 5,000 rows into an enriched CSV. Match your columns, choose what to find, then run it on the server, where it keeps going after you close the tab, or in your browser tab. A row that finds nothing uses 0 credits.

## Key takeaways

- Upload a CSV, match columns, choose what to find and run it. Choose Find work emails, Enrich people, Enrich companies or Find email formats, then download the result.
- Run it on the server and the job keeps going after you close the tab or the laptop. A signed webhook can tell your app it finished. The browser run is still there.
- A run takes up to 5,000 rows. Server jobs keep their rows and results for 30 days. A tab run stores nothing from your file.
- A work email found uses 10 credits, a mobile 250 and a company profile or email format 5. A row that finds nothing uses 0.

## A bulk run you can see and control

- **Column matching.** The screen guesses which column is the name, website, LinkedIn URL or email. You confirm it and see a preview before you run.
- **Four operations.** Find work emails, Enrich people, Enrich companies or Find email formats, depending on the columns you have.
- **Misses are free.** A row that finds nothing uses 0 credits. The screen totals the credits used as the run goes.
- **You decide what is kept.** A tab run stores nothing from your file. A server job keeps its rows and results for 30 days, and you can delete a job sooner.
- **Your file back, plus columns.** Your columns stay as they are. New ones start with `enrich_` and include the status of every email.
- **Run it on the server.** The job keeps going after you close the tab or the laptop, and stops by itself if credits run out.

## From CSV to enriched CSV

1. **Upload and match.** Drop a CSV or paste rows. Check that each column is matched to a name, a website, a LinkedIn URL or an email.
2. **Choose and run.** Pick an operation, then choose Run it on the server, or run it in your tab, where 25 rows go per call to `POST /v1/batch`.
3. **Download the CSV.** Get your rows back with `enrich_` columns, a status on every email and the total credits used.

## How does bulk enrichment work in Enrich.chat?

Bulk enrichment is a screen in the Enrich.chat [dashboard](https://enrich.chat/app/). You upload a CSV, say which column holds what, pick an operation and run it. Then you download your own file back with new columns. Sign in at [/login/](https://enrich.chat/login/) with an email and a 6-digit code, with no password.

1. **Upload.** Drop a CSV on the screen or paste rows. The first row holds the column names. It also reads .tsv and .txt files.
2. **Match columns.** The screen guesses which column is the name, the company website, the LinkedIn URL or the work email. You fix any wrong guess and check a preview.
3. **Run and download.** Choose Find work emails, Enrich people, Enrich companies or Find email formats. Press Run it on the server, or run it in your tab. Watch the counts for found, not found and credits used, then download the enriched CSV.

**Figure 1: The Bulk enrich screen in three steps.** A drawing of the Bulk enrich screen. Step 1, Upload: a drop zone for a CSV, a box to paste rows, and a note that the first row holds the column names and a run takes up to 5,000 rows. Step 2, Match columns: the operation Find work emails is selected, the name and company website columns are matched, and two run buttons: Run on the server and Run in this tab. Step 3, Run and download: a progress bar, counts for rows, found, not found and credits used, a note that a server job keeps going and a tab run needs the tab open, a Stop button and a Download CSV button.

*The Bulk enrich screen in its three steps, drawn from the dashboard. The 2,000-row file is an example. Source: the Bulk enrich screen in the [dashboard](https://enrich.chat/app/).*

In a tab run, your file is read in your browser and sent 25 rows at a time through `POST /v1/batch`, and nothing is stored from the file. A server run keeps your rows and results for 30 days, then deletes them. Either way, your original columns stay as they are, and every new column starts with `enrich_`.

### How should you prepare the CSV?

Keep one person or one company per row, with column names in the first row. A value that contains a comma needs double quotes, as [RFC 4180](https://www.rfc-editor.org/rfc/rfc4180) describes. Use company websites, not company names: [Hunter's bulk email finder help](https://help.hunter.io/bulk-functionalities/bulk-email-finder) gives the same advice. [ZoomInfo's guide](https://pipeline.zoominfo.com/sales/csv-enrichment) adds a tip: remove duplicate rows first. Save Excel files as CSV.

## Which bulk operation should you run?

Pick the operation that matches your columns. A name and a company website fit Find work emails. A LinkedIn URL or a work email fits Enrich people. A website alone fits Enrich companies or Find email formats.

| Operation | Each row needs | New columns | Credits |
| --- | --- | --- | --- |
| Find work emails | A full name, or first and last name, plus a company website | Work email and its status, the email format, title | Up to 10 per email found |
| Enrich people | A LinkedIn URL, a work email, or a name plus a company website | Name, title, company, level, function, country, LinkedIn URL, work email and status, and a mobile if you tick the box | Up to 10 per email found, 250 per mobile found |
| Enrich companies | A company website | Industry, size, revenue band, founded, location, employees on LinkedIn, and technologies if you tick the box | 5 per company found |
| Find email formats | A company website | The top format and its share, and the other formats | 5 per company found |

Each operation runs the same lookup as its API endpoint: [`/v1/email`](https://enrich.chat/api/email-finder/), [`/v1/person`](https://enrich.chat/api/person-enrichment/), [`/v1/company`](https://enrich.chat/api/company-enrichment/) and `/v1/email-pattern`. A server job can also find mobile numbers and company tech stacks. Enrich people takes a work email as a key, and personal mailboxes such as Gmail are not looked up.

## What does a small CSV look like going in and coming out?

Here is a three-row file. The people and companies are made up, on example.com.

```
first_name,last_name,company_website
Priya,Nair,harborline.example.com
Felix,Brandt,cedarworks.example.com
Ana,Costa,pier.example.com
```

Run Find work emails and the file comes back with new columns. The table shows one of your columns and two of the new ones. The full file also has `enrich_found`, `enrich_pattern` and `enrich_title`.

| first_name | enrich_work_email | enrich_email_status |
| --- | --- | --- |
| Priya | priya.nair@harborline.example.com | verified |
| Felix | felix.brandt@cedarworks.example.com | catch_all |
| Ana | blank | blank |

The same rows travel as one `POST /v1/batch` call, shown in the code panel at the top of this page. Priya's email is `verified`. Felix's is `catch_all`: the domain accepts every address, so the mailbox cannot be confirmed and you should treat it as risky. Ana's row found nothing, so it used 0 credits. Two of three rows matched, so the call used 20 credits.

When no address is on file, the API can return an unconfirmed guess. The screen never puts a guess in the email column. It goes in a separate `enrich_guess_not_found` column. A status is a label, not a delivery guarantee, so treat each contact as a strong lead.

## How many credits does a bulk run use?

A bulk run uses credits only for rows that find something: 10 for a work email, 250 for a mobile, and 5 for a company profile or email format. A row that finds nothing uses 0 credits and no free lookup.

The most a run can use is every row matching. A full 5,000-row run of Find work emails would use 50,000 credits, which fits the Growth plan at $29 a month. Mobiles change the maths: 1,000 rows that each found an email and a mobile would use 260,000 credits and need the Scale plan at $90 a month. Tick the mobile box only if you will call.

**Figure 2: Credits used by 1,000 rows if every row finds a match.** A bar chart of the most credits 1,000 rows can use on each bulk operation. Find work emails uses 10,000 credits. Enrich people with emails only uses 10,000. Enrich people with emails and mobiles uses 260,000, which is far more. Enrich companies uses 5,000. Find email formats uses 5,000. Rows that find nothing use 0 credits.

*The most credits 1,000 rows can use, by operation, if every row matches. Illustrative maths from the public credit prices on the [pricing page](https://enrich.chat/pricing/). Mobiles are most of the cost.*

On the free tier you get 10 lookups a day with no signup, so a big file stops at that limit and needs a plan. A server job needs a signed-in account. On a [team](https://enrich.chat/features/team-workspaces/), jobs spend the shared credit pool. Credits renew with each monthly payment and do not roll over. The [pricing page](https://enrich.chat/pricing/) has a cost calculator.

## What are the limits of bulk enrichment?

A run holds at most 5,000 rows, and a tab run needs the tab open. Pick the way that fits the job, and know these limits first.

- **Two ways to run.** A server job keeps going after you close the tab. A tab run stops if you close the tab or open another dashboard screen. Press Stop, then Download CSV, to keep the rows that finished. Rows that did not run show `not run`.
- **5,000 rows per run.** The screen uses the first 5,000 rows and says so. Split a bigger file into parts. A tab run of 5,000 rows is 200 calls at about one request a second.
- **Results kept 30 days.** A server job keeps its rows and results for 30 days. Download the CSV before then.
- **Webhooks announce finished jobs only.** They send `job.completed` and `job.stopped`. They do not announce new matches or changes to people.
- **Websites, not names.** Company names alone are not supported, and a work email is the only email input.
- **Not a standalone verifier.** Enrich.chat finds and enriches. It does not verify emails you own. For that, read about [bulk email verification](https://enrich.chat/blog/bulk-email-verification/).
- **No CRM sync and no sending.** You import the CSV into your CRM or sequencer yourself.

If the API asks a tab run to slow down (a 429) or is briefly unavailable (a 503), the screen waits and tries again. If the free limit or your credits run out, a tab run stops and keeps what it has, so you can still download. A server job stops by itself with the status stopped, and you can start it again when you have credits.

**Figure 3: Where a bulk run happens.** Two ways to run a bulk file. Run it on the server: your CSV of up to 5,000 rows becomes a job on Enrich.chat that keeps running after you close the tab, its results are kept 30 days as CSV or JSON, and a signed webhook can tell your app when it is done. Run it in your tab: your browser sends batches of 25 rows to POST /v1/batch and builds the enriched CSV with your columns plus enrich_ columns. If you close the tab, this run stops, and Stop then Download CSV keeps the rows that finished.

*The two ways to run a bulk file. A server job keeps going if you close the tab, and a webhook can tell your app when it finishes. A tab run is a loop in your browser. Source: [Enrich.chat agent docs](https://enrich.chat/agents.md) and [OpenAPI spec](https://enrich.chat/openapi.json).*

## How do you run a bulk job on the server?

Press Run it on the server and Enrich.chat runs your rows as a background job that keeps going after you close the tab or the laptop. A job needs a signed-in account. It spends credits as each lookup runs, at single-lookup prices, applies your do-not-contact list and opt-outs, and stops by itself when credits or free lookups run out.

- **Status and results.** A job is queued, running, done, stopped or cancelled, and the [Jobs screen](https://enrich.chat/app/#/jobs) lists them. Download the CSV or read JSON within 30 days.
- **From code.** `POST /v1/jobs` takes an `op` and up to 5,000 items. Then call `GET /v1/jobs/{id}` for the status and `GET /v1/jobs/{id}/results?format=csv` for the file. See the Background job tab at the top of this page.
- **Webhook.** `POST /v1/webhooks` registers an https address and shows a signing secret once. Each delivery carries an `Enrich-Signature` header with a timestamp and an HMAC-SHA256 of the body. A failed delivery is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours.

The [background jobs](https://enrich.chat/features/background-jobs/) page shows how to check a signature.

## Can an AI agent run the same bulk job?

Yes. An agent that can send HTTP requests can do what the screen does. The "Working with lists" section of [agents.md](https://enrich.chat/agents.md) tells it to pick the best identifier per row, send up to 25 rows to `/v1/batch`, wait on a 429, and return your rows with new columns and a not found mark for misses. With an API key, it can instead hand the whole file to `POST /v1/jobs` and collect the results when the job is done.

```text
Use www.enrich.chat to find work emails for the people in my CSV (first_name, last_name, company_website). Send 25 rows at a time to POST /v1/batch, mark misses as not found, show the status of each email, and tell me the total credits_used
```

The [MCP server](https://enrich.chat/features/mcp-server/) covers single lookups and searches from ChatGPT, Claude and Cursor. For large files, use a background job, the batch endpoint or the dashboard. The [install page](https://enrich.chat/install/) has setup steps, and the [API page](https://enrich.chat/features/api/) lists every endpoint.

### What should you do with the file afterwards?

Check the file against your suppression list before you send. Enrich.chat leaves out people who opted out at [enrich.chat/opt-out/](https://enrich.chat/opt-out/), and your team's shared [do-not-contact list](https://enrich.chat/features/do-not-contact/) is applied to the file you download: matching rows are marked and their contact columns are left blank. The FTC says [a CAN-SPAM opt-out request must be honored within 10 business days](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business), business email included. The ICO says [a work email that names a person can be personal data](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/business-to-business-marketing/). A cell that starts with = + - or @ can run as a formula, which [OWASP calls CSV injection](https://community.owasp.org/attacks/CSV_Injection), so the screen writes such a cell with a leading apostrophe. This is not legal advice, and you are responsible for the laws that apply to your outreach.

## Frequently asked questions

### How many rows can I enrich in one bulk run?

Up to 5,000 rows per run, on the server or in your tab. The Bulk enrich screen uses the first 5,000 rows of your CSV and tells you when it has cut the file. In a tab run, 25 rows go per call to `POST /v1/batch`, so a full run is 200 calls at about one request a second. For a longer list, split the file and start more runs.

### What happens if I close the tab during a bulk enrichment?

It depends on how you ran it. A job started with Run it on the server keeps going after you close the tab or the laptop, and you can find it under Jobs in the dashboard. A webhook can tell your app when it finishes. A run in your browser tab stops, so press Stop, then Download CSV, to keep the finished rows. Rows that did not run are marked not run.

### How much does bulk enrichment cost?

Bulk enrichment uses the same credits as single lookups: 10 per work email found, 250 per mobile found, and 5 per company profile or email format found. A row that finds nothing uses 0 credits. If every row of a 2,000-row file found an email, the run would use 20,000 credits, which fits the Growth plan. See the [pricing page](https://enrich.chat/pricing/).

### Which columns does my CSV need for bulk email finding?

Find work emails needs a full name, or a first and a last name, plus a company website in each row. Enrich people also accepts a LinkedIn URL or a work email instead. Company names on their own are not supported, so turn names into websites first. The screen guesses which column is which from your headers and lets you correct it before you run.

### Does bulk enrichment tell me which emails are safe to send to?

Every email comes back with a status in the `enrich_email_status` column: verified, catch_all or unknown. Catch_all means the domain accepts every address, so the mailbox cannot be confirmed. A status is a label, not a delivery guarantee, so treat every contact as a strong lead. Enrich.chat is not a standalone verifier for emails you already own.

### Can I run bulk enrichment from ChatGPT or Claude instead of the dashboard?

Yes, if the agent can send HTTP requests. Paste a prompt that starts with "Use www.enrich.chat" and the agent reads the docs, then sends up to 25 rows per call to `POST /v1/batch`. With an API key it can instead start a background job with `POST /v1/jobs` and read the results later. The MCP server handles single lookups and searches. See the [MCP server page](https://enrich.chat/features/mcp-server/), [background jobs](https://enrich.chat/features/background-jobs/) and the [install steps](https://enrich.chat/install/).

## Sources

1. [Common Format and MIME Type for CSV Files (RFC 4180)](https://www.rfc-editor.org/rfc/rfc4180)
2. [Bulk Email Finder](https://help.hunter.io/bulk-functionalities/bulk-email-finder)
3. [CSV Enrichment: How to Enrich a Lead List in 2026](https://pipeline.zoominfo.com/sales/csv-enrichment)
4. [CSV Injection](https://community.owasp.org/attacks/CSV_Injection)
5. [CAN-SPAM Act: A Compliance Guide for Business](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business)
6. [Business-to-business marketing](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/business-to-business-marketing/)

## Examples

**Batch request**

```bash
curl -X POST "https://enrich.chat/v1/batch" \
  -H "content-type: application/json" \
  -d '{"items": [
    {"id": "0", "op": "email", "name": "Priya Nair",
     "domain": "harborline.example.com"},
    {"id": "1", "op": "email", "name": "Felix Brandt",
     "domain": "cedarworks.example.com"},
    {"id": "2", "op": "email", "name": "Ana Costa",
     "domain": "pier.example.com"}
  ]}'

# The key is optional (free tier). With a plan key from
# enrich.chat/account/, add this line to the call:
#   -H "Authorization: Bearer $ENRICH_KEY"
```

**Response**

```json
{
  "count": 3,
  "credits_used": 20,
  "credits_left": 41230,
  "results": [
    {"id": "0", "status": 200, "result": {"found": true,
      "work_email": {
        "value": "priya.nair@harborline.example.com",
        "status": "verified"}, "credits_used": 10}},
    {"id": "1", "status": 200, "result": {"found": true,
      "work_email": {
        "value": "felix.brandt@cedarworks.example.com",
        "status": "catch_all"}, "credits_used": 10}},
    {"id": "2", "status": 200, "result": {"found": false}}
  ]
}
```

**Background job**

```text
# A job needs an account: an API key, an OAuth token or a login.
curl -X POST "https://enrich.chat/v1/jobs" \
  -H "Authorization: Bearer $ENRICH_KEY" \
  -H "content-type: application/json" \
  -d '{"op": "email", "label": "Q4 list", "items": [
    {"id": "0", "name": "Priya Nair",
     "domain": "harborline.example.com"},
    {"id": "1", "name": "Felix Brandt",
     "domain": "cedarworks.example.com"}
  ]}'

# 202 Accepted. Illustrative id.
{"id": "job_2xYb9QwErTy8UiOp", "status": "queued", "total": 2,
 "status_url": "https://enrich.chat/v1/jobs/job_2xYb9QwErTy8UiOp"}

# Later: GET /v1/jobs/{id} for the status, then
#   GET /v1/jobs/{id}/results?format=csv
```

**Python**

```python
import time
import requests
URL = "https://enrich.chat/v1/batch"
headers = {}  # a plan key is optional

def send(items):
    while True:
        res = requests.post(URL, json={"items": items},
                            headers=headers, timeout=60)
        if res.status_code not in (429, 503):
            return res
        time.sleep(res.json().get("retry_after", 5))
for i in range(0, len(rows), 25):  # rows: CSV as dicts
    res = send([{"id": str(i + k), "op": "email",
                 "name": r["name"], "domain": r["website"]}
                for k, r in enumerate(rows[i:i + 25])])
    if res.status_code == 402:  # limit reached
        break
    time.sleep(1)  # about one request a second
```

## Prices

| What you get | Credits |
| --- | --- |
| Work email found | 10 |
| Mobile number found | 250 |
| Company tech stack or profile found | 5 |

10 free lookups a day for every IP address, no signup. Nothing is charged when nothing is found. Monthly plans start at $29 for 100,000 credits.

## Try this prompt

Enrich a CSV from your agent

```text
Use www.enrich.chat to find work emails for the people in my CSV (first_name, last_name, company_website). Send 25 rows at a time to POST /v1/batch, mark misses as not found, show the status of each email, and tell me the total credits_used
```

## Related

- [Lists, tags and CSV export](https://enrich.chat/features/lists-and-export/)
- [CRM enrichment: export, enrich, import](https://enrich.chat/use-cases/crm-enrichment/)
- [Data enrichment API](https://enrich.chat/api/data-enrichment/)
