# LinkedIn Profile Finder - Email to LinkedIn URL Lookup (`anshumanatrey/linkedin-harvester`) Actor

Turn an email address into the person's public LinkedIn profile, with a confidence score on every match. Paste one email or a list and get back clean LinkedIn URLs for your CRM, sales, or recruiting pipeline. No LinkedIn login or cookies. Pay only for confident matches.

- **URL**: https://apify.com/anshumanatrey/linkedin-harvester.md
- **Developed by:** [Anshuman Atrey](https://apify.com/anshumanatrey) (community)
- **Categories:** Lead generation, Developer tools, Social media
- **Stats:** 8 total users, 4 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?

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 Finder — Email to LinkedIn URL

Turn an email address into the person's public LinkedIn profile — with a confidence score on every match. Paste one email or a whole list and get back a clean table of LinkedIn URLs, ready for your CRM, outreach, or recruiting pipeline. **No LinkedIn login, no cookies, nothing tied to your account.**

***

### What you get

- **Email in → best-match LinkedIn URL out**, with a 0–100% confidence score on every row so you know which matches to trust.
- **Bulk or one-off** — look up a single address or thousands, one result row each.
- **Pay only for matches that land.** Emails that can't be matched cost almost nothing.
- **Near-zero cost per match** — the lookup runs on your own free-tier keys, so there's no data-broker markup.
- **Account-safe** — it never logs into LinkedIn or touches your session, so there's nothing to get flagged.

### Who it's for

- **Sales & growth** — enrich inbound leads and sign-ups with the right LinkedIn profile before you reach out.
- **Recruiting** — turn a list of candidate emails into LinkedIn profiles.
- **RevOps / CRM** — clean, verify, and backfill contact records at scale.
- **Founders & operators** — instantly see who actually emailed you.

### How to use it

1. Paste a single email, or a list of emails.
2. Pick a matching mode — **Balanced** is the default and works for most lists.
3. *(Optional)* add your free Brave Search and Groq keys for the widest coverage.
4. Hit **Start**. Results appear in the dataset, one row per email.

#### Matching modes

| Mode | Best for |
|---|---|
| **No AI** | Fastest and free — accepts only the clear, unambiguous matches. |
| **Balanced** *(recommended)* | The default. Spends a little extra effort only on the uncertain matches. |
| **Full AI** | Highest match rate — works hardest on every email. |

#### What a result looks like

| Email | Found | LinkedIn URL | Confidence | Name |
|---|---|---|---|---|
| satya.nadella@microsoft.com | ✅ | linkedin.com/in/satyanadella | 97% | Satya Nadella |
| coolguy@gmail.com | — | — | — | — |

Or as JSON:

```json
{
  "email": "satya.nadella@microsoft.com",
  "linkedin_url": "https://www.linkedin.com/in/satyanadella",
  "confidence": 0.97,
  "found": true,
  "name": "Satya Nadella"
}
```

### Pricing

**Pay-per-result.** A tiny fee per email processed, plus a small charge only when a confident match is found — a confident lookup costs well under a cent. Search and AI run on your own free-tier keys, so you're paying for the lookup itself, not data-broker markup.

### How good are the matches?

- **Work emails** (`name@company.com`) match reliably — that's the sweet spot.
- **People with a public professional presence** match even from a personal address.
- **No public profile to find?** You get a clean *not found* — never a confident guess. Every accepted match has to clear the confidence bar you set, so junk stays out of your list.

### Good to know

- Works on **public information only** — no private database, no broker-sourced contact data.
- Best on professional/work emails; some personal addresses simply have no public profile to match.
- **You stay in control** — set the confidence bar, choose how much AI to use, bring your own keys.

### Run it yourself (open source)

The actor is open source under the MIT license. To run it from the command line with your own keys:

```bash
git clone https://github.com/AnshumanAtrey/linkedin-harvester.git
cd linkedin-harvester
pip3 install -r requirements.txt

GROQ_API_KEY=your_groq_key BRAVE_API_KEY=your_brave_key \
  python3 -m harvester.find "satya.nadella@microsoft.com"
```

Free keys: Groq → console.groq.com/keys · Brave → brave.com/search/api

### Use responsibly

Built for legitimate sales, recruiting, research, and verification. Follow the privacy laws that apply to you (GDPR, CCPA, and local equivalents) and honor opt-out and do-not-contact requests.

### License

MIT — see [LICENSE](LICENSE).

# Actor input Schema

## `email` (type: `string`):

A single email address to look up. For a quick one-off. To process many at once, use the Emails list below instead.

## `emails` (type: `array`):

A list of email addresses. Each one becomes one result row with its best-match LinkedIn profile and a confidence score. Role mailboxes like info@ or support@ are skipped automatically.

## `aiMode` (type: `string`):

How much the AI is used. No AI: fastest and free, only the clear matches resolve, anything uncertain is left unscored. Balanced (recommended): the AI steps in only on the uncertain matches. Full AI: the AI works on every email, highest match rate but highest cost and slowest.

## `minConfidencePct` (type: `integer`):

Only profiles the tool is at least this confident about are accepted (and scraped, if scraping is on). Lower means more coverage but more wrong matches. 80 is a safe default.

## `deepEnrich` (type: `boolean`):

When the email itself has no usable name (e.g. addresses like coolguy@gmail.com), also check the person's public professional footprint to recover one. Catches more people but adds a few seconds per email. Off by default: most work emails (first.last@company.com) resolve from the address and company alone.

## `scrapeProfiles` (type: `boolean`):

After a confident match, also fetch the full LinkedIn profile details. Needs a Bright Data key below. Off by default, so the actor just returns the profile URL and confidence (no scraping, no extra cost).

## `runMode` (type: `string`):

Incremental uses only free resolvers (default, runs forever at near-zero cost). Backfill also allows the paid hosted email-to-LinkedIn vendor for a one-time history sweep (needs a Findymail key).

## `groqApiKey` (type: `string`):

Your Groq key (starts with gsk\_), free tier is generous. Powers the AI steps. Only needed if AI assistance is Balanced or Full. Get one at console.groq.com/keys.

## `braveApiKey` (type: `string`):

Your Brave Search key. Powers the web search that finds candidate LinkedIn profiles. Without a search key the actor still resolves what it can from the email's public footprint alone.

## `googleCseKey` (type: `string`):

Alternative to Brave for the search step. Only works with a legacy Custom Search key (Google closed new sign-ups). Provide together with the CX id below.

## `googleCseCx` (type: `string`):

The search engine id that pairs with the Google Custom Search key above.

## `brightdataApiKey` (type: `string`):

Enables real LinkedIn profile scraping when 'Scrape the matched profile' is on. Without it, the actor resolves the URL but does not scrape.

## `findymailApiKey` (type: `string`):

Optional paid email-to-LinkedIn fallback, used only in Backfill run mode for emails the free resolvers miss.

## Actor input object example

```json
{
  "email": "anshumanatrey@gmail.com",
  "emails": [
    "anshumanatrey@gmail.com",
    "jane.doe@stripe.com"
  ],
  "aiMode": "balanced",
  "minConfidencePct": 80,
  "deepEnrich": false,
  "scrapeProfiles": false,
  "runMode": "incremental"
}
```

# Actor output Schema

## `items` (type: `string`):

Email to LinkedIn results, one row per email.

## `log` (type: `string`):

Full execution log.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("anshumanatrey/linkedin-harvester").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("anshumanatrey/linkedin-harvester").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 '{}' |
apify call anshumanatrey/linkedin-harvester --silent --output-dataset

```

## MCP server setup

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

```

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/GQbMN8uaMwvyizaFU/builds/ybTWEgrgQYbZVg5uf/openapi.json
