# Email Lead Generator - Businesses + Verified Emails (`apricot_blackberry/email-lead-generator`) Actor

Give it an industry and a location; it discovers the businesses and returns each with MX-verified emails, phone, address, and a lead score. Discovery-first lead gen - you do not supply domains, unlike an email finder. Pay only per qualified lead with a verified email.

- **URL**: https://apify.com/apricot\_blackberry/email-lead-generator.md
- **Developed by:** [Creator Fusion](https://apify.com/apricot_blackberry) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 qualified leads

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

## Email Lead Generator — Find Businesses + Verified Emails

**Give an industry and a location. Get back a list of real local businesses, each with MX-verified contact emails and a lead score.**

This is a **discovery-based lead generator**, not a domain email finder. You do **not** need to know any companies or domains up front — the actor discovers the businesses for you from OpenStreetMap, then finds and verifies their emails.

> Already have a company or domain and just want its emails? Use a domain email finder (e.g. `b2b-email-finder-pro` / `contact-email-finder`) instead. This actor is for when you only know the *type* of business and *where*.

### What it does

1. Maps your `category` to OpenStreetMap tags and geocodes your `location` (Nominatim) to a search area (or accepts a bounding box directly).
2. Queries the Overpass API for matching businesses — name, website, phone, address — with automatic mirror fallback (free, no API key, no CAPTCHA).
3. For each business with a website, fetches the homepage plus `/contact` and `/about` (direct first, your proxy only if blocked), extracts same-domain emails, validates MX records, dedupes, and scores deliverability.
4. Emits one lead per business.

By default (`requireEmail=true`) only businesses with at least one MX-verified email are returned and charged.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `category` | string | yes | Business type, e.g. `restaurant`, `law firm`, `dentist`, `plumber`, `marketing agency`. |
| `location` | string | yes | City/region (`Portland, Oregon`) geocoded to an ~8 km radius, or a bbox `south,west,north,east`. |
| `maxResults` | integer | no | Max qualified leads to return (default 50). |
| `requireEmail` | boolean | no | Only emit/charge leads with a verified email (default true). |
| `proxyConfiguration` | object | no | Optional Apify Proxy, billed to **your** account. Off by default. |

### Output

One row per lead in the dataset:

```json
{
  "businessName": "Stumptown Coffee Roasters",
  "category": "cafe",
  "address": "128 SW 3rd Ave Portland OR 97204",
  "phone": "+1-503-295-6144",
  "website": "https://www.stumptowncoffee.com",
  "emails": [
    { "email": "info@stumptowncoffee.com", "type": "role", "mxValid": true, "deliverability": 5 }
  ],
  "leadScore": 90,
  "source": "osm",
  "scrapedAt": "2026-09-19T00:00:00.000Z"
}
```

If discovery finds no businesses, or none have a verified email, the run still finishes **SUCCEEDED** with a single summary row `{ "leadsFound": 0, "note": "..." }` and charges nothing.

### Run it

#### MCP (Claude / any MCP client)

Call the actor `apricot_blackberry/email-lead-generator` with:

```json
{ "category": "coffee shop", "location": "Portland, Oregon", "maxResults": 10 }
```

#### API (curl)

```bash
curl -X POST "https://api.apify.com/v2/acts/apricot_blackberry~email-lead-generator/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"category":"law firm","location":"Austin, Texas","maxResults":25}'
```

#### JavaScript (apify-client)

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('apricot_blackberry/email-lead-generator').call({
  category: 'dentist',
  location: 'Denver, Colorado',
  maxResults: 30,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python (apify-client)

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("apricot_blackberry/email-lead-generator").call(run_input={
    "category": "plumber",
    "location": "Seattle, Washington",
    "maxResults": 40,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Pricing

Pay-per-event: a small actor-start fee plus a per-lead fee charged **only** for qualified leads actually emitted. Zero-result runs cost only the start fee. Apify Proxy (if you enable it) is billed directly to your account.

### Notes & limits

- Data source is OpenStreetMap (Overpass + Nominatim). Coverage depends on OSM completeness for the area; dense urban categories return the most.
- Emails are discovered from the business's own website (same-domain only) and OSM `contact:email` tags — no pattern guessing. `mxValid` confirms the domain can receive mail, not that a specific mailbox exists.
- Very large areas are capped; narrow the location or category for best density.

# Actor input Schema

## `category` (type: `string`):

The kind of business to discover (e.g. "restaurant", "law firm", "dentist", "plumber", "marketing agency"). Common categories map to precise OpenStreetMap tags; anything else falls back to a name match. Required.

## `location` (type: `string`):

Where to search: a city/region string (e.g. "Portland, Oregon") which is geocoded to an 8 km search radius, OR a bounding box as "south,west,north,east" decimal degrees (e.g. "45.4,-122.8,45.6,-122.5"). Required.

## `maxResults` (type: `integer`):

Maximum number of qualified leads to return. The actor discovers more businesses than this internally (many lack a website/email) and stops once this many leads are emitted.

## `requireEmail` (type: `boolean`):

When true (default), only businesses with at least one MX-verified email are emitted and charged. Set false to also return discovered businesses that have no verified email (still billed per emitted lead).

## `proxyConfiguration` (type: `object`):

Proxy is OFF by default to save you money. Discovery (OpenStreetMap) and most business homepages fetch fine WITHOUT a proxy. Enable Apify Proxy only if you hit anti-bot pages or 403/429 errors. When enabled, Apify Proxy traffic is billed directly to YOUR Apify account (not bundled in this actor's per-lead price).

## Actor input object example

```json
{
  "category": "coffee shop",
  "location": "Portland, Oregon",
  "maxResults": 50,
  "requireEmail": true
}
```

# Actor output Schema

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

All lead rows, each with businessName, category, address, phone, website, an emails\[] array (email, type, mxValid, deliverability 1-5), and a leadScore 0-100.

# 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 = {
    "category": "coffee shop",
    "location": "Portland, Oregon"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apricot_blackberry/email-lead-generator").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 = {
    "category": "coffee shop",
    "location": "Portland, Oregon",
}

# Run the Actor and wait for it to finish
run = client.actor("apricot_blackberry/email-lead-generator").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 '{
  "category": "coffee shop",
  "location": "Portland, Oregon"
}' |
apify call apricot_blackberry/email-lead-generator --silent --output-dataset

```

## MCP server setup

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

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/jx0Vd2S9t3G9eqEIW/builds/ERRhgC2tAumadfDpN/openapi.json
