X Email Scraper avatar

X Email Scraper

Pricing

from $2.49 / 1,000 results

Go to Apify Store
X Email Scraper

X Email Scraper

X Email Scraper SD - X Email Scraper is a lead generation tool that extracts leads with public contact emails, account names and profile URLs from X results by keyword, location and email domain - X email extractor.

Pricing

from $2.49 / 1,000 results

Rating

0.0

(0)

Developer

Leads Scraper

Leads Scraper

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

X Email Scraper - Public Contact Emails from X and Twitter Profiles

The X Email Scraper is an Apify Actor that collects publicly indexed contact emails belonging to X accounts. You supply keywords; it returns a structured dataset of leads.

The X Email Scraper works by running site:x.com and site:twitter.com searches through the Apify GOOGLE_SERP proxy and parsing addresses out of the result blocks. Both domains are covered, because Google's index still holds a decade of twitter.com URLs.

The X Email Scraper does not log into X, does not use the X API and does not open x.com. No browser, no JavaScript rendering, no authentication, no cookies.

Everything the X Email Scraper returns already exists in Google's public index: titles, snippets and site labels. If a founder wrote hire me: me@gmail.com in a bio Google crawled, this Actor can surface it.

That makes it an X email extractor - what people still search for as a Twitter email scraper - for keyword-driven contact discovery. You start from a niche or job title, not from a list of handles.


Key Features

FeatureWhat it does
Dual-domain coverageThe X Email Scraper searches both x.com and legacy twitter.com results
Keyword-driven searchStart from a role, niche or community, not from a list of handles
Query expansionEach keyword x domain pair runs as base, quoted, intitle: and one variant per modifier
Domain filteringOnly emails on the domains you list (@gmail.com, @yahoo.com, ...) are kept
Obfuscation handlingUnderstands name [at] domain [dot] com, name (at) domain, name @ domain.com, domain .com, zero-width characters and the full-width at sign
Junk filterRejects placeholders such as email@, yourname@, test@, xxx@ and single-character locals
Boundary-correct matching@gmail.com never matches inside @gmail.company or @gmail.com.br
Global deduplicationOne row per unique email across every query and every page
ConcurrencyAn asyncio worker pool runs several queries in parallel with a shared stop signal
Retry logicUp to 3 attempts per page, exponential backoff, a fresh proxy session per request
Block detectionCAPTCHA, "unusual traffic" and consent pages are detected and retried, never counted as empty
Resumable stateProgress lives in the key-value store, keyed by a hash of your input
Fallback parserIf Google's markup changes, a run degrades to "emails without account details", not "no emails"
Live dataset writesEach lead reaches the Apify dataset the moment it is found

The X Email Scraper parser locates each <h3> title, then the smallest surrounding block. It does not depend on Google's CSS class names, which is why the X Email Scraper tolerates most SERP layout changes.


How the X Email Scraper Works

The X Email Scraper pipeline is short, deterministic and auditable - every row stores the exact query that produced it.

  1. Read input. Keywords, location, email domains and limits are validated.
  2. Build queries. The X Email Scraper composes site:x.com and site:twitter.com queries, e.g. site:x.com indie hacker "@gmail.com" "Berlin".
  3. Expand queries. Base queries run first, then quoted, intitle: and one variant per query modifier.
  4. Fetch search results. Pages are retrieved asynchronously with aiohttp through the Apify GOOGLE_SERP proxy.
  5. Parse structurally. Each result block is isolated around its <h3> heading.
  6. Extract emails. A domain-filtered regex pulls addresses from the block text after normalisation.
  7. Deduplicate and push. Every new lead is written straight to the dataset as structured data.

Pagination per query is capped by maxPagesPerQuery. A query stops early once several consecutive pages produce no new email, so the crawler does not spend proxy calls on an exhausted result set.

Blocked or failed queries are re-queued once at the end of the run. The X Email Scraper then logs a summary: pages fetched, blocked pages, retries and emails per page.


What Data Does It Extract?

Every X Email Scraper dataset item pairs an email with whatever account metadata Google exposed, plus provenance so you can trace the address back to its query.

Profile and status results usually expose a handle, which the X Email Scraper converts into a username and a canonical profileUrl such as https://x.com/handle. Handles are short - up to 15 characters - so they map cleanly.

