# LinkedIn Profile Scraper + Email Finder (No Cookies) (`b2b_leads/linkedin-profile-scraper`) Actor

Scrape LinkedIn profiles and find verified emails — no cookies, no login, no account needed. Extracts name, headline, experience, education, skills, articles, followers, and emails from 4 OSINT sources. Bulk support with parallel enrichment, automatic residential proxy rotation, and retry logic.

- **URL**: https://apify.com/b2b\_leads/linkedin-profile-scraper.md
- **Developed by:** [Chidubem Aneke](https://apify.com/b2b_leads) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 245 total users, 11 monthly users, 95.7% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## LinkedIn Profile Scraper + Email Finder (No Cookies)

Scrape LinkedIn profiles and find verified email addresses -- **no login, no cookies, no account needed**.

Paste LinkedIn profile URLs, click Start, and get full profile data + discovered emails in your dataset. **Works in bulk** -- paste 10 or 10,000 URLs.

### Why Use This LinkedIn Scraper?

Other LinkedIn scrapers ask for your session cookies and risk getting your account **permanently banned**. This Actor doesn't touch your LinkedIn account at all.

It reads the publicly available structured data (JSON-LD) that LinkedIn embeds in every public profile page -- the same data Google and Bing use to index profiles. Your account stays safe.

**Zero cookies. Zero login. Zero account risk.**

### What You Get

For each profile URL you provide, the Actor extracts:

| Data Point | Example |
|------------|---------|
| Full name | Bill Gates |
| Headline | Co-chair, Founder, Co-founder |
| Location | Seattle, Washington, United States |
| About / Bio | Chair of the Gates Foundation... |
| Profile photo | Direct CDN URL |
| Followers count | 39,858,197 |
| Work experience | Company, title, dates for each role |
| Education | School, degree, field, dates |
| Skills | Listed skills |
| Published articles | Headline, date, URL, likes count |
| Email address | Discovered via 4 independent OSINT sources |
| Email confidence | high / medium / low |

#### Sample Output

```json
{
    "linkedin_url": "https://www.linkedin.com/in/williamhgates",
    "full_name": "Bill Gates",
    "headline": "Co-chair, Founder, Co-founder",
    "location": "Seattle, Washington, United States",
    "about": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft.",
    "followers": 39858197,
    "current_company": "Gates Foundation",
    "experiences": [
        { "company": "Gates Foundation", "start_date": "2000" },
        { "company": "Breakthrough Energy", "start_date": "2015" },
        { "company": "Microsoft", "start_date": "1975" }
    ],
    "educations": [
        { "school": "Harvard University", "start_date": "1973", "end_date": "1975" }
    ],
    "articles": [
        {
            "headline": "Expanding access to health care through AI",
            "date_published": "2026-01-23",
            "likes": 4380
        }
    ],
    "best_email": "bill@gatesfoundation.org",
    "best_email_confidence": "medium"
}
```

### Bulk Scraping

This Actor is built for bulk. Paste hundreds or thousands of LinkedIn profile URLs and the Actor processes them efficiently:

- **Parallel pipeline** -- Email enrichment runs in the background while the next profile is being scraped. No wasted time waiting.
- **Automatic proxy rotation** -- Each request gets a fresh residential IP. If a request fails, the retry uses a different IP.
- **Configurable delays** -- Control the speed vs. safety tradeoff with min/max delay settings.
- **Resilient** -- Failed profiles are logged but don't stop the run. Results are pushed to the dataset as each profile completes.

### Email Discovery -- Not Just Guessing

Unlike scrapers that just guess `firstname.lastname@company.com` and call it a day, this Actor uses **4 independent sources** to find and verify emails:

| Source | What it does | Confidence |
|--------|-------------|------------|
| **Google Dorking** | Searches Google for publicly posted emails tied to the person's name and company | **High** |
| **GitHub Commits** | Scans public git commit history and events for email addresses | **High** |
| **SMTP Verification** | Generates 10 common email patterns and verifies them against the company mail server | **Medium** |
| **Holehe Validation** | Checks if the email is registered on 120+ platforms (Twitter, Spotify, Adobe, etc.) | Boosts confidence |

The best email is automatically selected and ranked. Each source can be toggled on or off individually.

Email enrichment runs **in parallel** with profile scraping, so enabling it adds minimal extra time when processing multiple profiles.

### How to Use

#### Quick Start

1. Paste one or more LinkedIn profile URLs (or just the username, like `williamhgates`)
2. Click **Start**
3. Download results as JSON, CSV, or Excel

That's it. Residential proxy is configured automatically -- no setup needed.

#### Input Example

```json
{
    "profileUrls": [
        "https://www.linkedin.com/in/williamhgates",
        "https://www.linkedin.com/in/satyanadella",
        "jeffweiner08"
    ],
    "enableEmailEnrichment": true
}
```

#### Input Options

| Field | Default | Description |
|-------|---------|-------------|
| Profile URLs | *(required)* | LinkedIn profile URLs or usernames to scrape. Supports bulk. |
| Enable Email Enrichment | `true` | Run the multi-source email discovery pipeline (runs in parallel) |
| Google Dorking | `true` | Search Google for publicly available emails |
| GitHub Commits Search | `true` | Search GitHub commit history for emails |
| SMTP Verification | `true` | Verify email patterns via mail server handshake |
| Holehe Validation | `false` | Check emails against 120+ platform registrations |
| GitHub Token | - | Optional token for higher GitHub API limits |
| Min/Max Delay | 3-7 sec | Throttling between requests |
| Max Retries | 3 | Retry attempts per profile on failure |

### Proxy

The Actor **automatically uses Apify residential proxies** -- no configuration needed. Every request goes through a rotating residential IP to avoid LinkedIn's bot detection. Each retry attempt gets a fresh IP.

You don't need to set up or configure anything for proxies.

### Output & Dataset Views

Results are stored in the default dataset with **3 pre-built views**:

- **Overview** -- Name, headline, company, location, best email, followers at a glance
- **Emails** -- Focused view: name, company, email, confidence, all discovered emails
- **Full Data** -- Everything including work history, education, articles, skills

Export to **JSON**, **CSV**, **Excel**, or **XML** directly from the Output tab.

### Use Cases

- **Sales & Lead Generation** -- Build prospect lists with verified contact info
- **Recruiting & Talent Sourcing** -- Enrich candidate profiles with email addresses
- **Market Research** -- Analyze competitor teams, track executive movements
- **CRM Enrichment** -- Feed LinkedIn data directly into your CRM pipeline
- **Journalism & OSINT** -- Research public figures and professionals
- **Bulk Outreach** -- Scrape thousands of profiles and export to your email tool

### Integrations

Connect this Actor to your workflow:

- **Zapier / Make** -- Trigger on new dataset items, send to CRM or email tool
- **Google Sheets** -- Auto-export results to a spreadsheet
- **API** -- Call the Actor via REST API and poll for results
- **Webhooks** -- Get notified when a run completes

### Technical Details

#### How It Works

1. **Fetch** -- Sends an HTTP request to the public LinkedIn profile URL using browser-grade headers and rotating residential proxies
2. **Parse JSON-LD** -- Extracts the structured data LinkedIn embeds in `<script type="application/ld+json">` tags (same data search engines use)
3. **Parse HTML** -- Scrapes supplementary fields (connections, skills) from the page HTML
4. **Email Enrichment (parallel)** -- While the next profile is being fetched, email enrichment runs concurrently in the background using Google, GitHub, SMTP, and Holehe
5. **Push to Dataset** -- Each profile is pushed to the dataset as soon as scraping + enrichment completes

#### Anti-Detection Features

- Rotates through 9 realistic User-Agent strings (Chrome, Firefox, Safari, Edge -- all 2025/2026 versions)
- Sets matching `Sec-Ch-Ua`, `Sec-Ch-Ua-Platform`, and `Sec-Fetch-*` headers per UA
- Residential proxy automatically enabled -- fresh IP on every request
- Fresh proxy IP on every retry attempt (not just per profile)
- Randomized delays between requests with configurable min/max
- Detects login walls, HTTP 999 (LinkedIn's bot detection code), and rate limits
- Exponential backoff on failures (3s, 6s, 12s...)

#### Rate Limits & Throughput

| Scenario | Approximate Speed |
|----------|-------------------|
| Profile scraping only | ~10-20 profiles/minute |
| With email enrichment (parallel) | ~8-15 profiles/minute |
| Large bulk runs (1000+) | ~500-1000 profiles/hour |

Email enrichment runs in parallel with scraping, so it adds minimal overhead when processing multiple profiles.

### Limitations

- Only works with **public** LinkedIn profiles (visible without logging in)
- Some profiles may return login walls even with proxies -- the Actor retries with fresh IPs automatically
- Email discovery depends on publicly available data; not every person has a discoverable email
- Google dorking may trigger CAPTCHAs after many queries in sequence
- GitHub email search works best for people active in open source

### Pricing

This Actor runs on the Apify platform. You pay only for compute and proxy usage:

- **Compute**: ~0.1 compute units per profile (with email enrichment)
- **Proxy**: Residential proxy traffic is billed separately by Apify

### Legal

This Actor scrapes only publicly available data from LinkedIn profiles that are visible without authentication. Users are responsible for complying with LinkedIn's Terms of Service, applicable data protection laws (GDPR, CCPA), and local regulations regarding web scraping and personal data processing.

### Changelog

#### v0.2

- Parallel email enrichment -- enrichment runs concurrently with scraping for significantly faster bulk runs
- Residential proxy is now automatic -- no user configuration needed
- Simplified input -- removed proxy settings field
- Results pushed to dataset as each profile completes (streaming output)
- Improved bulk handling with progress status updates

#### v0.1

- Initial release
- Full profile extraction: name, headline, location, about, experiences, education, skills, articles, followers
- Multi-source email enrichment: Google dorking, GitHub commits, SMTP verification, Holehe validation
- Apify Proxy integration with automatic IP rotation on retries
- 3 dataset views: Overview, Emails, Full Data
- Configurable throttling, retry count, and per-source email toggles

# Actor input Schema

## `profileUrls` (type: `array`):

List of LinkedIn profile URLs to scrape. You can paste full URLs (https://www.linkedin.com/in/williamhgates) or just the username (williamhgates). Supports bulk -- add as many as you need.

## `enableEmailEnrichment` (type: `boolean`):

Find email addresses using multiple OSINT sources (Google dorking, GitHub commits, SMTP verification, Holehe). Runs in parallel with scraping for maximum speed.

## `enableGoogleDorking` (type: `boolean`):

Search Google for publicly available email addresses associated with the person.

## `enableGithubSearch` (type: `boolean`):

Search GitHub public commits and events for email addresses.

## `enableSmtpVerification` (type: `boolean`):

Generate common email patterns (firstname.lastname@company.com, etc.) and verify via SMTP handshake.

## `enableHolehe` (type: `boolean`):

Validate discovered emails against 120+ online platforms to confirm they are real accounts. Slower but more accurate.

## `githubToken` (type: `string`):

Optional. Increases GitHub API rate limit from 60 to 5,000 requests/hour. Create one at https://github.com/settings/tokens

## `delayMin` (type: `number`):

Minimum delay between profile requests to avoid rate limiting.

## `delayMax` (type: `number`):

Maximum delay between profile requests.

## `maxRetries` (type: `integer`):

Maximum number of retry attempts per profile on failure (login wall, timeout, etc.). Each retry uses a fresh proxy IP.

## Actor input object example

```json
{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "enableEmailEnrichment": true,
  "enableGoogleDorking": true,
  "enableGithubSearch": true,
  "enableSmtpVerification": true,
  "enableHolehe": false,
  "delayMin": 3,
  "delayMax": 7,
  "maxRetries": 3
}
```

# Actor output Schema

## `profiles` (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 = {
    "profileUrls": [
        "https://www.linkedin.com/in/williamhgates"
    ],
    "enableEmailEnrichment": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/linkedin-profile-scraper").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 = {
    "profileUrls": ["https://www.linkedin.com/in/williamhgates"],
    "enableEmailEnrichment": False,
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/linkedin-profile-scraper").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 '{
  "profileUrls": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "enableEmailEnrichment": false
}' |
apify call b2b_leads/linkedin-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/linkedin-profile-scraper"
        }
    }
}

```

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/URxDfNQ18JNUJmz71/builds/JteCNP5dwF4dlarbr/openapi.json
