Website Contact Scraper
Pricing
Pay per usage
Website Contact Scraper
Crawl any list of websites and extract emails, phone numbers, and social media profiles. Visits the homepage plus contact, about, and team pages, then returns one clean deduped row per domain. No login.
Pricing
Pay per usage
Rating
5.0
(1)
Developer
Goutam Soni
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Extract emails, phone numbers, and social media profiles from any list of websites. No login, no API key required. Give it domains and it returns one clean, deduped contact row per site.
What it does
This website contact scraper crawls each target site starting at the homepage, follows the pages most likely to hold contact details (contact, about, team), and pulls every public contact point into a single normalized row per domain.
Features
- Email extraction from
mailto:links and visible page text, with asset filenames, tracking ids, and placeholder addresses filtered out so you get real, usable emails. - Phone number extraction from
tel:links and page text, validated by digit count and pattern so years, prices, dates, and ids are never mistaken for phone numbers. - Social profile extraction across Twitter / X, Facebook, Instagram, LinkedIn, YouTube, GitHub, TikTok, Pinterest, Telegram, and WhatsApp. Share widgets and intent links are skipped, and each profile is returned as a clean canonical URL plus handle.
- Smart contact-page crawl. Starts at the homepage, follows same-site links that look like contact pages, and probes conventional paths like
/contactand/abouteven when they are not linked, up to the depth and page budget you choose. - One deduped row per domain. Contacts found across every visited page are merged and deduplicated, with handy per-network columns and total counts.
- Bulk friendly. Pass hundreds of domains in one run with adjustable parallelism.
Use cases
- Lead generation. Turn a list of company domains into an outreach-ready list of emails, phones, and social handles.
- Lead list enrichment. Add missing phone numbers and social profiles to an existing CRM or prospect list.
- Market and competitor research. Map the public contact footprint of companies in a niche or region.
- Recruiting and partnerships. Find the right inbox and social channels to reach a target organization.
- Website audit. Check which of your own sites publicly expose contact details, and where.
Input
| Field | Type | Description |
|---|---|---|
websites | array | Domains or URLs to crawl, with or without https. One result row is returned per entry. Required. |
crawlDepth | integer | Link levels to follow from the homepage. 0 = homepage only, 1 also follows contact, about, and team links. Default 1, max 3. |
maxPagesPerSite | integer | Hard cap on pages fetched per website. Keeps runs fast and predictable. Default 5, max 30. |
probeCommonPaths | boolean | Also try /contact, /about, /team even when the homepage does not link them. Default true. |
concurrency | integer | How many websites to process in parallel. Default 5, max 20. |
proxyConfig | object | Proxy configuration. Residential is the default and most reliable option. |
Example input
{"websites": ["example.com", "https://www.acme-co.example"],"crawlDepth": 1,"maxPagesPerSite": 5,"probeCommonPaths": true,"concurrency": 5}
Output
One clean row per website, with the most useful columns first:
{"type": "contact","domain": "example.com","websiteUrl": "https://example.com/","emailCount": 2,"phoneCount": 1,"socialCount": 2,"emails": ["hello@example.com", "sales@example.com"],"phones": ["+15550100199"],"socialProfiles": [{ "network": "linkedin", "handle": "acme-co", "url": "https://www.linkedin.com/company/acme-co" },{ "network": "twitter", "handle": "example_co", "url": "https://x.com/example_co" }],"twitter": "https://x.com/example_co","facebook": null,"instagram": null,"linkedin": "https://www.linkedin.com/company/acme-co","youtube": null,"github": null,"pagesCrawled": 4,"scrapedAt": "2026-06-18T08:00:00.000Z"}
Key fields
domainandwebsiteUrlidentify the site the row belongs to.emailCount,phoneCount, andsocialCountlet you sort and filter rows at a glance.emails,phones, andsocialProfileshold the full deduped lists.twitter,facebook,instagram,linkedin,youtube,githubgive a single primary URL per network for easy spreadsheet use.pagesCrawledandscrapedAtare run metadata. A field isnullor an empty list when that contact type is not published on the site.
FAQ
Do I need a login or API key? No. The scraper reads only publicly visible pages, so there is nothing to log into and no key to supply.
How many websites can I scrape?
As many as you like in one run. Pass hundreds of domains in the websites list and raise concurrency to process more in parallel.
How fast is it?
Each site is fetched over plain HTTP with a small contact-page crawl, so throughput depends mainly on concurrency and maxPagesPerSite. Most sites finish in a few seconds each, and many run in parallel.
Why are some emails or phones empty?
Many sites publish contact forms instead of raw addresses, or hide details behind scripts. The row returns whatever is publicly visible at crawl time, and an empty list simply means that contact type was not exposed on the pages visited. Raising crawlDepth and maxPagesPerSite finds more.
What is the pricing? Billing follows the actor's pricing shown on its Apify Store page. You pay per result returned, so cost scales with the number of domains you scrape.
Which proxy should I use? Residential is the default and recommended option because it works reliably across the widest range of sites. You can change it in the proxy configuration.