📧 Contact Details Scraper
Pricing
Pay per event
📧 Contact Details Scraper
Extract public emails, phone numbers, and social media links from company websites. Build targeted B2B lead lists for your CRM outreach sequences.
Pricing
Pay per event
Rating
0.0
(0)
Developer
太郎 山田
Actor stats
0
Bookmarked
5
Total users
3
Monthly active users
3 days ago
Last modified
Categories
Share
📧 Contact Details Extractor
Extract public emails, phone numbers, and social media profiles directly from company contact and about pages at scale. As the foundational first step in the Lead Enrichment Pack, this high-speed scraper is built specifically for sales development representatives, RevOps teams, and marketers who need to sweep prospect domains before launching an outreach sequence.
Instead of manually searching through websites to find decision-maker contact details, just provide a list of target URLs. The scraper rapidly crawls these pages using an HTTP-only approach, keeping costs incredibly low while processing hundreds of websites in seconds. You will extract critical data points including raw public emails, phone numbers, LinkedIn company pages, Twitter handles, and Facebook profiles.
This tool is the ideal starting point for B2B lead generation workflows. Run your list of target domains through this web scraper to capture all available contact data, then pass the scraped results into downstream tools like email syntax validators and phone deliverability checkers. By capturing raw contact details first, you ensure your CRM is populated with accurate data for multi-channel sales sequences. Whether you are enriching existing accounts, building a fresh prospect list, or gathering social media footprints for targeted advertising campaigns, this extractor delivers reliable results without heavy browser overhead.
Lead Enrichment Pack — 3-step workflow
| Step | Actor | Job |
|---|---|---|
| 1 | Contact Details Extractor ← you are here | Scrape public emails, phones, and social links from company pages |
| 2 | Email Deliverability Checker | Validate emails: syntax, MX records, disposable detection, deliverability score |
| 3 | Phone Number Validator | Normalize and validate phone numbers with type detection (mobile / landline / VoIP) |
Run all three actors in sequence, then export the fully enriched, validated dataset to your CRM or outreach tool.
Store Quickstart
Pick the template that matches your job — all use public contact pages so the first run returns visible output.
- Start with
store-input.example.jsonor Quickstart — 2 Contact Pages for the cheapest proof run. - Then use the upgrade ladder from
store-input.templates.json:- Quickstart — 2 Contact Pages
- Recurring Contact Watch
- Webhook → CRM Handoff
- Side presets stay available for broader sweeps: Sales Prospect Enrichment and Investor / Due Diligence Sweep.
- Buyer-facing proof assets live in
sample-output.example.jsonandlive-proof.example.json.
Key Features
- 📧 Email extraction — Regex + DOM scan, filters junk patterns (example@, noreply@)
- 📞 Phone number detection — International formats, with country context
- 🔗 Social media links — LinkedIn, Twitter/X, Facebook, Instagram, GitHub
- 🧩 JSON-LD contacts — Structured contact data from schema.org markup
- 🚫 Junk filtering — Excludes obvious placeholders and spam patterns
- ⚡ Bulk processing — Up to 500 URLs per run, HTTP-only (fast)
Use Cases
| Who | Why |
|---|---|
| Sales teams | Build outbound lead lists from industry directories |
| Recruiters | Find hiring manager contacts from company sites |
| Marketing agencies | Compile contact databases for campaign targeting |
| B2B platforms | Enrich company profiles with verified contact info |
| Investigation teams | Gather public contact info for due diligence |
Input
| Field | Type | Default | Description |
|---|---|---|---|
| urls | string[] | (required) | URLs to extract from (max 500) |
| concurrency | integer | 5 | Parallel requests (1-10) |
Input Example
{"urls": ["https://www.mozilla.org/en-US/contact/","https://about.gitlab.com/company/contact/","https://automattic.com/contact/"],"concurrency": 5,"timeoutMs": 15000,"delivery": "dataset"}
Output
| Field | Type | Description |
|---|---|---|
url | string | Page URL scanned |
emails | string[] | Unique email addresses found (junk-filtered) |
phones | string[] | Unique phone numbers (digit-validated) |
socialLinks | object | Social profile URLs by platform |
socialLinks.twitter | string[] | Twitter/X profile URLs |
socialLinks.linkedin | string[] | LinkedIn profile URLs |
socialLinks.facebook | string[] | Facebook page URLs |
socialLinks.instagram | string[] | Instagram profile URLs |
socialLinks.github | string[] | GitHub profile URLs |
jsonLdContacts | object[] | Structured contacts from schema.org JSON-LD markup |
contactCount | integer | Total contacts found (emails + phones) — use to filter empty pages |
hasAnyContacts | boolean | true if at least one email or phone was found |
checkedAt | string | ISO timestamp of when this page was scanned |
Output Example
{"url": "https://about.gitlab.com/company/contact/","emails": ["press@gitlab.com", "security@gitlab.com"],"phones": [],"socialLinks": {"twitter": ["https://twitter.com/gitlab"],"linkedin": ["https://linkedin.com/company/gitlab-com"],"github": ["https://github.com/gitlabhq"]},"jsonLdContacts": [{"type": "Organization","email": "press@gitlab.com","sameAs": ["https://twitter.com/gitlab", "https://linkedin.com/company/gitlab-com"]}],"contactCount": 2,"hasAnyContacts": true,"checkedAt": "2026-04-20T09:00:00.000Z"}
API Usage
Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.
cURL
curl -X POST "https://api.apify.com/v2/acts/taroyamada~contact-details-extractor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"urls": ["https://www.mozilla.org/en-US/contact/","https://about.gitlab.com/company/contact/"],"concurrency": 5}'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("taroyamada/contact-details-extractor").call(run_input={"urls": ["https://www.mozilla.org/en-US/contact/","https://about.gitlab.com/company/contact/",],"concurrency": 5,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("hasAnyContacts"):print(item["url"], item["emails"], item["phones"])
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('taroyamada/contact-details-extractor').call({urls: ['https://www.mozilla.org/en-US/contact/','https://about.gitlab.com/company/contact/',],concurrency: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const withContacts = items.filter(i => i.hasAnyContacts);console.log(`Found contacts on ${withContacts.length} of ${items.length} pages`);
Tips & Limitations
- Target company About/Contact pages for the highest hit rate. Generic home pages often have no contact data.
- Filter by
hasAnyContacts: trueafter extraction to skip empty pages before passing emails to the validator. - Use
contactCountto prioritize pages — higher counts usually indicate richer contact pages. - Next step: feed
emailsinto Email Deliverability Checker andphonesinto Phone Number Validator to get CRM-ready, validated leads. - Schedule recurring runs against the same URL list to detect contact changes (use Recurring Contact Watch).
- Respect GDPR/CCPA — contact data scraping has legal restrictions in many regions; only process publicly available business contacts.
FAQ
Does it handle email obfuscation?
Basic obfuscation (at, dot, [at]) is detected. JavaScript-rendered emails or images are missed.
Is scraping contact info legal?
Public contact info on business sites is generally acceptable, but verify GDPR/CCPA compliance for EU/CA data usage.
Can it find contacts behind login walls?
No — only publicly accessible pages. Authentication is not supported.
How accurate is phone detection?
90%+ for international formats. US/EU/UK numbers most accurate. Verify before dialing.
Does it find emails hidden in images?
No — text-based extraction only. OCR is not supported.
Will it bypass Cloudflare email protection?
It can decode the basic Cloudflare obfuscation, but not all anti-scraping protections.
Related Actors — Lead Enrichment Pack
This actor is Step 1 of the Lead Enrichment Pack. After extraction, validate what you found:
| Step | Actor | What it does |
|---|---|---|
| ➡ Step 2 | 📩 Email Deliverability Checker | Syntax check, MX lookup, disposable detection, 0-100 deliverability score |
| ➡ Step 3 | 📞 Phone Number Validator | E.164 normalization, type detection (mobile/landline/VoIP), 250+ countries |
Add these adjacent actors when contact rows alone are not enough:
- 📄 Website Content Extractor — Use this first when the value is the docs, pricing, help, or policy copy itself; add Contact Details Extractor only for the contact / about / support routes on the same domain.
- Shopify Store Intelligence API — Add when the target account runs on Shopify and you also need catalog, collection, and storefront context before outreach.
- Domain Security Audit API — Add when you need sender-trust or vendor-risk checks such as SSL, expiry, SPF, DMARC, and headers on the domains behind the contacts you found.
- Email Deliverability Portfolio Audit API — Add when you need portfolio-level sender-readiness checks across the same domain set, not just row-by-row email validation.
Cost
Pay Per Event:
actor-start: $0.01 (flat fee per run)dataset-item: $0.005 per output item
Example: 1,000 items = $0.01 + (1,000 × $0.005) = $5.01
No subscription required — you only pay for what you use.
⭐ Was this helpful?
If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.
Bug report or feature request? Open an issue on the Issues tab of this actor.