Website Contact Extractor: Emails, Phones & Socials
Pricing
from $3.00 / 1,000 website profileds
Website Contact Extractor: Emails, Phones & Socials
Turn any list of websites into verified contact profiles: emails (MX-checked, role vs personal), phone numbers validated to E.164, WhatsApp, social profiles, address, VAT ID and contact page. Reads homepage + contact/imprint pages. $3 per 1,000 sites.
Pricing
from $3.00 / 1,000 website profileds
Rating
0.0
(0)
Developer
Dodi Abak
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Turn a list of websites into clean, verified contact profiles: one row per company. For every domain the Actor reads the homepage plus the pages that matter (contact, Impressum/imprint, about, team, legal) and returns:
- 📧 Emails, MX-verified and classified as role (info@, sales@), personal (first.last@) or generic, with on-domain / free-provider / disposable flags. Cloudflare-protected and
[at]/[dot]-obfuscated addresses are decoded. - 📞 Phone numbers validated with Google's libphonenumber and formatted to E.164 (
+4971140040990), with type (mobile, fixed line, toll-free), country, and labels for fax and WhatsApp. - 🔗 Social profiles: LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub, Pinterest, Threads, Telegram, WhatsApp, Discord, Crunchbase. Share buttons and junk links are skipped.
- 🏢 Company data from schema.org JSON-LD: name, legal name, postal address, geo coordinates, opening hours, VAT ID, founding date, logo.
- 🧭 The contact page URL, pages with a contact form, language and country.
$3 per 1,000 websites ($0.003 per profiled site). Unreachable or blocked sites are free. No browser and no proxies needed, so runs are fast (about 10 websites in parallel, 2–4 seconds each) and cheap.
Why this one?
| This Actor | Typical contact scrapers | |
|---|---|---|
| Phone numbers | Validated + E.164 + type, fax/WhatsApp labelled, dates/order numbers rejected | Raw regex matches, many false positives |
| Emails | MX-checked, role/personal split, obfuscation + Cloudflare decoding | Raw list, includes image@2x.png junk |
| Output | One clean row per company, with primaryEmail and primaryPhone picked for you | One row per page |
| Price | Flat $0.003 per website | $0.002+ per page (6 pages ≈ $0.012) |
| Etiquette | Respects robots.txt for sub-pages, reads at most N pages | Varies |
Use cases
- Lead generation and enrichment: you have domains from Google Maps, a CRM export, a directory or a trade-show list, and you need emails, phones and LinkedIn pages.
- CRM hygiene: refresh old records, catch dead email domains, standardize phone formats.
- AI sales agents: one MCP call returns a structured profile the agent can act on.
- Market research: map companies' social presence and locations.
How to use it
- Paste websites into Websites, one per line:
acme.com,https://www.acme.de/, or an email such asjane@acme.com(its domain is used). - Optional: set Default country for local phone numbers (otherwise it's detected from the address, country domain or page language), or turn off personal emails.
- Click Start. Use the Overview or Leads (flat) view, or export CSV, Excel or JSON, or use the API.
Input example
{"websites": ["apify.com", "https://www.bosch.de", "stripe.com", "https://www.ikea.com/sa/en/"],"maxPagesPerSite": 6,"checkMx": true,"includePersonalEmails": true,"onlyOwnDomainEmails": false}
Output example (shortened)
{"domain": "bosch.de","url": "https://www.bosch.de/","status": "ok","companyName": "Bosch in Deutschland","primaryEmail": "kontakt@bosch.de","primaryPhone": "+4971140040990","emails": [{ "email": "kontakt@bosch.de", "type": "generic", "onDomain": true, "verdict": "valid", "hasMx": true, "source": "mailto","foundOn": ["https://www.bosch.de/impressum/"] }],"phones": [{ "e164": "+4971140040990", "international": "+49 711 40040990", "countryCode": "DE", "type": "fixed_line", "label": "phone", "source": "text" }],"socials": {"linkedin": "https://www.linkedin.com/company/bosch","facebook": "https://www.facebook.com/BoschGlobal","instagram": "https://www.instagram.com/boschglobal"},"address": null,"language": "de","countryGuess": "DE","contactPageUrl": "https://www.bosch.de/kontakt/","summary": "Bosch in Deutschland · kontakt@bosch.de · +4971140040990 · 3 social profile(s)"}
Sites that can't be read return a free row such as {"status": "error", "errorCode": "BLOCKED", …}. Other codes are SITE_UNREACHABLE, HTTP_404 and INVALID_URL.
Output fields
| Field | Meaning |
|---|---|
primaryEmail, primaryPhone | The best contact, chosen for you |
emails[] | email, type (role / personal / generic), onDomain, verdict (valid / invalid / risky / unknown), hasMx, isFreeProvider, isDisposable, source, foundOn |
phones[] | e164, international, national, countryCode, type, label (phone / mobile / fax / whatsapp), source, foundOn |
socials, socialProfiles | Best URL per network, and up to 5 per network |
companyName, legalName, description, logo, favicon | Company identity |
address, geo, openingHours, vatId, foundingDate | From structured data, when published |
contactPageUrl, contactFormUrls | Where to reach them |
language, countryGuess, schemaTypes, pagesScanned | Context |
Pricing
Pay per event: $0.003 per website profiled ($3 per 1,000). You're charged once per site whose homepage loaded, however many pages were read. Unreachable, blocked and invalid sites cost nothing. The Actor never starts more sites than your Max cost per run can pay for.
Use from AI agents (MCP) and code
- MCP:
https://mcp.apify.com?tools=actors,dodiabak/website-contact-extractorworks in Claude, Cursor, VS Code, n8n and others. Example prompt: "Get the contact email, phone and LinkedIn page for these 20 domains." - API:
POST https://api.apify.com/v2/acts/dodiabak~website-contact-extractor/run-sync-get-dataset-items?token=YOUR_TOKEN - Pairs well with: Contact Data Cleaner to normalize and dedupe your CRM, and Google Maps scrapers for domain lists.
Responsible use
The Actor reads only information that companies publish on their own public websites. It doesn't log in, bypass bot protection, guess or brute-force addresses, or send any email. Personal addresses can be switched off with Include personal emails = false. When you store or contact people, follow the data-protection and anti-spam laws that apply to you (GDPR, CAN-SPAM, PECR…).
Limitations
- Sites that render contacts only with JavaScript, or that block automated visitors (some big brands), may return fewer results or a
BLOCKEDrow (free). - The address comes from structured data (schema.org) only. Free-text addresses aren't guessed, to keep precision high.