Hashtag, explore and search-result pages do not expose a handle. Those rows carry accountName with username: null and an empty profileUrl, while the email and snippet are still returned. That is a Google limitation, not a defect.


Input Schema for the X Email Scraper

FieldTypeDefaultMeaning
keywordsarray (required)["founder", "indie hacker"]Search terms describing the accounts you want (niche, job title, industry)
locationstring""Optional location phrase added to every query
customDomainsarray["@gmail.com", "@yahoo.com"]Only emails on these domains are kept; the leading @ is optional
maxEmailsinteger 1-1000020Stop after this many unique emails
countryCodestring""Two-letter country for the search proxy (US, GB, DE...)
expandQueriesbooleantrueSearch each keyword x domain pair in several phrasings
queryModifiersarray["email", "contact", "inquiries", "hire", "work with me"]Extra words combined with each keyword when expansion is on
maxPagesPerQueryinteger 1-5030Page cap per query
maxConcurrencyinteger 1-205Parallel queries

The default modifiers are tuned for X's professional bio culture. hire and work with me are the phrases freelancers and founders actually put beside an address, which is why the X Email Scraper ships with them.

JSON input example

{
"keywords": ["indie hacker", "solidity developer", "growth marketer"],
"location": "",
"customDomains": ["@gmail.com", "@proton.me"],
"maxEmails": 500,
"countryCode": "US",
"expandQueries": true,
"queryModifiers": ["hire", "work with me", "contact", "inquiries"],
"maxPagesPerQuery": 30,
"maxConcurrency": 5
}

Output Schema and Structured Data Fields

Every item the X Email Scraper writes carries all 14 fields below, so a CSV, XLSX or JSON export always has identical columns.

FieldMeaning
networkPlatform name
keywordThe keyword that produced the lead
queryThe exact Google query used
titleRaw result title
accountNameAccount label Google prints (handle or display name)
fullNameDisplay name parsed from a profile-style title; empty for post snippets
usernameURL-safe handle when X exposes one; otherwise null
profileUrlCanonical account URL when a handle is known; otherwise empty
urlDirect platform link when exposed, else the profile URL
descriptionBio or post snippet, cleaned of labels and engagement counters
emailLower-cased email address
emailDomainThe matched domain (e.g. @gmail.com)
possiblyTruncatedtrue when Google's snippet ellipsis touched the email - verify before sending
foundAtISO 8601 UTC timestamp

JSON output example

[
{
"network": "X",
"keyword": "indie hacker",
"query": "site:x.com indie hacker \"work with me\" \"@gmail.com\"",
"title": "Tomas Beck (@tomasbuilds) / X",
"accountName": "tomasbuilds",
"fullName": "Tomas Beck",
"username": "tomasbuilds",
"profileUrl": "https://x.com/tomasbuilds",
"url": "https://x.com/tomasbuilds",
"description": "Building small SaaS in public. 3 products, 1 developer. Work with me: tomas.builds@gmail.com",
"email": "tomas.builds@gmail.com",
"emailDomain": "@gmail.com",
"possiblyTruncated": false,
"foundAt": "2026-03-18T13:55:29Z"
},
{
"network": "X",
"keyword": "growth marketer",
"query": "site:twitter.com growth marketer \"hire\" \"@gmail.com\"",
"title": "#growthmarketing - X",
"accountName": "X",
"fullName": "",
"username": null,
"profileUrl": "",
"url": "https://x.com/hashtag/growthmarketing",
"description": "for freelance work hire.aditi.growth@gmail.com ...",
"email": "hire.aditi.growth@gmail.com",
"emailDomain": "@gmail.com",
"possiblyTruncated": true,
"foundAt": "2026-03-18T13:56:41Z"
}
]

The second row is the honest case. Google served a hashtag page rather than a profile, so there is no handle to build a profileUrl from, and the snippet ellipsis touched the address.


How to Use the X Email Scraper in Five Steps

  1. Open the Actor and confirm your account has Apify proxy access. The GOOGLE_SERP proxy is required.
  2. Enter 3-10 keywords. Communities beat categories: indie hacker and solidity developer outperform tech.
  3. Choose email domains. X skews technical, so add @proton.me, @pm.me and @hey.com alongside @gmail.com.
  4. Set maxEmails. Start at 20 to check the niche, then raise it.
  5. Run, then export. Download the dataset as CSV, JSON or XLSX, or pull it via the Apify API into your CRM.

