# Company Name to Email Finder (MX-Checked) (`leadharbor/company-email-finder`) Actor

Company name in, MX-checked emails out. No website needed. Pay only for companies that return an MX-checked email.

- **URL**: https://apify.com/leadharbor/company-email-finder.md
- **Developed by:** [Mohammed Samaan](https://apify.com/leadharbor) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Company Name to MX-Checked Email Finder

Company name in, MX-checked emails out. No website or domain needed. Give it company names and get each company's official domain and contact emails that passed an MX check. You pay only for companies that return at least one MX-checked email.

### What it does

1. Finds the company's official website from its name.
2. Reads the homepage and the usual contact pages (contact, about, support, legal).
3. Collects email addresses published on the site, keeps only addresses on the company's own domain (or a sister domain carrying the company name, such as damacgroup.com for Damac), and checks that the domain can receive mail (MX records).
4. Returns named mailboxes first, role inboxes (info@, sales@) after.

### Input

| Field | Meaning |
|---|---|
| `companies` | One company name per line. Add a city or country for common names. |
| `country` | Optional hint such as `UAE` or `Germany` to pick the right local company. |
| `maxEmailsPerCompany` | 1 to 10, default 3. |
| `includePersonalEmails` | Off by default. Turns on gmail, outlook and similar addresses found on the site. |

### Output

One row per MX-checked email:

```json
{
  "company": "Stripe",
  "domain": "stripe.com",
  "email": "support@stripe.com",
  "emailType": "role",
  "mxVerified": true,
  "sourceUrl": "https://stripe.com/impressum",
  "status": "ok"
}
```

Companies with no result get one unbilled row with `status` set to `domain_not_found` or `no_verified_email`, so you can see exactly what was skipped.

### Pricing

- $0.005 per company that returns at least one MX-checked email.
- $0.001 per run start (Apify charges one start event per GB of memory, minimum one).
- Companies with no MX-checked email are free.

### Limits

- MX-checked means the domain accepts mail. It does not prove a specific mailbox exists.
- Only emails published on the company's own site are returned. Sites that publish no email on the pages we read (in the test below: Almarai) return `no_verified_email` and are free. The domain is picked from search results or by trying the name with common domain endings, so it can be wrong or missing; check the `domain` field: an early test resolved "Lulu Hypermarket" to the different company lulu.com; since build 0.1.9 a one-word match is rejected and that name returns `domain_not_found`. Add a country or city to the name to reduce this. Email addresses are never guessed or generated.
- Very small businesses without a website return `domain_not_found`.

### Example input

```json
{
  "companies": ["Emaar Properties", "Damac Properties"],
  "country": "UAE",
  "maxEmailsPerCompany": 3
}
```

### Good fits

Lead lists from a spreadsheet of company names, CRM enrichment, AI agents that need a contact address for a named company.

### FAQ

**What do I pay for?** One event per company that returns at least one MX-checked email on its own domain, plus $0.001 per run start. Rows with `domain_not_found` or `no_verified_email` are not charged.

**Are the emails guessed?** No. Only addresses published on the company's own site are returned.

**What if the company name is common?** Add a country or city to the name, or set `country`. One-word matches are rejected, but the domain is picked from search results or by trying the name with common domain endings, so it can be wrong; check the `domain` field.

**Does it prove the mailbox exists?** No. The MX check only confirms the domain accepts mail.

**What if the run hits my spending limit?** The remaining companies are skipped and the run log says so.

### Test results (19 Oct 2026, 5 companies, one run)

| Company | Domain found | MX-checked emails | Result |
|---|---|---|---|
| Stripe | stripe.com | 3 | ok |
| Emaar Properties | emaar.com | 3 (on emaar.ae) | ok |
| Damac Properties | damacproperties.com | 1 (on damacgroup.com) | ok |
| Almarai | almarai.com | 0 | no_verified_email (free) |
| Lulu Hypermarket | not found (build 0.1.9; build 0.1.8 returned the wrong company lulu.com) | 0 | domain_not_found (free) |

3 of 5 companies returned an MX-checked email (60%). 4 of 5 domains were correct in build 0.1.8; in 0.1.9 the fifth is reported as not found instead of wrong. The run cost under $0.001 in platform usage. Small sample: treat it as a sanity check, not a guarantee.

# Actor input Schema

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

One company name per line, for example "Stripe" or "Emaar Properties". Add a city or country to disambiguate common names.

## `country` (type: `string`):

Appended to the domain search to pick the right local company, for example "UAE" or "Germany".

## `maxEmailsPerCompany` (type: `integer`):

MX-checked emails returned per company. You are charged once per company that returns at least one.

## `includePersonalEmails` (type: `boolean`):

Off by default. Only addresses on the company's own domain are returned.

## Actor input object example

```json
{
  "companies": [
    "Emaar Properties",
    "Stripe"
  ],
  "country": "",
  "maxEmailsPerCompany": 3,
  "includePersonalEmails": false
}
```

# Actor output Schema

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

Table of companies, domains and MX-checked emails.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "Emaar Properties",
        "Stripe"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leadharbor/company-email-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "Emaar Properties",
        "Stripe",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("leadharbor/company-email-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "Emaar Properties",
    "Stripe"
  ]
}' |
apify call leadharbor/company-email-finder --silent --output-dataset

```

## MCP server setup

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

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/t1zo1GSSMJHni3vCD/builds/ljZMttXkwkR0iU5C4/openapi.json
