Twitter Profile Email Scraper With Phone & Website avatar

Twitter Profile Email Scraper With Phone & Website

Pricing

$19.99/month + usage

Go to Apify Store
Twitter Profile Email Scraper With Phone & Website

Twitter Profile Email Scraper With Phone & Website

Twitter Profile Email Scraper With Phone & Website extracts publicly available email addresses from Twitter profile bios and linked pages. Build targeted contact lists by keyword or niche. Ideal for marketers, agencies, and founders running outreach campaigns.

Pricing

$19.99/month + usage

Rating

5.0

(1)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

0

Monthly active users

10 days ago

Last modified

Share

Scrape public Twitter/X profiles by keyword and export three contact channels from the same run: email addresses, phone numbers in international E.164 format, and the website a profile declares on its own X profile card. Every result is a clean row you can export to CSV, Excel, JSON or pull through the API — no login, no cookies, no browser extension.

This actor extends the Twitter Profile Email Scraper: the email output is unchanged, and two extra extraction passes add phone and website columns on top of it.

What this Twitter scraper does

  • Email scraping — finds public X profiles and posts that publish an email address and extracts it, with an optional domain filter (@gmail.com, @outlook.com, your own company domain).
  • Phone number scraping — a separate search pass per keyword targets profiles publishing a number for the country you choose, normalized to E.164 (+447411673242) and validated against that country's real numbering plan.
  • Declared website extraction — a third pass reads the labelled website field of the X profile card, i.e. the link the account itself publishes, not a domain guessed out of post text.
  • Link-in-bio classification — a Linktree / Beacons / Carrd / Stan page is kept and labelled link_aggregator, so you can separate it from a real business domain (own_domain).
  • Both x.com and twitter.com — the same accounts are indexed under both hostnames; both are searched and accepted.
  • Real-time output — every row is pushed to the dataset the moment it is found, so the Output table fills up while the run is still going.
  • Never fabricated — a channel that genuinely is not there stays empty. Numbers are never invented, patched together from two different numbers, or relabelled to another country.

Use cases

  • B2B lead generation — build a contact list of agencies, consultants, tradespeople or clinics that publish an email, a phone number or a website on X.
  • Local lead scraping — combine a trade keyword with a location term (plumber + London) and a dial code to get local businesses with reachable numbers.
  • Sales prospecting and outreach lists — one row per profile with the channel it was matched by, ready for a CRM import.
  • Market and competitor research — map which accounts in a niche publish a website, and whether it is an own domain or a link-in-bio page.
  • Data enrichment — run your existing keyword list and attach phone/website columns to profiles you already track.

Input

FieldKeyTypeDefaultWhat it does
🔍 Search Keywordskeywordsarray of strings["marketing"]Keywords to search. Each is searched separately. Required.
🐦 NetworkplatformselectTwitterThe network to search (Twitter/X).
🗺️ Location Termlocationstring""Optional place term that must appear in the result.
📧 Email Domain FilteremailDomainsarray of strings["@gmail.com"]Keeps only email rows on these domains. Does not drop phone/website rows.
📬 Max Email Results per KeywordmaxEmailsinteger10Row cap for the email pass.
📞 Collect Phone NumbersextractPhoneNumbersbooleantrueTurns the phone pass on/off.
🌍 Country / Dial Codecountryselect (194 countries)United Kingdom (+44)Country targeted and validated against.
☎️ Max Phone Results per KeywordmaxPhoneNumbersinteger10Row cap for the phone pass.
🌐 Collect Declared WebsitesextractWebsitesbooleantrueTurns the website pass on/off.
🔗 Max Website Results per KeywordmaxWebsiteResultsinteger10Row cap for the website pass.
🛡️ Proxy ConfigurationproxyConfigurationobjectautoOptional; leave as-is for the automatic configuration.

Input example

{
"keywords": ["plumber london", "marketing agency"],
"platform": "Twitter",
"location": "",
"emailDomains": ["@gmail.com"],
"maxEmails": 10,
"extractPhoneNumbers": true,
"country": "United Kingdom (+44)",
"maxPhoneNumbers": 10,
"extractWebsites": true,
"maxWebsiteResults": 10
}