Add a location only when geography actually matters. Much of X is location-agnostic, and an unnecessary location phrase narrows the X Email Scraper's search results for no gain.


X Email Scraper Use Cases

Use caseWho it is forHow the X Email Scraper helps
Founder and startup outreachB2B SaaS salesBuild lists of founders and indie hackers publishing a contact address
Developer relationsDevRel and DevTool teamsReach engineers by stack keyword and community
Freelancer sourcingAgencies and studiosFind designers and developers advertising work with me
Tech recruitingTalent teamsSearch role keywords across X and legacy Twitter results
Newsletter and media partnershipsPublishersContact writers who list an inbox in their bio
Web3 and crypto outreachProtocol and NFT teamsTarget on-chain communities where X is the default channel
Investor and angel researchFundraising foundersIdentify angels who publish a public email
CRM enrichmentRevOps teamsFeed structured data straight into an existing pipeline

Founders rarely post in one place. Pair this Actor with the LinkedIn Email Scraper for the professional side, and the Bluesky Email Scraper or Mastodon Email Scraper for accounts that migrated off X.


Why Use This Actor for X Contact Discovery

Most Twitter email scraper tools need API credentials, a scraping session or a list of profile URLs. The X Email Scraper needs none of that - it queries Google and parses what is already public.

Because the X Email Scraper never touches x.com, there is no login, no API tier to pay for and no session to maintain. Its only dependency is Apify's search proxy.

The extraction layer is where the value sits. Normalisation, obfuscation handling, the junk filter, boundary-correct domain matching and soft-wrap repair remove most of the noise naive regex email scraping produces.

Bio obfuscation is endemic on X. Users write me [at] domain [dot] com to dodge bots, and the X Email Scraper normalises those variants - including the full-width at sign and zero-width characters - into a clean address.


Limitations

Read this before planning a campaign around the X Email Scraper.

  • Public index only. It finds accounts whose email is publicly visible in Google's index. Emails only in DMs, images or link-in-bio pages are out of reach.
  • Google's ~300-result cap. A single query returns roughly 300 results at most. Query expansion exists to work around that ceiling, so keep expandQueries on for volume.
  • possiblyTruncated. When Google's snippet ellipsis touched an address, the row is flagged. Verify those rows before sending.
  • Handle availability. username and profileUrl are populated only when Google's result exposes a handle. Hashtag and explore pages return accountName instead.
  • Apify proxy required. The X Email Scraper cannot run without Apify GOOGLE_SERP proxy credentials.
  • Free-plan cap. Free Apify plans are capped at 100 emails per run. Paid plans are uncapped.
  • No volume guarantee. Results vary with keywords, domains, location and what Google has indexed. Nothing is guaranteed, verified or real-time.

The X Email Scraper is not affiliated with, endorsed by or officially supported by X Corp. Use the output in line with GDPR, CAN-SPAM and local marketing law.


The X Email Scraper shares its engine and output schema with every Actor below, all part of the Social, Creator & Community family.

