# Bulk Email Finder & Verifier ✅ No API Key (`crustapi/email-finder-verifier`) Actor

Find a work email from a name plus company domain, or verify emails you already have. Bulk email verification with every found address checked on the mail server first. Pay only for a clear answer, no API key needed.

- **URL**: https://apify.com/crustapi/email-finder-verifier.md
- **Developed by:** [CrustAPI](https://apify.com/crustapi) (community)
- **Categories:** Lead generation, Agents, AI
- **Features:** Limited permissions
- **Stats:** 136 total users, 29 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 verified email founds

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## What is Email Finder & Verifier?

Two jobs in one actor. **Find** a work email from a person's name and their company domain, or **check** emails you already have. Both kinds of line can go in the same run.

- 🔎 Find: a full name plus a company domain returns a work email, already verified
- ✅ Check: paste addresses you have and get real, dead, or catch-all back
- 🚫 Never a guess: an address we could not confirm on the mail server is not returned or charged
- 🔑 No account and no API key to set up
- 📦 Export as JSON, CSV, Excel, HTML, or XML

### What data do I get?

| Field | Example |
|---|---|
| Email | jane.doe@acme.com |
| Email status | verified, invalid, catch_all, or unknown |
| Full name | Jane Doe |
| First / last name | Jane · Doe |
| Company domain | acme.com |
| Company | Acme Inc, when your line included one |

**Good to know**

- Finding an email always includes verification, so a delivered find is already confirmed.
- `catch_all` means the domain accepts every address, so no tool on earth can confirm that one mailbox. We label it instead of pretending.
- A find needs **both** a full name and a domain. We never invent a domain from a company name, because a made-up domain produces a made-up email.

### Pricing

**$5.00 per 1,000 emails found** ($0.005 each) and **$2.00 per 1,000 emails checked** ($0.002 each).

You are only charged for a clear answer. A find that comes up empty is free. A check that returns catch-all or unknown is free. There is no charge to start a run.

| Run | Actor cost |
|---|---|
| 1,000 emails found | $5.00 |
| 1,000 emails checked | $2.00 |
| 10,000 emails checked | $20 |

### How it works

1. Put one lead per line in the input box. Mix both kinds freely:
   - `Jane Doe, acme.com` finds and verifies her work email
   - `jane@acme.com` checks an address you already have
2. Or upload a CSV instead, with a header row using any of: email, fullName, firstName, lastName, domain, company.
3. Set **Max results** if you want a cost cap. Leave it at 0 to process the whole list.
4. Click **Start**, then download JSON, CSV, or Excel.

### Output sample

```json
{
  "fullName": "Dharmesh Shah",
  "firstName": "Dharmesh",
  "lastName": "Shah",
  "company": null,
  "companyDomain": "hubspot.com",
  "email": "dharmesh.shah@hubspot.com",
  "emailStatus": "verified"
}
```

### FAQ

**What is the difference between finding and checking?** Finding starts from a name and a domain and works out the address, then verifies it. Checking starts from an address you already have and tells you whether it is real. Finding costs more because it does both jobs.

**Why do I need the company domain to find an email?** Because we will not guess one. "Acme Inc" could be acme.com, acme.io, or acmeinc.com, and guessing wrong produces an address that bounces. Paste the domain from their website and the result is reliable.

**What does catch_all mean?** The company's mail server accepts every address, real or not, so no one can confirm that specific mailbox. We return it labelled rather than calling it verified, and you are not charged for it.

**Will these emails bounce?** A `verified` result was confirmed on the mail server at the moment we checked. Nothing can promise a mailbox stays live forever, but this is the strongest signal available without sending.

**Can I run big lists?** Yes. Paste as many lines as you like or upload a CSV, and use Max results to cap a test run.

### More from CrustAPI

| Actor | What it does |
|---|---|
| [LinkedIn Profile Scraper + Verified Email](https://apify.com/crustapi/linkedin-profile-scraper-email-finder) | Public profiles plus a verified work email |
| [LinkedIn Company Details Scraper](https://apify.com/crustapi/linkedin-company-scraper) | Size, industry, HQ, employee count, numeric IDs |
| [LinkedIn Company Posts Scraper](https://apify.com/crustapi/linkedin-company-posts-scraper) | Latest posts from any company page |
| [Google Maps Scraper](https://apify.com/crustapi/google-maps-scraper) | Every business in any area |

Need volume beyond Apify? See [crustapi.com/wholesale](https://crustapi.com/wholesale).

### Support and feedback

We ship improvements weekly, and user reports drive the roadmap. Something broken or missing?

- Open an issue on this actor's **Issues** tab in Apify Console
- Or email us at <support@crustapi.com>

# Actor input Schema

## `leads` (type: `array`):

One per line. Two kinds of line work, and you can mix them freely.

**To FIND an email** paste a full name and the company domain, separated by a comma: `Jane Doe, acme.com`. Both parts are required, because we never invent a domain. Every email we find is also verified before it is returned.

**To CHECK an email you already have** paste the address on its own: `jane@acme.com`.

## `leadsFile` (type: `array`):

Upload a CSV instead of pasting. Use a header row with any of these columns: email, fullName, firstName, lastName, company, domain. To FIND an email, a row needs a name and a domain. To VERIFY, a row needs an email. Export from Excel or Google Sheets as CSV.

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

Stop after this many results, a simple cost cap. Leave at 0 to process every lead.

## `emailApiKey` (type: `string`):

API key for the email engine. Usually set once by the actor owner as the EMAIL_API_KEY secret environment variable. Stored encrypted.

## `emailApiBaseUrl` (type: `string`):

Base URL of the email engine. Normally set once via the EMAIL_API_BASE_URL environment variable. Advanced.

## `emailMinConfidence` (type: `integer`):

Discard found emails scoring below this (0 = keep every verified hit). Advanced.

## `maxConcurrency` (type: `integer`):

Parallel lookups. Advanced - sensible default applied.

## Actor input object example

```json
{
  "leads": [
    "Jane Doe, acme.com",
    "Satya Nadella, microsoft.com",
    "jane@acme.com"
  ],
  "maxItems": 0
}
```

# Actor output Schema

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

Found + verified emails and list-verification results.

# 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 = {
    "leads": [
        "Jane Doe, acme.com",
        "Satya Nadella, microsoft.com",
        "jane@acme.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crustapi/email-finder-verifier").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 = { "leads": [
        "Jane Doe, acme.com",
        "Satya Nadella, microsoft.com",
        "jane@acme.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("crustapi/email-finder-verifier").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 '{
  "leads": [
    "Jane Doe, acme.com",
    "Satya Nadella, microsoft.com",
    "jane@acme.com"
  ]
}' |
apify call crustapi/email-finder-verifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crustapi/email-finder-verifier"
        }
    }
}
```

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/H1oDA71RpD5UgiO6d/builds/w3qcr0WWuyzP6xssj/openapi.json
