Twitter Profile Email Scraper With Phone & Website
Pricing
$19.99/month + usage
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
Maintained by CommunityActor stats
0
Bookmarked
20
Total users
0
Monthly active users
10 days ago
Last modified
Categories
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
| Field | Key | Type | Default | What it does |
|---|---|---|---|---|
| 🔍 Search Keywords | keywords | array of strings | ["marketing"] | Keywords to search. Each is searched separately. Required. |
| 🐦 Network | platform | select | Twitter | The network to search (Twitter/X). |
| 🗺️ Location Term | location | string | "" | Optional place term that must appear in the result. |
| 📧 Email Domain Filter | emailDomains | array of strings | ["@gmail.com"] | Keeps only email rows on these domains. Does not drop phone/website rows. |
| 📬 Max Email Results per Keyword | maxEmails | integer | 10 | Row cap for the email pass. |
| 📞 Collect Phone Numbers | extractPhoneNumbers | boolean | true | Turns the phone pass on/off. |
| 🌍 Country / Dial Code | country | select (194 countries) | United Kingdom (+44) | Country targeted and validated against. |
| ☎️ Max Phone Results per Keyword | maxPhoneNumbers | integer | 10 | Row cap for the phone pass. |
| 🌐 Collect Declared Websites | extractWebsites | boolean | true | Turns the website pass on/off. |
| 🔗 Max Website Results per Keyword | maxWebsiteResults | integer | 10 | Row cap for the website pass. |
| 🛡️ Proxy Configuration | proxyConfiguration | object | auto | Optional; 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.
| Field | Type | Description |
|---|---|---|
network | string | Resolved network host of the result (x.com). |
keyword | string | The keyword this row came from. |
title | string | Result title (profile or post headline). |
description | string | Result snippet text. |
url | string | The profile or post URL on x.com / twitter.com. |
email | string | Extracted email address, empty when none was published. |
phoneNumber | string | null | E.164 number, e.g. +447411673242. null when none could be read. |
dialCode | string | null | Dial code the number was validated against, e.g. +44. |
country | string | null | Country label the number belongs to. |
website | string | null | Bare domain declared on the profile card, e.g. plumberheat.co.uk. |
websiteUrl | string | null | The link exactly as the profile card prints it — no scheme is invented. |
websiteType | string | null | own_domain or link_aggregator. |
matchedVia | string | email_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:
- Email pass — always runs; identical to the original email scraper's behaviour, including the domain filter.
- Phone pass — runs when
extractPhoneNumbersis on, targeting the selected country's numbers. - Website pass — runs when
extractWebsitesis 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.acwhere the real site isntu.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.