Output

One row per profile/post, deduplicated across every pass.

FieldTypeDescription
networkstringResolved network host of the result (x.com).
keywordstringThe keyword this row came from.
titlestringResult title (profile or post headline).
descriptionstringResult snippet text.
urlstringThe profile or post URL on x.com / twitter.com.
emailstringExtracted email address, empty when none was published.
phoneNumberstring | nullE.164 number, e.g. +447411673242. null when none could be read.
dialCodestring | nullDial code the number was validated against, e.g. +44.
countrystring | nullCountry label the number belongs to.
websitestring | nullBare domain declared on the profile card, e.g. plumberheat.co.uk.
websiteUrlstring | nullThe link exactly as the profile card prints it — no scheme is invented.
websiteTypestring | nullown_domain or link_aggregator.
matchedViastringemail_search, phone_search or website_search — which pass surfaced the row.

Output example

{
"network": "x.com",
"keyword": "plumber london",
"title": "London Plumber (@_londonplumber) / X",
"description": "Emergency plumbing across Greater London. Call +44 7796 345453 ...",
"url": "https://x.com/_londonplumber",
"email": "",
"phoneNumber": "+447796345453",
"dialCode": "+44",
"country": "United Kingdom",
"website": null,
"websiteUrl": null,
"websiteType": null,
"matchedVia": "phone_search"
}
{
"network": "x.com",
"keyword": "photographer",
"title": "Big Ladder Drone (@bigladderdrone) / X",
"description": "Aerial photography, England, United Kingdom ...",
"url": "https://x.com/bigladderdrone",
"email": "",
"phoneNumber": null,
"dialCode": null,
"country": null,
"website": "bigladder.co.uk",
"websiteUrl": "www.bigladder.co.uk",
"websiteType": "own_domain",
"matchedVia": "website_search"
}

How the three passes work

Each keyword is searched up to three times, because the three channels are surfaced by genuinely different result shapes and cannot be merged into one query:

  1. Email pass — always runs; identical to the original email scraper's behaviour, including the domain filter.
  2. Phone pass — runs when extractPhoneNumbers is on, targeting the selected country's numbers.
  3. Website pass — runs when extractWebsites is on, targeting the profile-card layout that carries the declared link.

Every result kept by any pass is then read for all three channels, so a phone result that also shows an email reports both at no extra cost. Rows are deduplicated by URL across pages and passes. With both extras enabled, a run makes roughly three times as many requests per keyword as the email-only actor — that is the real cost of the extra columns.

Accuracy notes

  • Coverage is keyword-, country- and index-dependent. Trade and service keywords (plumber, dentist, salon, agency) yield far more numbers and websites than broad terms like founder.
  • A number that fails validation for the selected country is dropped, never relabelled — including the case where a bio prints a street number right after the phone number.
  • Website values come from the profile card's labelled field only. If an account does not publish a website, the column is null; a domain mentioned inside a post is not reported as the account's site.
  • When a result snippet is cut short mid-link, the partial value is dropped instead of being reported as a domain — so you never get a shortened address such as ntu.ac where the real site is ntu.ac.uk.
  • The link wrapper t.co, twitter.com/x.com themselves, link shorteners, big platforms and free mail providers are excluded from the website column.

FAQ

Do I need a Twitter/X account, API key or cookies? No. The actor works only with public data and takes no credentials.

Does it still return the same emails as the original email scraper? Yes. The email pass, the email fields and the domain filter behave exactly as before; the phone and website columns are added on top.

Can I run it as an email-only scraper? Yes — switch both extractPhoneNumbers and extractWebsites off and only the email pass runs.

Why are some phone or website cells empty? Because that profile did not publish that channel. Empty means "not published", never "guessed wrong".

What is websiteType for? To separate a real business domain (own_domain) from a link-in-bio page such as Linktree (link_aggregator) — both are real, but they are different kinds of lead.

Which formats can I export? Any format the dataset supports: CSV, Excel, JSON, XML, or through the API.