You have a list of company websites, from a Google Maps export, a trade-show list or a CRM, and you need the contact details behind them: emails, phone numbers, LinkedIn and other social profiles. Opening each site by hand takes a few minutes per company. For 500 companies that's days.
Here's how to do it in bulk, and what makes the difference between clean results and a spreadsheet full of junk.
Where contact details actually live on a website
Most companies don't put everything on the homepage. Contact details are spread across:
- the contact page (
/contact,/contact-us,/get-in-touch) - the about and team pages
- the imprint / legal notice page, which is legally required in Germany and Austria (
/impressum) and common across the EU (/mentions-legales,/aviso-legal) - the footer, which usually holds the social links
So a useful extractor has to find those pages, in several languages, not just read the homepage.
Why naive scraping gives bad results
If you just run an email regex over HTML, you get garbage:
- Image file names that look like emails:
logo@2x.png - Placeholder addresses from forms and templates:
name@example.com - Tracking and error-reporting addresses buried in scripts
- Prose mistaken for emails: "our office is located at www.company.com" turned into
located@www.company.com - Share buttons counted as social profiles:
facebook.com/sharer/...,twitter.com/intent/tweet - The same profile twice:
linkedin.com/company/acmeandwww.linkedin.com/company/acme
And you miss real addresses that sites hide on purpose:
- Cloudflare email protection, which replaces emails with an encoded string that only a browser script decodes
- Simple obfuscation like
sales [at] acme [dot] com
Doing it in bulk
I built a tool for this: the Website Contact Extractor on Apify. You paste a list of websites or bare domains, and for each one it:
- loads the homepage
- finds the most likely contact, about, imprint and team pages (English, German, Spanish, French, Italian and Portuguese)
- extracts emails, phone numbers and social profiles from all of them
- cleans and deduplicates the results
You get one row per company:
{ "domain": "acme-corp.com", "companyName": "Acme Corp", "emails": ["hello@acme-corp.com", "sales@acme-corp.com"], "phones": ["+34931234567"], "socials": { "linkedin": ["https://www.linkedin.com/company/acme-corp"], "instagram": ["https://www.instagram.com/acme.corp"] }, "contactPageUrl": "https://acme-corp.com/contact" } What it handles:
- emails hidden by Cloudflare protection and
[at]/[dot]obfuscation are decoded - image names, placeholders and tracking addresses are filtered out
- phone numbers are validated and formatted in international format (
+34931234567) - LinkedIn, Facebook, Instagram, X, YouTube, TikTok, Pinterest, GitHub, Threads, WhatsApp and Telegram profiles are found, with share buttons removed
- the company's own-domain emails are listed first
- robots.txt is respected by default
You only pay for websites where contacts were found. Sites with no contact details, or that fail to load, are free.
A typical workflow
- Export businesses from Google Maps or your lead list, with the website column.
- Paste the websites into the extractor and run it.
- Export to CSV or Excel, or send the results straight to Google Sheets, HubSpot, Make, Zapier or n8n.
Use the data responsibly
These are contact details that companies publish on their own websites, but how you use them is still regulated. In the EU, the GDPR and national anti-spam rules apply to outreach, even B2B. Check the rules where you operate before emailing anyone.
Try it
Website Contact Extractor: Emails, Phones & Social Links
What do you use for contact enrichment today? I'd like to hear in the comments.

