Website Email Extractor - Emails, Phones, Social Links
Pricing
from $2.10 / 1,000 websites
Website Email Extractor - Emails, Phones, Social Links
Extract emails, phone numbers and social media profiles from a list of websites or domains. Checks each homepage plus its contact, about and team pages. Flat $3 per 1,000 websites, however many pages are checked.
Pricing
from $2.10 / 1,000 websites
Rating
0.0
(0)
Developer
Solar G
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Security
Limited permissionsShare
Finds contact details for a list of websites: email addresses, phone numbers and social media profiles. For each site it loads the homepage and then the pages most likely to have contact details (contact, about, team, imprint, support).
For a quick one-off check without an Apify account, a free web version with a small daily limit is available at purfled.com/website-email-finder.
Input
| Field | Description |
|---|---|
websites | Domains or URLs, e.g. example.com or https://www.example.com/contact. When a URL has a path, that page is checked first, then the homepage. An email address such as info@example.com is read as its domain. Entries may also be objects with a url field, e.g. {"url": "https://example.com"}. |
maxPagesPerWebsite | Pages to check per site (start page first, then likely contact pages). Default 8, max 30. |
proxyConfiguration | Optional, for sites that block cloud servers. |
{"websites": ["wholelattelove.com", "basecamp.com", "https://www.bbc.co.uk/contact"],"maxPagesPerWebsite": 8}
Output
One record per website:
{"input": "wholelattelove.com","website": "https://wholelattelove.com","domain": "wholelattelove.com","finalUrl": "https://www.wholelattelove.com/","title": "Whole Latte Love - Espresso Machines, Coffee Makers & Coffee","description": "We are coffee experts...","emails": ["customerservice@wholelattelove.com", "support@wholelattelove.com"],"phones": ["+1-585-924-7170", "+1-888-411-5282", "585-404-9303"],"phonesUncertain": [],"socials": {"youtube": ["https://www.youtube.com/user/wholelattelovetv"],"facebook": ["https://www.facebook.com/WholeLatteLoveOnline"],"instagram": ["https://www.instagram.com/wholelattelove"]},"contactPages": ["https://www.wholelattelove.com/pages/contact-us"],"pagesScraped": 6}
| Field | Meaning |
|---|---|
input | The entry as given in the input. |
website | Origin of the input, e.g. https://example.com. |
domain | Domain of the site that was crawled, after redirects (for example basecamphq.com redirects to basecamp.com). |
finalUrl | The first page's URL after redirects. |
emails | Addresses on the site's own domain first. |
phones | Numbers from tel: links and schema.org data. The same number in different formats is listed once. |
phonesUncertain | Phone-like numbers found in the page text, next to a word such as "phone" or "call", or in a common national format. Check these before use. |
socials | Profile URLs by network. Share buttons, login and help pages, and links to the site itself are left out. |
contactPages | Pages, other than the first, where new contact details were found. |
pagesScraped | Pages requested for this site. |
Supported social networks: Facebook, Instagram, LinkedIn, X/Twitter, YouTube, TikTok, Pinterest, GitHub, Telegram, WhatsApp (normalised to https://wa.me/<number>), Threads, Bluesky, Discord, Reddit and Snapchat.
How emails are found:
mailto:links, visible text, schema.org data, and Cloudflare-protected addresses ([email protected]), which are decoded.- Common obfuscations:
name [at] domain [dot] com,name(at)domain(dot)com, HTML entities. The plain-word formname at domain dot comis kept only when it is on the site's own domain. - Addresses elsewhere in the page source (scripts, attributes) are kept only when they are on the site's own domain. Form placeholders and percent-encoded fragments are ignored.
Errors
A website that cannot be processed returns an item with input, error and blocked, and is not charged:
{ "input": "shop.example-store.com", "website": "https://shop.example-store.com", "domain": "shop.example-store.com", "error": "Could not load https://shop.example-store.com: the site refused the request (HTTP 403), probably bot protection", "blocked": true }
blockedis true when the site refused the request (HTTP 403, 429 and similar) or showed a bot-protection page. Try again withproxyConfigurationset to Apify Proxy.- Other errors give the reason: the domain does not exist (DNS lookup failed), the site did not respond in time, the page was not found, or it is not an HTML page.
- Entries that are not websites (for example
not a website) return{"input": "...", "error": "Not a website URL or domain: ..."}. - Duplicate entries are checked once and charged once.
example.com,www.example.com,http://example.comandEXAMPLE.comcount as the same website.
API usage
curl -X POST "https://api.apify.com/v2/acts/solarg~website-contact-extractor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"websites": ["wholelattelove.com", "basecamp.com"]}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("solarg/website-contact-extractor").call(run_input={"websites": ["wholelattelove.com"]})items = client.dataset(run["defaultDatasetId"]).list_items().items
Pricing
$3.00 per 1,000 websites (event "Website"). That is a flat price per site, however many pages are checked, and platform usage is included. Error items are not charged.
Limitations
- Pages are fetched without a browser, so details that only appear after JavaScript runs may be missed.
- Phone numbers in plain text are reported separately in
phonesUncertain, because numbers in text can also be order numbers or IDs. - Only publicly visible contact details are collected. Use them in line with applicable law (for example UK GDPR, PECR, CAN-SPAM).
Report problems in the Issues tab.