# Email & Social Lead Finder (`axel_brasil/email-social-lead-finder`) Actor

Crawl any list of websites and extract emails, phone numbers, social profiles and page metadata for lead generation.

- **URL**: https://apify.com/axel\_brasil/email-social-lead-finder.md
- **Developed by:** [Lucas Bonardo](https://apify.com/axel_brasil) (community)
- **Categories:** Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 pages

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/platform/actors/running/actors-in-store#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

## Email & Social Lead Finder

Crawl any list of websites and pull out the contact signals that matter for
lead generation: **email addresses, phone numbers, social media profiles** and
**page metadata** — one clean row per page.

Point it at a company's homepage or contact page, let it follow same-domain
links a hop or two deep, and export the results as JSON, CSV or Excel.

### What it does

- Fetches each start URL with a fast HTTP crawler (no browser overhead).
- Follows **same-domain** links up to a configurable depth.
- Extracts:
  - **Emails** — from visible text, `mailto:` links, and common obfuscations
    (`name [at] domain (dot) com`).
  - **Phones** — from `tel:` links and text, normalised to digits with an
    optional leading `+` (7–15 digits, E.164-friendly).
  - **Social profiles** — Facebook, Instagram, X/Twitter, LinkedIn, YouTube,
    TikTok, Pinterest, GitHub, Telegram, WhatsApp, Medium, Threads, Discord.
    Share/intent widgets are filtered out.
  - **Metadata** — title, description, Open Graph tags, canonical URL, language.
- Respects `robots.txt` (toggleable) and rate limits (`maxRequestsPerMinute`,
  `maxConcurrency`).

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | — | Pages to crawl (required). |
| `maxCrawlDepth` | integer | `1` | Link hops to follow (`0` = start URLs only). |
| `maxRequestsPerCrawl` | integer | `100` | Total page cap per run. |
| `sameDomainOnly` | boolean | `true` | Keep the crawl on the start domain. |
| `includeSubdomains` | boolean | `true` | Treat subdomains as the same site. |
| `extractPhoneNumbers` | boolean | `true` | Toggle phone extraction. |
| `onlyPagesWithContacts` | boolean | `false` | Drop rows with no contacts found. |
| `respectRobotsTxt` | boolean | `true` | Honour `robots.txt` disallow rules. |
| `maxConcurrency` | integer | `10` | Parallel requests. |
| `maxRequestsPerMinute` | integer | `120` | Politeness throttle. |
| `requestTimeoutSecs` | integer | `30` | Per-page navigation timeout. |
| `proxyConfiguration` | object | — | Optional Apify Proxy settings. |

See [`.actor/input_schema.json`](.actor/input_schema.json) for the full schema.

### Output

Each dataset row:

```json
{
  "url": "https://acme.example/contact",
  "depth": 1,
  "title": "Contact — Acme",
  "emails": ["hello@acme.example", "sales@acme.example"],
  "phones": ["+12025550143"],
  "socialProfiles": [
    { "platform": "facebook", "url": "https://www.facebook.com/acme" },
    { "platform": "linkedin", "url": "https://www.linkedin.com/company/acme" }
  ],
  "metadata": { "title": "Contact — Acme", "ogSiteName": "Acme Inc", "...": "..." },
  "emailCount": 2,
  "phoneCount": 1,
  "socialCount": 2,
  "hasContacts": true,
  "scrapedAt": "2026-07-04T10:00:00.000Z"
}
```

### Run it locally

```bash
npm install          # from the monorepo root (installs all actors)
npm start            # uses storage/key_value_stores/default/INPUT.json
npm test             # runs an offline sample execution against a fixture site
```

Or with the Apify CLI: `apify run`.

### Responsible use

This actor only reads publicly available pages. You are responsible for
complying with each site's terms, `robots.txt`, and applicable privacy/marketing
laws (GDPR, CAN-SPAM, etc.) when contacting any leads you collect.

# Actor input Schema

## `startUrls` (type: `array`):

List of pages to crawl. Same-domain links are followed up to the configured depth.

## `maxCrawlDepth` (type: `integer`):

How many link hops to follow from each start URL. 0 = only the start URLs themselves.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on the total number of pages crawled in a single run.

## `sameDomainOnly` (type: `boolean`):

Only follow links that stay on the start URL's domain.

## `includeSubdomains` (type: `boolean`):

Treat subdomains (e.g. blog.example.com) as the same site.

## `extractPhoneNumbers` (type: `boolean`):

Attempt to extract phone numbers in addition to emails and socials.

## `onlyPagesWithContacts` (type: `boolean`):

Skip dataset rows for pages where no email, phone or social profile was found.

## `respectRobotsTxt` (type: `boolean`):

Skip URLs that the site's robots.txt disallows for generic crawlers.

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

Maximum number of pages fetched in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Throttle to stay polite to target servers.

## `requestTimeoutSecs` (type: `integer`):

Navigation timeout per page.

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

Select a proxy to route requests through. Optional but recommended for larger crawls.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com/contact"
    }
  ],
  "maxCrawlDepth": 1,
  "maxRequestsPerCrawl": 100,
  "sameDomainOnly": true,
  "includeSubdomains": true,
  "extractPhoneNumbers": true,
  "onlyPagesWithContacts": false,
  "respectRobotsTxt": true,
  "maxConcurrency": 10,
  "maxRequestsPerMinute": 120,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Crawled pages with extracted contacts, stored in the default dataset.

# 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 = {
    "startUrls": [
        {
            "url": "https://apify.com/contact"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axel_brasil/email-social-lead-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 = { "startUrls": [{ "url": "https://apify.com/contact" }] }

# Run the Actor and wait for it to finish
run = client.actor("axel_brasil/email-social-lead-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 '{
  "startUrls": [
    {
      "url": "https://apify.com/contact"
    }
  ]
}' |
apify call axel_brasil/email-social-lead-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axel_brasil/email-social-lead-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/eoLsjymzoBbMlVDHV/builds/smdbKbv8F8Maf5I8c/openapi.json
