# Social Handles Finder by Email or LinkedIn | from $1.496/1k (`b2bdata/social-handles-finder`) Actor

Social handles finder: give LinkedIn URLs, emails or GitHub, X and Facebook handles, get the person's other social links and handles. No login or cookies. Pay per profile found, misses are free. Does not search by name; use linkedin-person-search. Free plan: 100 per run.

- **URL**: https://apify.com/b2bdata/social-handles-finder.md
- **Developed by:** [Open Enrich](https://apify.com/b2bdata) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 profile founds

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?

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

## Social Handles Finder by Email or LinkedIn | from $1.496/1k

Social handles finder: give a LinkedIn URL, an email address or a GitHub, X (Twitter) or Facebook handle, and get back the person's other social links and handles, plus name and headline so you can check the match. No login, no cookies, no ban risk. Pay per person found, misses are free. Works via API, MCP and schedules.

**Mixed list in, one row per person out | LinkedIn, GitHub, X, Facebook, website | Reverse lookups (GitHub or email to LinkedIn) | No start fee | JSON/CSV export**

### 💳 Pricing and plans

One event, `profile`: one person returned with at least one new link (a personal website counts). Nothing else is billed.

| Plan | Price per profile | Per 1,000 |
|---|---|---|
| FREE | $0.001963 | $1.963 |
| BRONZE | $0.001806 | $1.806 |
| SILVER | $0.001669 | $1.669 |
| GOLD and above | $0.001512 | $1.512 |

- **Success-only billing.** Empty runs, not-found lookups, people whose record holds no link besides the one you gave, unrecognised inputs, notices and failed lookups are never charged. There is no start fee.
- **What the free plan covers.** A free Apify account gets up to 100 inputs looked up per run, as many runs as its Apify credit covers. The $5 monthly platform credit of the free plan covers about 2,500 profiles.
- **Keep a run small while you test.** Set `limit` to 1, or set the hidden `maxChargeUsd` to cap spend per run.

*Prices as listed on this page; the plan you see in your Apify billing page is the one that applies.*

### ⚖️ This vs. the alternatives

Public Store prices checked on 2026-10-13. Re-check on each Actor's page before you compare, prices change.

| Actor | Takes as input | Price per result (FREE tier) | Run-level fee |
|---|---|---|---|
| **This Actor** | LinkedIn URL, email, GitHub / X / Facebook URL or handle | $0.001963 | none |
| [tri_angle/social-media-finder](https://apify.com/tri_angle/social-media-finder) | `profileNames`, `socials` | $0.002 | $0.001 per run start |
| [bovi/social-media-finder](https://apify.com/bovi/social-media-finder) | free-text `query` | $0.05 | none listed |
| [ntriqpro/email-osint-search](https://apify.com/ntriqpro/email-osint-search) | emails | $0.02 per account found | $0.005 per run start |
| [saswave/github-profile-finder](https://apify.com/saswave/github-profile-finder) | search terms | $0.002 | $0.00005 per run start |

We compare on price and inputs only, and make no claim about the quality of the other actors. They do a different job: they search platforms by name or username, we read the links stored on a person's own record. Check that the columns you need are in the output before you compare cost.

### ⚡ Why this actor?

- **Goes both ways.** LinkedIn URL to GitHub, X and Facebook, and back: a GitHub or X handle, or an email, to the person's LinkedIn URL.
- **No guessing.** We read the links the person's own record holds. We do not search platforms by name, so a row is a link on record, not a lookalike.
- **One list, any mix.** URLs, slugs, emails and prefixed handles in the same input, results in input order.
- **You pay only for new information.** A row is charged only when it holds at least one link besides the one you supplied (a personal website counts as a link).
- **Never returns an email address.** The output has handles and links, no contact details.

### 🎯 Use cases

- **Developer recruiting.** Turn a list of LinkedIn URLs into GitHub profiles to see what the person builds.
- **Identity resolution.** You have a GitHub or X handle from a signup or a mention. Find the professional profile behind it.
- **CRM clean-up.** Add the social columns your sales team asks for to a contact list, then enrich the rest with [linkedin-profile-by-url](https://apify.com/b2bdata/linkedin-profile-by-url).
- **Community and DevRel.** Match contributors and attendees across networks.

### 🔗 Pipeline guide: from a name to a full contact

```
[1] linkedin-person-search     -> LinkedIn URL for a name + company
        |
[2] social-handles-finder      -> GitHub / X / Facebook links and handles
        |
[3] linkedin-profile-by-url    -> title, company, seniority, tenure
        |
[4] email-phone-finder         -> phone for a work email
```

### 🚀 Quick start

#### 1. Find social media profiles from LinkedIn URL lists

```json
{ "items": ["https://www.linkedin.com/in/satyanadella"], "limit": 1 }
```

#### 2. A mixed list: URL, slug, email and handles

```json
{
    "items": [
        "https://www.linkedin.com/in/satyanadella",
        "edwinwee1",
        "name@company.com",
        "twitter:edwinwee",
        "github:handle",
        "facebook:handle"
    ],
    "limit": 0
}
```

#### 3. A capped batch with the audit view and a source tag

```json
{ "items": ["edwinwee1", "twitter:edwinwee"], "limit": 100, "includeAudit": true, "sourceTag": "crm-sync-oct" }
```

#### 4. GitHub to LinkedIn: reverse lookup

```json
{ "items": ["twitter:edwinwee", "github:handle"], "limit": 0 }
```

#### 5. Social profiles finder by email

```json
{ "items": ["name@company.com"], "limit": 1 }
```

### ⚙️ Inputs

| Key | Type | Description |
|---|---|---|
| `items` | string\[] | Required. One person per line. See accepted forms below. |
| `limit` | integer | Max rows pushed. Default 25. `0` = all. Hard maximum 1000 per run; a higher value is rejected with an explanation, not silently cut. |
| `includeAudit` | boolean | Adds an `audit` block per row: `requestId`, `unitsCharged`, `latencyMs`, `inputRaw`, `inputCanonical`. |
| `maxChargeUsd` | number | Hidden. Stops the run once this much has been charged. `0` or omitted = no cap beyond your Apify run limit. |
| `sourceTag` | string | Hidden. Up to 64 characters, copied into every row and the run summary. |

Accepted forms in `items`:

| You have | Write |
|---|---|
| LinkedIn profile | `https://www.linkedin.com/in/slug`, `linkedin.com/in/slug`, `slug`, or `linkedin:slug` |
| Email address | `name@company.com` |
| GitHub | `https://github.com/handle` or `github:handle` |
| X / Twitter | `https://x.com/handle`, `https://twitter.com/handle`, `twitter:handle`, `x:handle` or `@handle` |
| Facebook | `https://www.facebook.com/handle`, `facebook:handle`, `fb:handle` or a `profile.php?id=` URL |

A bare word is always read as a LinkedIn slug. Handles on other networks need the prefix or a URL, so nothing is guessed. Unsupported input fields are rejected with a message.

### 📤 Output

One row per person found. Empty and unknown fields are left out of the row, they are not returned as `null`.

| Key | Type | Meaning |
|---|---|---|
| `inputQuery` | string | The line you supplied (an email is shown masked, `j***@example.com`) |
| `inputType` | string | `linkedin`, `email`, `github`, `twitter` or `facebook` |
| `fullName` | string | Name on the record |
| `headline` | string | Headline on the record |
| `linkedinUrl` | string | LinkedIn profile URL |
| `githubUrl`, `githubHandle` | string | GitHub profile URL and handle |
| `twitterUrl`, `twitterHandle` | string | X / Twitter profile URL and handle |
| `facebookUrl`, `facebookHandle` | string | Facebook profile URL and handle |
| `websiteUrl` | string | Personal website listed on the record |
| `foundCount` | integer | Links found other than the one you gave (for an email, all of them). A personal website counts as a link. |
| `sourceTag` | string | Your tag, when set |
| `scrapedAt` | string | Time of the lookup, ISO 8601 |
| `audit` | object | Only with `includeAudit` |

Example row (shape taken from a real public record, values shortened):

```json
{
    "inputQuery": "edwinwee1",
    "inputType": "linkedin",
    "fullName": "Edwin Wee Arbus",
    "headline": "Cursor",
    "linkedinUrl": "https://www.linkedin.com/in/edwinwee1",
    "twitterUrl": "https://twitter.com/edwinwee",
    "twitterHandle": "edwinwee",
    "facebookUrl": "https://facebook.com/wee.edwin",
    "facebookHandle": "wee.edwin",
    "foundCount": 2,
    "scrapedAt": "2026-10-13T09:00:00.000Z"
}
```

#### Other records in the run

- **Misses** are listed in the run's key-value store under `MISSES`, each with a reason: `not_found`, `no_other_profiles_found`, `unrecognised_format` or `Upstream HTTP <code>`.
- **Failed lookups** are listed under `errors-social-handles-finder`. The run still succeeds with the rows it has.
- **Notice row.** When a free-plan list is longer than 100, one row with `type: "notice"` and `reason: "free_plan_limit"` is added. It is not a profile and is never charged.
- `RUN_SUMMARY` holds the counts for the run.

#### What is NOT returned

- ❌ Email addresses or phone numbers
- ❌ Posts, followers, repositories or any platform activity
- ❌ Accounts found by searching a name on other platforms

### 🛡️ Reliable results

If a record is outdated or a link is wrong, report it in the Issues tab with the run link. Every report is reviewed and resolved case by case. Many people list no GitHub, X or Facebook link at all, so expect misses; they cost nothing.

### 🤖 For AI agents

This Actor runs through the Apify MCP server.

> "Use b2bdata/social-handles-finder with items=\["https://www.linkedin.com/in/satyanadella", "twitter:edwinwee"] and limit=2. Return fullName, linkedinUrl, githubUrl, twitterUrl and facebookUrl for each person."

- **Use it when** you hold one identifier (LinkedIn URL, email, GitHub, X or Facebook handle) and need the others.
- **Use a sister actor when** you need title, company or tenure ([linkedin-profile-by-url](https://apify.com/b2bdata/linkedin-profile-by-url)) or a name search ([linkedin-person-search](https://apify.com/b2bdata/linkedin-person-search)).
- **Output is deterministic and schema-stable.** Same input gives the same rows, in input order. A one-item run with a well-known LinkedIn URL returns one row or one `MISSES` entry.
- **Cost per call:** one `profile` event per row returned, nothing for misses.
- **Errors:** a run with invalid input fails with a plain message and charges nothing. Fix the named field and call again.

### 🔌 Integrations: send results anywhere

- **API.** Start a run and read `GET /v2/datasets/{id}/items?format=csv` for CSV or JSON.
- **Webhook** on run success to push rows to your own endpoint.
- **n8n, Make, Zapier** through the Apify apps.
- **Google Sheets, Airtable, HubSpot, Salesforce, Clay** through the dataset export or an HTTP step.

### 🕐 Schedule examples

- **Weekly CRM refresh:** run on Monday 06:00 with the list of LinkedIn URLs from your CRM.
- **New-signup resolver:** run daily on the handles collected the day before.

### 🔗 Related actors

- `b2bdata/linkedin-profile-by-url` — title, company, seniority and tenure per LinkedIn URL. [Open](https://apify.com/b2bdata/linkedin-profile-by-url)
- `b2bdata/linkedin-person-search` — find the LinkedIn URL from a name. [Open](https://apify.com/b2bdata/linkedin-person-search)
- `b2bdata/email-phone-finder` — phone numbers from a work email. [Open](https://apify.com/b2bdata/email-phone-finder)
- `b2bdata/linkedin-people-search` — search people by role and company. [Open](https://apify.com/b2bdata/linkedin-people-search)

See all scrapers by b2bdata: [apify.com/b2bdata](https://apify.com/b2bdata)

### ❓ FAQ

#### Data and coverage

**How do I find twitter and github from linkedin profile links?**
Put the LinkedIn URL in `items`. The row returns the GitHub, X and Facebook links listed on that person's record. Not everyone lists them: in a test of 11 delivered profiles, 11 had a LinkedIn URL, 10 a website, 9 an X / Twitter URL, 8 a Facebook URL and 3 a GitHub URL (2026-10-13, small sample). If a person lists no link besides the one you gave, the lookup is a free miss.

**Can I do a linkedin to github finder run in bulk?**
Yes. Paste up to 1,000 LinkedIn URLs or slugs per run. A mixed list works too.

**Can I look up Facebook and X by email?**
Yes. To get facebook twitter links from email, put the email in `items`. The row returns the profile links on the person's record. The email address itself is not returned.

**Can I go from a GitHub or X handle to a LinkedIn URL?**
Yes, for people who are in the data. A handle is not looked up by guessing: a handle with no match is a free miss, listed in `MISSES` as `not_found`. In our test `twitter:edwinwee` and a known email returned a profile, while a well-known GitHub handle and a company press address returned no match.

**Is there a bulk social media handle finder?**
Yes. One run takes up to 1,000 items in any mix of URLs, emails and handles, and returns one row per person found.

**Is there a social profile lookup API for AI agents?**
Yes. Call it from the Apify API or the Apify MCP server. The prompt above is a working example.

### 🛟 Support

Open the Issues tab on this Actor's page with the run link and the input line that went wrong. We answer within 48 h.

*This Actor is not affiliated with, endorsed by, or sponsored by LinkedIn, GitHub, X, Facebook or any other network named here. All names are trademarks of their owners and are used only to say what a link points to.*

# Changelog

This Actor's version history is a separate document: https://apify.com/b2bdata/social-handles-finder/changelog.md

# Actor input Schema

## `items` (type: `array`):

One person per line. Accepted: a LinkedIn URL or slug (satyanadella), an email address, a github.com / twitter.com / x.com / facebook.com URL, or a prefixed handle (github:handle, twitter:edwinwee or @edwinwee, facebook:handle). A bare word is read as a LinkedIn slug; handles for other networks need the prefix or a URL. Results keep input order; duplicates are collapsed.

## `limit` (type: `integer`):

Maximum rows pushed to the dataset. 0 means all, up to the hard maximum of 1000 per run (a higher number is rejected, split the list instead).

## `includeAudit` (type: `boolean`):

Adds requestId, unitsCharged, latencyMs, inputRaw and inputCanonical to each row (audit view).

## `maxChargeUsd` (type: `number`):

Stop the run once this much has been charged. Omit for no extra cap.

## `sourceTag` (type: `string`):

Free text copied into every row and the run summary, to tell your pipelines apart.

## Actor input object example

```json
{
  "items": [
    "https://www.linkedin.com/in/satyanadella",
    "twitter:edwinwee",
    "edwinwee1"
  ],
  "limit": 25,
  "includeAudit": false
}
```

# Actor output Schema

## `profiles` (type: `string`):

One row per person found: LinkedIn, GitHub, X / Twitter, Facebook and website links plus handles

# 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 = {
    "items": [
        "https://www.linkedin.com/in/satyanadella",
        "twitter:edwinwee",
        "edwinwee1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2bdata/social-handles-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 = { "items": [
        "https://www.linkedin.com/in/satyanadella",
        "twitter:edwinwee",
        "edwinwee1",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("b2bdata/social-handles-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 '{
  "items": [
    "https://www.linkedin.com/in/satyanadella",
    "twitter:edwinwee",
    "edwinwee1"
  ]
}' |
apify call b2bdata/social-handles-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2bdata/social-handles-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/pnhYfgkTNqMeHsJIf/builds/ERMv5iZVBSCrQbRpg/openapi.json
