# Twitter (X) Email & Lead Finder (`lurkapi/x-twitter-email-lead-finder`) Actor

Get verified business emails from X (Twitter) profiles in seconds. Feed it handles, URLs, or keyword searches and export ready-to-use leads with follower counts, verification badges, and MX-validated contact data.

- **URL**: https://apify.com/lurkapi/x-twitter-email-lead-finder.md
- **Developed by:** [LurkAPI](https://apify.com/lurkapi) (community)
- **Categories:** Lead generation, Social media, Agents
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.69 / 1,000 email founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Twitter (X) Email & Lead Finder

Find real business emails on X (Twitter) profiles. Point it at handles, URLs, keyword searches, or a follower list and it ships back verified emails ready for outreach.

### 🎬 What it does

Give it X handles, profile URLs, or search keywords, and it will:

1. **Look up each profile** (bio, website, verified badge, follower stats, joined date).
2. **Extract the email** from the bio, the linked website's homepage, and the `/contact` and `/about` pages.
3. **Validate the address** with an MX check and a disposable-provider filter (optional).
4. **Return one row per profile** with the email, its source, validation verdict, and full profile metadata.

Extra discovery paths:

- **Keyword search:** type an industry or niche and the actor finds matching creators on X.
- **Follower expansion:** point at any handle and pull emails from their followers or the people they follow.

### 📋 How to use it

#### Step 1: Configure input

Drop your targets into the top section: handles like `apify`, full URLs like `https://x.com/apify`, or numeric user IDs. Or leave those empty and use the **Search keywords** field to discover profiles by topic.

Add **filters** if you only want profiles above a follower threshold, verified accounts only, or bios containing a specific phrase. Rows dropped by any filter are free.

Turn on **Scrape each target's followers (or following)** to also pull emails from a target's followers or following list. Toggle **Validate emails** to check MX records and flag disposable providers.

#### Step 2: Run it

Click Start. Progress streams into the Output tab as rows are found.

#### Step 3: Get your results

Every successful row includes:

- `status`: `"Success"` when an email was found, or a short human-readable error otherwise.
- `email`: the extracted address, normalized to lowercase.
- `emailSource`: `bio`, `website-home`, `website-contact`, or `website-about`.
- `emailValidation`: `valid`, `disposable`, `invalid`, or `unchecked`.
- `foundVia`: `direct`, `search`, or `follower-expansion`.
- Full X profile: username, name, bio, followers, following, tweet count, verified badge, joined date, website, location, avatar, and more.

Filter rows and error rows carry an `error` slug so you can tell at a glance why nothing was found.

### 💰 Pricing

Pay only when an email lands. Nothing to pay for empty lookups, filtered rows, discovery misses, or failed validations.

| Event                     | Price / 1k | When it fires                                             |
|---------------------------|-----------:|-----------------------------------------------------------|
| Email found (base)        |     $1.99  | Every successful email row.                                |
| + Discovered via search   |     $2.00  | Additive when the profile came from a keyword search.      |
| + Discovered via expansion|     $1.00  | Additive when the profile came from follower expansion.    |
| + Email validated         |     $1.00  | Additive when validation returned a definite verdict.      |

Examples:

- 1,000 direct-target emails, no validation: **$1.99**
- 1,000 direct-target emails, with validation: **$2.99**
- 1,000 search-discovered emails, with validation: **$4.99**
- 1,000 follower-expansion emails, with validation: **$3.99**

### 💡 Good to know

- **Filter rows are free.** Set `minFollowers`, `verifiedOnly`, `bioContains`, and similar filters to keep costs down.
- Supported inputs: `@handle`, `handle`, `https://x.com/handle`, `https://twitter.com/handle`, numeric user ID, or `https://x.com/i/user/12345`.
- **Batch size:** up to 500 entries per input array (handles, userIds, urls, searchQueries).
- Files and datasets are stored in your Apify storage. Retention depends on your Apify plan.

### ❓ FAQ

**Why does one of my target rows have status: "No email found"?**
The profile exists but has no email in the bio, and either no website in the bio, an unreachable website, or a website that has no email on the homepage, `/contact`, or `/about`. You are not charged for those rows.

**How does the keyword search work?**
You provide a keyword like `indie hacker` or `AI founder`. The actor searches X for matching profiles, then runs the same email-extraction pipeline on each. You pay only when it lands an actual email.

**How does follower expansion work?**
Say you enter `@apify` and turn on the followers/following toggle. The actor scrapes @apify's email, then walks through people who follow @apify (or the people @apify follows, your choice) and extracts an email from each. You control how deep it goes with the "Max profiles to scan per target" cap. See the Pricing table for the per-email cost on this path.

**What counts as a valid email in the emailValidation field?**
`valid` = the domain resolves to at least one MX record (or A record as a fallback). `disposable` = the domain matches a known throwaway provider. `invalid` = no DNS records at all. `unchecked` = a DNS timeout or malformed input, and you are not charged for those.

**How long are results stored?**
Results are stored in your Apify storage. How long they are kept depends on your Apify plan.

### ⚖️ Legal disclaimer and terms of use

**Data privacy notice**
This tool extracts publicly visible email addresses from X (Twitter) profiles. Under global privacy laws including GDPR and CCPA, email addresses are classified as Personal Identifiable Information (PII). By running this Actor you assume the legal status of a Data Controller and are entirely responsible for ensuring your use of the extracted data complies with local laws, including CAN-SPAM, GDPR Article 14, and any other regulations that govern outreach in your jurisdiction. If you target EU citizens, GDPR Article 14 requires you to notify the data subjects within 30 days that you have collected their information and offer them an opt-out path.

**User liability**
By running this tool you assume 100% responsibility for compliance with local laws, X's Terms of Service, and the platform policies of any linked website scanned during extraction. The developer assumes zero liability for platform blocks, account bans, or legal actions resulting from your use of the Actor.

**No storage**
The developer does not host, store, or have possession of any data extracted by the user. All results live inside your own Apify storage.

**No warranty**
This software is provided "as-is" without warranties of any kind. Data availability depends on X and the linked websites at run time. You agree to hold the developer harmless from any damages or losses incurred.

**Keywords:** twitter email scraper, x email finder, twitter lead generation, x lead finder, business email extractor, twitter contact scraper

# Actor input Schema

## `handles` (type: `array`):

Usernames (e.g. elonmusk) or full profile URLs (https://x.com/elonmusk). One entry per target.

## `userIds` (type: `array`):

Numeric X user IDs (e.g. 44196397). Useful when a handle has changed.

## `urls` (type: `array`):

Full X profile URLs. Any /handle path is accepted; extra suffixes are ignored.

## `searchQueries` (type: `array`):

Search X for profiles matching each keyword and extract their emails. See Pricing for the additional per-row cost when an email is discovered through this path.

## `maxResultsPerQuery` (type: `integer`):

Cap how many profiles to enrich per keyword search.

## `expandFollowers` (type: `boolean`):

For every direct-target handle you provide above, also pull emails from the accounts around it. See Pricing for the additional per-row cost when an email is discovered through this path.

## `expansionRelation` (type: `string`):

Choose whether to pull leads from accounts that follow the target, or from accounts the target itself follows.

## `maxFollowersPerHandle` (type: `integer`):

Upper bound on how many follower or following rows to enrich for each direct-target handle.

## `minFollowers` (type: `integer`):

Drop rows below this follower count.

## `maxFollowers` (type: `integer`):

Drop rows above this follower count.

## `minFollowing` (type: `integer`):

Drop rows below this following count.

## `maxFollowing` (type: `integer`):

Drop rows above this following count.

## `verifiedOnly` (type: `boolean`):

Keep only accounts with any verified badge (Blue, Business, Government, or Legacy).

## `verifiedType` (type: `string`):

Filter to a specific verified badge type.

## `minAccountAgeDays` (type: `integer`):

Drop accounts joined less than this many days ago.

## `bioContains` (type: `string`):

Only keep profiles whose bio contains this text (case-insensitive).

## `locationContains` (type: `string`):

Only keep profiles whose location contains this text (case-insensitive).

## `usernameContains` (type: `string`):

Only keep profiles whose handle contains this text (case-insensitive).

## `maxItems` (type: `integer`):

Hard cap on total email rows shipped across all sources. Default 100.

## `sortBy` (type: `string`):

Field used to order successful rows before they land in the output. Choose Default to keep them in the order they were found.

## `sortOrder` (type: `string`):

Ignored when Sort = Default.

## `validateEmails` (type: `boolean`):

Verify each extracted email by resolving its domain's mail server and flagging known disposable providers. Every row gets a validation verdict (valid, invalid, disposable, or unchecked). See Pricing for the per-validation cost.

## `outputId` (type: `boolean`):

Include the numeric user ID in the output row.

## `outputUsername` (type: `boolean`):

Include the username in the output row.

## `outputName` (type: `boolean`):

Include the display name in the output row.

## `outputBio` (type: `boolean`):

Include the bio in the output row.

## `outputUrl` (type: `boolean`):

Include the profile URL in the output row.

## `outputFollowers` (type: `boolean`):

Include the followers count in the output row.

## `outputFollowing` (type: `boolean`):

Include the following count in the output row.

## `outputTweetCount` (type: `boolean`):

Include the tweet count in the output row.

## `outputMediaCount` (type: `boolean`):

Include the media count in the output row.

## `outputLikesCount` (type: `boolean`):

Include the likes count in the output row.

## `outputVerified` (type: `boolean`):

Include the verified flag in the output row.

## `outputVerifiedType` (type: `boolean`):

Include the verified type (Blue, Business, Government, Legacy) in the output row.

## `outputLocation` (type: `boolean`):

Include the location in the output row.

## `outputWebsite` (type: `boolean`):

Include the website URL in the output row.

## `outputProfileImageUrl` (type: `boolean`):

Include the profile image URL in the output row.

## `outputBannerUrl` (type: `boolean`):

Include the banner image URL in the output row.

## `outputCreatedAt` (type: `boolean`):

Include the account created date in the output row.

## `outputProtected` (type: `boolean`):

Include the protected flag in the output row.

## Actor input object example

```json
{
  "handles": [
    "apify"
  ],
  "userIds": [],
  "urls": [],
  "searchQueries": [],
  "maxResultsPerQuery": 30,
  "expandFollowers": false,
  "expansionRelation": "Followers",
  "maxFollowersPerHandle": 200,
  "verifiedOnly": false,
  "verifiedType": "",
  "maxItems": 20,
  "sortBy": "Default",
  "sortOrder": "desc",
  "validateEmails": true,
  "outputId": true,
  "outputUsername": true,
  "outputName": true,
  "outputBio": true,
  "outputUrl": true,
  "outputFollowers": true,
  "outputFollowing": true,
  "outputTweetCount": true,
  "outputMediaCount": false,
  "outputLikesCount": false,
  "outputVerified": true,
  "outputVerifiedType": true,
  "outputLocation": true,
  "outputWebsite": true,
  "outputProfileImageUrl": true,
  "outputBannerUrl": false,
  "outputCreatedAt": true,
  "outputProtected": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Status + email + core profile fields.

## `contacts` (type: `string`):

Email + validation + source + website.

## `metadata` (type: `string`):

Full profile metadata.

# 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 = {
    "handles": [
        "apify"
    ],
    "userIds": [],
    "urls": [],
    "searchQueries": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/x-twitter-email-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 = {
    "handles": ["apify"],
    "userIds": [],
    "urls": [],
    "searchQueries": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("lurkapi/x-twitter-email-lead-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "handles": [
    "apify"
  ],
  "userIds": [],
  "urls": [],
  "searchQueries": [],
  "maxItems": 20
}' |
apify call lurkapi/x-twitter-email-lead-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lurkapi/x-twitter-email-lead-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uPzl7xwODDvuUwt9x/builds/zemnUWKsPgQgQiCeD/openapi.json