ActorWhat it collects
X Email and Phone Number ScraperEmails and phone numbers from X
X Phone Number ScraperPublic phone numbers from X
Behance Email ScraperPublic contact emails from Behance
Bigo Live Email ScraperPublic contact emails from Bigo Live
Bluesky Email ScraperPublic contact emails from Bluesky
Bumble Email ScraperPublic contact emails from Bumble
Clubhouse Email ScraperPublic contact emails from Clubhouse
Dailymotion Email ScraperPublic contact emails from Dailymotion
DeviantArt Email ScraperPublic contact emails from DeviantArt
Discord Email ScraperPublic contact emails from Discord
Dribbble Email ScraperPublic contact emails from Dribbble
Facebook Email ScraperPublic contact emails from Facebook
Goodreads Email ScraperPublic contact emails from Goodreads
Hinge Email ScraperPublic contact emails from Hinge
Instagram Email ScraperPublic contact emails from Instagram
KakaoTalk Email ScraperPublic contact emails from KakaoTalk
Kick Email ScraperPublic contact emails from Kick
Lemon8 Email ScraperPublic contact emails from Lemon8
Likee Email ScraperPublic contact emails from Likee
LINE Email ScraperPublic contact emails from LINE
LinkedIn Email ScraperPublic contact emails from LinkedIn
Mastodon Email ScraperPublic contact emails from Mastodon
Medium Email ScraperPublic contact emails from Medium
Mixcloud Email ScraperPublic contact emails from Mixcloud
Patreon Email ScraperPublic contact emails from Patreon
Pinterest Email ScraperPublic contact emails from Pinterest
Quora Email ScraperPublic contact emails from Quora
Reddit Email ScraperPublic contact emails from Reddit
Rumble Email ScraperPublic contact emails from Rumble
Snapchat Email ScraperPublic contact emails from Snapchat
SoundCloud Email ScraperPublic contact emails from SoundCloud
Substack Email ScraperPublic contact emails from Substack
Telegram Email ScraperPublic contact emails from Telegram
Threads Email ScraperPublic contact emails from Threads
TikTok Email ScraperPublic contact emails from TikTok
Tinder Email ScraperPublic contact emails from Tinder
Tumblr Email ScraperPublic contact emails from Tumblr
Twitch Email ScraperPublic contact emails from Twitch
Vimeo Email ScraperPublic contact emails from Vimeo
VK Email ScraperPublic contact emails from VK
WeChat Email ScraperPublic contact emails from WeChat
Weibo Email ScraperPublic contact emails from Weibo

Example: Building a Founder Outreach List

Here is a realistic X Email Scraper run. You sell developer tooling and want 400 technical founders with a public inbox.

Set keywords to ["indie hacker", "technical founder", "bootstrapped SaaS"], customDomains to ["@gmail.com", "@proton.me"], countryCode to US and maxEmails to 400.

The X Email Scraper builds base, quoted, intitle: and modifier variants per keyword across both x.com and twitter.com, then paginates the search results with five parallel workers. Rows stream into the dataset live.

Sort the X Email Scraper dataset by possiblyTruncated, verify the flagged rows manually, then load the rest into your sequencer. Run the same keywords through the Reddit Email Scraper to reach the same builders where they post long-form.


X Email Scraper FAQ

Does the X Email Scraper log into X? No. It never authenticates, never opens x.com and never uses the X API. Every field comes from Google's public search results.

Does it cover old twitter.com links too? Yes. The X Email Scraper searches site:x.com and site:twitter.com, so legacy indexed profiles and posts are included.

Where do the X Email Scraper emails actually come from? From titles, snippets and site labels Google already publishes for indexed X pages - usually bios and posts where the account owner wrote the address themselves.

Why do some rows have no username or profileUrl? Because Google's result exposed no handle - typically hashtag, explore or search pages. Those rows still include accountName, the email and the snippet.

What does possiblyTruncated: true mean? Google's snippet ellipsis touched the address, so it may be cut short. Treat those as leads to verify rather than send-ready contacts.

How many emails can one X Email Scraper run return? Free Apify plans stop at 100 emails per run. Paid plans are uncapped and bounded only by maxEmails and what Google has indexed.

Why does a single query not return thousands of results? Google caps one query at roughly 300 results. Query expansion multiplies keyword x domain x phrasing so the X Email Scraper reaches past that ceiling.

Do I need a proxy to run the X Email Scraper? Yes. It requires the Apify GOOGLE_SERP proxy and will not run without Apify proxy credentials.

Can it read emails from protected or private accounts? No. If the content is not in Google's public index, the X Email Scraper cannot see it.

Which email domains work best on X? @gmail.com dominates, but the technical audience means @proton.me, @pm.me and @hey.com are worth adding to customDomains.

Can I resume an interrupted run? Yes. Progress is saved in the key-value store, keyed by a hash of your input, and persists on Apify's PERSIST_STATE, MIGRATING and ABORTING events.

Is scraping X emails legal? The Actor collects only publicly indexed information, but how you use it is your responsibility. Follow GDPR, CAN-SPAM and local rules on unsolicited outreach.

How do I get more leads from one niche? Add query modifiers, widen customDomains, raise maxPagesPerQuery and run adjacent community keywords rather than one broad term.


Support

Questions about the X Email Scraper, bug reports or a custom build? Email neurodata.apify@gmail.com.