# Generador de Leads B2B con Email Verificado y Teléfono (`lentic_euphonium/lead-generator`) Actor

Extrae listas de empresas locales (leads B2B) por sector y ciudad, con email verificado, teléfono, web y dirección. Datos limpios, deduplicados y de fuente abierta (OpenStreetMap). 30 sectores.

- **URL**: https://apify.com/lentic\_euphonium/lead-generator.md
- **Developed by:** [toni lopera](https://apify.com/lentic_euphonium) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 0 monthly users, 97.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does B2B Lead Generator do?

**Generate clean B2B lead lists of local businesses for any city in the world** — pick a sector (dentists, restaurants, law firms, gyms, electricians… 51 sectors) and a city, and get a deduplicated list with **DNS-verified emails**, **normalized phone numbers** (international E.164 format, mobile/landline), websites and structured addresses. Built on **legal open data from [OpenStreetMap](https://www.openstreetmap.org/)** — a **GDPR-defensible** source, unlike scraped or purchased lists of murky origin.

Download results as **CSV, Excel, JSON or HTML**, or consume them via API. Schedule weekly runs to keep your lists fresh.

### Why use this lead generator?

In B2B data, what matters is not volume — it's **deliverability**. A list full of dead emails burns your sender domain and kills the campaign. This Actor attacks exactly that:

- ✅ **DNS-verified emails (MX records)** — every email is checked so you know the domain actually accepts mail. Turn on *Only verified emails* to get just the deliverable slice.
- ✅ **Email enrichment** — businesses rarely publish emails in open data, so the Actor visits each website (home, contact, legal pages) and recovers the missing emails.
- ✅ **Normalized phones** (E.164) classified as mobile/landline — ready for calls or WhatsApp outreach.
- ✅ **Legal open-data source** (OpenStreetMap) — defensible under GDPR, no ToS-violating scraping.
- ✅ **No duplicates**, structured addresses, and a `data_quality` score per lead.
- ✅ **Works worldwide** — any city, any country (set the 2-letter country code).

> Example: Barcelona returns **12,000+ businesses** across sectors, thousands with normalized phones and **1,600+ with DNS-verified emails**. See a full [free sample dataset here](https://github.com/toni646/barcelona-business-leads-free), or browse live per-city/per-sector statistics in the [Spanish business directory](https://toni646.github.io/barcelona-business-leads-free/) built with this Actor.

### How to generate B2B leads by city and sector

1. Choose a **sector** (51 available).
2. Type the **city** and **country code** (e.g. `Barcelona`, `ES` — or `Austin`, `US`).
3. Optionally require **verified email**, **phone** or **website** only.
4. Click **Start** and download your list in CSV, Excel or JSON.

### Input

| Field | Description |
|-------|-------------|
| `sector` | Business type (51 sectors: healthcare, professional services, trades, retail, hospitality…). |
| `city` | City or municipality, anywhere in the world. |
| `countryCode` | 2-letter ISO code. Scopes the search and normalizes phone formats. |
| `maxResults` | Max leads to return (0 = unlimited). |
| `requireVerifiedEmail` | Only leads with a deliverable (MX-verified) email. |
| `requirePhone` / `requireWebsite` | Filter by contact channel. |
| `enrichEmails` | Visit websites to recover missing emails (recommended, on by default). |

### Output example

```json
{
  "name": "Clínica Garzón Dental",
  "phone": "+34933000000",
  "phone_type": "fijo",
  "email": "info@garzondental.com",
  "email_verified": true,
  "email_source": "website",
  "website": "https://garzondental.com/",
  "address": "Carrer de Provença 490",
  "postcode": "08025",
  "city": "Barcelona",
  "extracted_at": "2026-07-04",
  "data_quality": 1.0
}
```

### Data fields

| Field | Meaning |
|-------|---------|
| `name` | Business name. |
| `phone` / `phone_type` | International phone (E.164) and type (mobile/landline). |
| `email` / `email_verified` | Email and whether its domain accepts mail (MX check). |
| `email_source` | Where the email came from: open data (`osm`) or the business `website`. |
| `website` | Business website. |
| `address` / `postcode` / `city` | Structured address. |
| `opening_hours` | Opening hours when available. |
| `extracted_at` | Extraction date (data freshness). |
| `data_quality` | 0–1 score based on contact fields present. |

### How much does it cost?

**Pay per result: $5 per 1,000 leads** ($0.005 per lead) — no subscription, no minimum. A typical city+sector list (a few hundred leads) costs **under $2**. Compare that with lead databases charging $50–200/month, or manual research at ~1 minute per lead.

Free Apify accounts include enough credit to try it out.

### Use cases

- **Agencies & freelancers**: build call/email lists for local-business clients (dentists for a dental-marketing agency, restaurants for a POS reseller…).
- **Cold email & telemarketing**: deliverable, verified emails keep bounce rates low and protect your domain.
- **Market research**: count and map competitors by neighborhood (includes lat/lon coordinates).
- **CRM seeding**: import clean CSVs straight into HubSpot, Pipedrive, Salesforce, etc.

### FAQ & legal

**Is this legal?** The data comes from OpenStreetMap, a public open-data project (ODbL license) — not from scraping websites against their ToS. Using leads for commercial outreach is your responsibility and must comply with applicable law (GDPR: legitimate interest, right to object; CAN-SPAM, etc.). Business contact data of companies is generally the safest category under GDPR.

**Why are some emails missing?** Not every business publishes one. The enrichment step recovers many by visiting their websites; the `email_verified` flag tells you which ones are deliverable.

**Does it work outside Spain?** Yes — anywhere OpenStreetMap has coverage (i.e., worldwide). Data density varies by country; European cities are especially rich.

**Found a bug or want a new sector?** Open a ticket in the **Issues** tab — new sectors are easy to add.

***

### 🇪🇸 Generador de leads B2B con email verificado

Elige **sector y ciudad** y obtén una lista limpia de empresas locales: **email verificado por DNS (MX)**, **teléfono normalizado** (móvil/fijo), web y dirección, sin duplicados. Fuente **legal y abierta** (OpenStreetMap), defendible bajo **RGPD** — nada de bases compradas de origen dudoso.

**Precio: 5 $ por cada 1.000 leads**, sin suscripción. Una lista típica de un sector en tu ciudad cuesta menos de 2 $. Descarga en CSV, Excel o JSON, o prográmalo semanalmente para tener datos siempre frescos.

Muestra gratuita: [12.602 empresas de Barcelona](https://github.com/toni646/barcelona-business-leads-free) · [Directorio por ciudad y sector](https://toni646.github.io/barcelona-business-leads-free/) (7 ciudades, 204 categorías).

# Actor input Schema

## `sector` (type: `string`):

Type of business to generate leads for.

## `city` (type: `string`):

City or municipality to search. Works worldwide (e.g. Barcelona, Berlin, Austin).

## `countryCode` (type: `string`):

2-letter ISO country code (e.g. ES, DE, US). Scopes the search and normalizes phone numbers.

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

Maximum number of leads to return (0 = unlimited).

## `requirePhone` (type: `boolean`):

Discard leads without a valid phone number.

## `requireWebsite` (type: `boolean`):

Discard leads without a website.

## `requireVerifiedEmail` (type: `boolean`):

Return only leads whose email domain is verified (accepts mail, has MX records). The premium slice: maximum deliverability.

## `enrichEmails` (type: `boolean`):

Visit business websites to recover emails missing from open data. Greatly improves email coverage; makes the run slower.

## Actor input object example

```json
{
  "sector": "dentist",
  "city": "Barcelona",
  "countryCode": "ES",
  "maxResults": 200,
  "requirePhone": false,
  "requireWebsite": false,
  "requireVerifiedEmail": false,
  "enrichEmails": true
}
```

# Actor output Schema

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

No description

# 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 = {
    "city": "Barcelona",
    "countryCode": "ES"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lentic_euphonium/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 = {
    "city": "Barcelona",
    "countryCode": "ES",
}

# Run the Actor and wait for it to finish
run = client.actor("lentic_euphonium/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 '{
  "city": "Barcelona",
  "countryCode": "ES"
}' |
apify call lentic_euphonium/lead-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lentic_euphonium/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/diJm6aIQueGLxSbxW/builds/2OG1mg49NgXCaJbNA/openapi.json
