Website Contact Finder: Email Extractor & Contact Details
Pricing
from $0.65 / 1,000 website scanneds
Website Contact Finder: Email Extractor & Contact Details
Contact details scraper and email extractor for company websites. Get public emails, phones, 13 social networks and contact pages per domain, with optional email verification. One flat price per website, contact pages read first.
Pricing
from $0.65 / 1,000 website scanneds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
4
Bookmarked
1.4K
Total users
118
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Website Contact Finder β Emails, Phones & Socials for Lead Lists
From company domains to outreach-ready contact signals
Use Website Contact Finder after you have company websites or domains from Google Maps Lead Finder, LinkedIn Company Scraper, LinkedIn Company Employees Scraper, Clutch.co Scraper, Yellow Pages Scraper, YellowPages Canada Business Scraper, or Substack Scraper. It is a domain-first enrichment actor for local business lead lists: it finds public emails, phone numbers, social profiles, and contact pages, then can optionally verify discovered emails before CRM or Instantly upload.
Build a cold-outreach lead workflow on Apify
Use this actor as one step in a scrape β enrich β verify β export workflow:
- Source B2B accounts or local businesses with Google Maps Lead Finder for search/location-based Google Maps lead generation, or with LinkedIn Company Employees Scraper, LinkedIn Company Scraper, Clutch.co Scraper, Yellow Pages Scraper, YellowPages Canada Business Scraper, or Substack Scraper.
- Find public contact signals with Website Contact Finder or Social Media Profile Finder when you have company domains/websites.
- Clean the list before outreach with Email Verifier, Finder & Deliverability Checker for SMTP, catch-all, disposable, role-account, and deliverability checks, or use Bulk Email MX Verifier for fast syntax/MX screening.
- Export to your outreach stack as CSV/Excel/JSON for Instantly, HubSpot, Salesforce, Pipedrive, Airtable, Make, Zapier, or n8n.
Use only public/business contact data and comply with CAN-SPAM, GDPR, and your outreach platform's rules. Prefer company emails over personal addresses, filter role-based/risky emails when needed, and do not send to invalid or unverified addresses.
Use this Actor in n8n
Prefer building workflows in n8n? Install our community node to run this Actor directly from n8n without writing Apify API code.
Use the n8n node to enrich new domains from Sheets, CRMs, forms, or scraped lead lists with public emails, phone numbers, social links, and contact-page URLs.
- n8n package:
n8n-nodes-apify-website-contact-finder - Works with your Apify API token and existing Apify credits
- Useful for scheduled workflows, CRM enrichment, alerts, and spreadsheet/database exports
See the npm README for installation steps and example n8n workflows.
What does Website Contact Finder do?
Website Contact Finder is a bulk website emails scraper and contact finder for lead generation. Paste company websites and it extracts email addresses, phone numbers, social media profile links, contact-page URLs, and optional email verification data β returning one clean contact record per website for CRM import or outreach campaigns.
If you need an email scraper for websites, use it to scan one site or hundreds of sites in the same run. The actor automatically prioritizes contact, about, and team pages for faster email discovery, reads emails that sites hide from simple scrapers (Cloudflare email protection, name [at] company [dot] com, HTML-encoded addresses, schema.org data), filters false positives (example domains, noreply addresses, file names), handles international phone formats, and detects profiles on 13 social networks.
No browser required β fast pure HTTP crawling keeps costs low and runs fast.
Try it free: go to Website Contact Finder on Apify Store and click Try for free.
Who is it for?
Sales teams and SDRs doing outbound prospecting
- π Enrich a lead list from LinkedIn or Apollo with verified email addresses and phone numbers
- π Find direct contact info for decision-makers at target companies before cold outreach
- π Combine with LinkedIn Company Scraper, Clutch.co Scraper, or Yellow Pages Scraper to go from local business search to contact list in one pipeline
Marketing agencies building lead databases
- ποΈ Scan hundreds of client-submitted company websites overnight and deliver a contact spreadsheet
- π― Find social media handles for prospect companies to target with paid social campaigns
- π Identify which prospects are active on LinkedIn vs Instagram before choosing your channel
Recruiters and HR professionals
- π Find careers email addresses and HR contacts at target employers
- π Discover company social pages to research culture and team before outreach
- π¬ Build a contact database for passive candidate outreach campaigns
Entrepreneurs and freelancers
- πΌ Research potential clients quickly without manually visiting each website
- π€ Find partnership or collaboration contacts at companies in your niche
- βοΈ Build an outreach list for your services by scanning industry directories
Developers building lead generation pipelines
- π€ Integrate contact extraction into automated prospecting workflows via the Apify API
- β‘ Process thousands of URLs programmatically without manual browser work
- π§© Feed results into HubSpot, Salesforce, Pipedrive, or Airtable via Make or Zapier
Website emails scraper use cases
Use Website Contact Finder when you need to:
- Scrape email addresses from company websites for outbound sales, recruiting, partnerships, or agency lead lists
- Enrich leads from Google Maps, LinkedIn, Apollo, directories, or your CRM with fresh website contact data
- Find public contact emails, support emails, sales inboxes, phone numbers, and social profiles in one pass
- Verify extracted emails with format, MX, or SMTP checks before importing them into outreach tools
- Export website contacts to JSON, CSV, Excel, Google Sheets, HubSpot, Salesforce, Pipedrive, Airtable, Make, Zapier, or n8n
Why use Website Contact Finder?
- π΅ One flat price per website β no per-page charge, so 20 pages cost the same as 1. Scrapers that charge per page cost many times more on the same list
- β Bulk processing β scan dozens or hundreds of websites in a single run with one flat start fee
- π― Contact pages first β finds contact, imprint, about and team pages in many languages wherever they sit in the page, and skips PDFs and images
- π΅οΈ Finds hidden emails β decodes Cloudflare email protection,
[at]/[dot]spellings, HTML-encoded addresses and schema.org data - π§ Filtered emails β removes example domains (
@example.com), noreply addresses and file names, and picks aprimaryEmailfor one-email-per-company lists - π± Clean phone numbers β reads
tel:links, page text and schema.org data, supports US, EU, and global formats, and lists each number once - π 13 social networks β LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, TikTok, WhatsApp, Telegram, Threads, Pinterest, Snapchat and Discord
- π Finds the working address β follows
company.comtowww.company.com, tries the other address when one does not answer, and reads sites with an expired certificate - β‘ No browser β fast pure HTTP requests, no Chromium overhead
- π€ CRM-ready output β one clean JSON record per valid website with all contact data structured for direct import
- π©Ί Explicit scan diagnostics β distinguish a readable site with no public contacts from blocked, timed-out, or unreachable pages
- π§ Configurable depth β control how many pages to crawl per site (default: 20, max: 200), within the crawl time each website gets
What data can you extract?
| Field | Example |
|---|---|
websiteUrl | "https://example.com" |
domain | "example.com" |
finalUrl | "https://www.example.com/" (where the first page ended after redirects) |
primaryEmail | "info@example.com" (best address when you need one per company) |
emails | ["info@example.com", "sales@example.com"] |
phones | ["+1 (555) 123-4567", "+44 20 7946 0958"] |
socialLinks.linkedin | "https://linkedin.com/company/example" |
socialLinks.twitter | "https://x.com/example" |
socialLinks.facebook | "https://facebook.com/example" |
socialLinks.instagram | "https://instagram.com/example" |
socialLinks.youtube | "https://youtube.com/@example" |
socialLinks.github | "https://github.com/example" |
socialLinks.tiktok | "https://tiktok.com/@example" |
socialLinks.whatsapp | "https://wa.me/15551234567" |
socialLinks.telegram | "https://t.me/example" |
socialLinks.threads | "https://www.threads.net/@example" |
socialLinks.pinterest | "https://www.pinterest.com/example" |
socialLinks.snapchat | "https://www.snapchat.com/add/example" |
socialLinks.discord | "https://discord.gg/example" |
contactPageUrl | "https://example.com/contact" |
scanStatus | "succeeded", "partial", or "failed" |
failureReason | null or { "category": "HTTP_ERROR", "message": "The website returned HTTP 403." } |
pagesAttempted | 15 |
pagesSucceeded | 14 |
pagesFailed | 1 |
pagesTruncated | 0 (pages only partly read because they exceed the per-page limit) |
pagesCrawled | 15 (backward-compatible alias of attempted pages) |
crawledAt | "2026-03-25T12:00:00.000Z" |
emailVerification | (array, only when verifyEmails: true) |
How much does it cost to find website contacts?
This Actor uses pay-per-event pricing β you pay only for what you scan. No monthly subscription. All platform costs are included.
| Event | Free | Bronze ($29/mo) | Silver ($199/mo) | Gold ($999/mo) |
|---|---|---|---|---|
| Start fee (once per run) | $0.035 | $0.033 | $0.030 | $0.026 |
| Per website scanned | $0.001 | $0.0009 | $0.0008 | $0.00065 |
Email verified (only when verifyEmails is enabled) | $0.002 | $0.0018 | $0.0016 | $0.0013 |
From 2026-11-24 the price will be: start fee $0.03325 on every plan; per website $0.0009 on Free and Bronze, $0.00081 on Silver, $0.00072 on Gold and above; email verified $0.0018 on Free and Bronze, $0.00162 on Silver, $0.00144 on Gold and above.
Real-world cost examples:
| Websites scanned | Cost (Free tier) |
|---|---|
| 1 website | ~$0.036 |
| 10 websites | ~$0.045 |
| 100 websites | ~$0.135 |
| 500 websites | ~$0.535 |
The per-site cost is flat β scanning 20 pages per site costs the same as scanning 5 pages. You control depth via maxPagesPerSite without changing your bill. To keep that price flat, each website has a crawl time: 20 seconds plus its share of 600 seconds across the list (about 80 s each for 10 websites, 26 s each for 100). Contact pages are read first, so this rarely loses contacts, and the run's status message says how many websites reached it. A diagnostic-only row with scanStatus: "failed" is not charged as a successfully scanned website; a partial row returned usable data and is charged as a scanned website.
On the free $5 credit that every new Apify account gets, you can scan approximately 135 websites.
How to find contact information from websites
- Go to Website Contact Finder on Apify Store
- Click Try for free (no credit card needed for the free $5 credit)
- Enter your list of website URLs β one per line
- Set Max pages per site (default 20 is good for most sites; increase for large corporate sites)
- Click Start and wait for results
- Export to JSON, CSV, or Excel for CRM import or outreach
Example input:
{"urls": ["https://example.com","https://anothercompany.com","https://thirdsite.io"],"maxPagesPerSite": 20}
For a large prospecting batch:
{"urls": ["https://company1.com","https://company2.com","https://company3.com"],"maxPagesPerSite": 30,"maxConcurrency": 1,"maxWebsitesConcurrency": 2}
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
urls | array | No | β | List of website URLs to scan for contact info. If omitted or empty, the run exits successfully with a clear status message, returns no records and charges nothing. API callers can also send startUrls, domains or websites, and the legacy startUrl field stays supported. |
maxPagesPerSite | integer | No | 20 | Max internal pages to crawl per website (1β200) |
maxConcurrency | integer | No | 5 | Requested parallel requests per site (1β20). Effective work shares a global ceiling of 2 page fetches across all sites; values above 2 are accepted for compatibility but clamped. |
maxWebsitesConcurrency | integer | No | 5 | Requested parallel websites (1β20). For two sites in parallel, use maxConcurrency: 1 and maxWebsitesConcurrency: 2; all sites still share the global two-fetch ceiling. |
requestTimeoutSecs | integer | No | 15 | Timeout per HTTP request in seconds (5β60) |
useProxy | boolean | No | false | Enable Apify datacenter proxy if the target site blocks direct requests |
proxyConfiguration | object | No | β | Proxy settings (used only when useProxy is true). Datacenter group or your own proxy URLs; a residential group falls back to datacenter |
verifyEmails | boolean | No | false | Run inline email verification after crawling. Adds emailVerification array to output. Opt-in charge: $0.002 per verified email (email-verified event). |
verificationLevel | string | No | "mx" | Verification depth: "format" (syntax only), "mx" (DNS MX lookup), or "smtp" (SMTP probe). See details below. |
Concurrency and memory
The actor intentionally performs at most two HTML fetch-and-parse operations at once across the entire run. Both concurrency inputs remain available so existing API integrations stay compatible, but requested values are reduced when their combination would exceed that global ceiling. Use maxConcurrency: 2 for one site at a time, or maxConcurrency: 1 with maxWebsitesConcurrency: 2 for large URL lists. This bounded behavior prevents memory exhaustion under the actor's 256 MB allocation.
To protect the run's memory, the actor reads each page up to a limit that grows with the run's memory: about 6 MB at the default 256 MB and about 17 MB at 1 GB. Contacts after the limit on a larger page are not found, and the row tells you: pagesTruncated counts those pages and scanStatus is partial with failureReason.category: "RESPONSE_TRUNCATED". If the part that was read held no contacts and no other page was read completely, the row is failed and is not charged. Rerun those websites with more memory to read more of each page. This limit covers page size only and does not guarantee every input fits in memory.
Email verification details
When verifyEmails: true, each extracted email is checked using the selected verificationLevel:
formatβ Validates email syntax against RFC 5322 rules. Instant, no network calls. Confidence score: 0β30.mx(recommended) β Validates syntax + checks DNS MX records to confirm the domain can receive email. Confidence score: 30β45.smtpβ Full probe: syntax + MX + direct SMTP connection to verify the specific mailbox. Confidence score: 45β95. Note: Gmail, Microsoft 365, and Yahoo block SMTP probing β confidence is honestly capped at 45 for these providers even when usingsmtplevel.
Confidence score interpretation:
0β29β invalid format or high-risk (disposable)30β44β valid syntax, domain check not done or failed45β MX records found, or SMTP inconclusive (catch-all / provider blocked)60β catch-all domain (server accepts all mail; individual mailbox unverified)95β SMTP verified individual mailbox exists (not catch-all, not a blocking provider)
isVerified: true is only set when SMTP positively confirms the mailbox is NOT on a catch-all server and the provider does not block SMTP probing. For Gmail, M365, and Yahoo this field will always be false due to server-side probing blocks.
Output examples
Standard output (verifyEmails: false):
{"websiteUrl": "https://example.com","domain": "example.com","finalUrl": "https://www.example.com/","primaryEmail": "info@example.com","emails": ["info@example.com", "sales@example.com"],"phones": ["+1 (555) 123-4567"],"socialLinks": {"linkedin": "https://linkedin.com/company/example","twitter": "https://x.com/example","facebook": null,"instagram": "https://instagram.com/example","youtube": null,"github": "https://github.com/example","tiktok": null,"whatsapp": null,"telegram": null,"threads": null,"pinterest": null,"snapchat": null,"discord": null},"contactPageUrl": "https://example.com/contact","pagesCrawled": 15,"scanStatus": "succeeded","failureReason": null,"pagesAttempted": 15,"pagesSucceeded": 15,"pagesFailed": 0,"pagesTruncated": 0,"crawledAt": "2026-03-25T12:00:00.000Z"}
Blocked or unreachable site:
{"websiteUrl": "https://blocked.example","domain": "blocked.example","finalUrl": "https://blocked.example/","primaryEmail": null,"emails": [],"phones": [],"socialLinks": {"linkedin": null,"twitter": null,"facebook": null,"instagram": null,"youtube": null,"github": null,"tiktok": null,"whatsapp": null,"telegram": null,"threads": null,"pinterest": null,"snapchat": null,"discord": null},"contactPageUrl": null,"pagesCrawled": 1,"scanStatus": "failed","failureReason": {"category": "HTTP_ERROR","message": "The website returned HTTP 403."},"pagesAttempted": 1,"pagesSucceeded": 0,"pagesFailed": 1,"pagesTruncated": 0,"crawledAt": "2026-09-01T12:00:00.000Z"}
With email verification enabled (verifyEmails: true, verificationLevel: "mx"):
{"websiteUrl": "https://example.com","domain": "example.com","finalUrl": "https://www.example.com/","primaryEmail": "info@example.com","emails": ["info@example.com", "sales@example.com"],"phones": ["+1 (555) 123-4567"],"socialLinks": {"linkedin": "https://linkedin.com/company/example","twitter": "https://x.com/example","facebook": null,"instagram": "https://instagram.com/example","youtube": null,"github": "https://github.com/example","tiktok": null,"whatsapp": null,"telegram": null,"threads": null,"pinterest": null,"snapchat": null,"discord": null},"contactPageUrl": "https://example.com/contact","pagesCrawled": 15,"scanStatus": "succeeded","failureReason": null,"pagesAttempted": 15,"pagesSucceeded": 15,"pagesFailed": 0,"pagesTruncated": 0,"crawledAt": "2026-03-25T12:00:00.000Z","emailVerification": [{"email": "info@example.com","isValidFormat": true,"hasMxRecords": true,"isVerified": false,"confidenceScore": 35,"isDisposable": false,"isFreeProvider": false,"isRoleAccount": true,"provider": "google_workspace"},{"email": "sales@example.com","isValidFormat": true,"hasMxRecords": true,"isVerified": false,"confidenceScore": 45,"isDisposable": false,"isFreeProvider": false,"isRoleAccount": true,"provider": "google_workspace"}]}
A readable site with no public contact info returns emails: [], phones: [], and scanStatus: "succeeded". A blocked or unreachable site still returns a row, but with scanStatus: "failed" and a safe failureReason; mixed readable and failed pages, and pages too large to read completely (RESPONSE_TRUNCATED), return scanStatus: "partial". Use these fields to decide whether an empty contact list is final or should be retried.
Tips for best results
- π Scan the full list at once β provide all URLs in one run to minimize start fees and get results in one dataset
- π Start with 15β20 pages per site β contact info is usually on the homepage, footer, contact page, or about page
- π Leave proxy off by default β most sites work without it; consider enabling it when
scanStatusisfailedwithHTTP_ERRORorREQUEST_TIMEOUT - π Check
contactPageUrlβ if no email is found, the contact page may use a form instead of a mailto link - π€ Combine with Google Maps Lead Finder β find local businesses β get their websites β scan for emails in one workflow
- π― Need one email per company? Use
primaryEmailinstead of the fullemailslist - π§Ή Filter empty results β some sites deliberately hide emails; plan for ~20β30% of sites returning no email (common for enterprise sites)
- π Try the full domain root β always use
https://company.comrather than a deep subpage; the crawler discovers contact pages automatically
Integrations
Connect Website Contact Finder with your sales and outreach stack:
- π Google Sheets β export the contact dataset directly to a shared prospecting spreadsheet; team members see results immediately
- β‘ Zapier β when a run completes, automatically add new contacts to HubSpot, Pipedrive, or a Google Sheet
- π Make (Integromat) β build pipelines: scrape contacts β verify emails with Email Finder β push qualified leads to Salesforce
- π§ n8n β self-hosted workflow automation: scan contacts nightly, deduplicate, and push new contacts to your CRM
- π Webhooks β receive results at your own API endpoint for custom processing as soon as the run finishes
- π Scheduled runs β scan a fixed list of prospects weekly to catch newly published contact pages
API usage β Using the Apify API
Run Website Contact Finder programmatically from your code using the Apify API.
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('automation-lab/website-contact-finder').call({urls: ['https://example.com','https://anothercompany.com','https://thirdsite.io',],maxPagesPerSite: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(item => {console.log(`${item.websiteUrl}: ${item.emails.join(', ') || 'no email found'}`);});
Python:
from apify_client import ApifyClientclient = ApifyClient('YOUR_API_TOKEN')run = client.actor('automation-lab/website-contact-finder').call(run_input={'urls': ['https://example.com','https://anothercompany.com','https://thirdsite.io',],'maxPagesPerSite': 20,})for item in client.dataset(run['defaultDatasetId']).iterate_items():emails = ', '.join(item['emails']) if item['emails'] else 'no email found'print(f"{item['websiteUrl']}: {emails}")
cURL:
curl -X POST "https://api.apify.com/v2/acts/automation-lab~website-contact-finder/runs?token=YOUR_API_TOKEN&waitForFinish=120" \-H "Content-Type: application/json" \-d '{"urls": ["https://example.com","https://anothercompany.com","https://thirdsite.io"],"maxPagesPerSite": 20}'
Use with AI agents via MCP
Website Contact Finder is available as a tool for AI assistants that support the Model Context Protocol (MCP).
Add the Apify MCP server to your AI client β this gives you access to all Apify actors, including this one:
Setup for Claude Code
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/website-contact-finder"
Setup for Claude Desktop, Cursor, or VS Code
Add this to your MCP config file:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/website-contact-finder"}}}
Your AI assistant will use OAuth to authenticate with your Apify account on first use.
Example prompts
Once connected, try asking your AI assistant:
- "Use automation-lab/website-contact-finder to find the email addresses and social links for these 5 company websites: [list]"
- "Scan the contact pages of these SaaS companies and give me their LinkedIn pages and support emails"
- "Extract all phone numbers and emails from these 20 local business websites and format them as a CSV"
Learn more in the Apify MCP documentation.
Data handling, dependencies and support
Runs log numeric work counters (fetches, redirects, response-body bytes, cache reuse, returned websites, verification work and charge acknowledgements). Response-body bytes are not billed proxy bytes; acknowledgements are not proof of settled charges. Numeric summaries, sampled memory and in-flight fetch/body/scan/verification counts also go to our private GlitchTip service at completion, at most once per 30 seconds during work, and once before the first crawl, HTML parsing and email verification stages for cost and resource diagnosis. Early observations include only a fixed stage label and the same numeric state, including the runtime heap limit; they add at most three bounded diagnostic flushes per run. Sampled peaks are observations, not a guarantee of maximum process memory; in-flight body bytes count download buffers, not all retained HTML or billed transfer. Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs for repair. Target URL lists and proxy settings are omitted; secret fields and URL queries are removed. Reports are retained for 30 days. No contact output or page bodies are sent in these reports.
This Actor does not use AI. It reads user-provided public website URLs over HTTP(S), extracts public contact details in memory and writes one row per valid input to the run's Apify dataset. It does not require website credentials or send data to a model provider. Optional Apify proxy forwards requests through Apify infrastructure; optional MX and SMTP verification contacts the relevant DNS/MX mail servers. These services may receive the requested domain or address. Actor compute, proxy and network costs are included in the documented charge events; no third-party API key or off-platform payment is required.
A run-local cache of at most 128 completed successful website scans reduces duplicate page requests when email verification is off. It is discarded when the run ends; failures and verification-on inputs are rescanned. The Actor creates no persistent external database or cross-run cache. Input, dataset and operational logs reside in Apify run storage under the user's account retention settings; users can remove run storage and datasets using Apify's storage controls. Operational logs include website hostnames and counts, but omit URL paths, query strings and extracted addresses: do not submit secrets, private URLs or sensitive personal data. Follow applicable privacy and outreach law when exporting contact details. This tool is independent of the websites and services it accesses; names identify sources, not endorsement or affiliation.
For product questions or errors, use the Issues tab on this Actor's Apify Store page and include a sanitized input and run link, never passwords or private contact lists. Sites that require login or render contact information only with JavaScript may return no contacts; blocked/unreachable pages return diagnostic failure rows.
Is it legal to scrape website contact information?
Website Contact Finder only accesses publicly available web pages β contact information intentionally published by website owners for visitors to find. It does not bypass login walls, CAPTCHAs, or access controls.
Automated collection of public contact data is standard practice in sales prospecting and business research. That said, you should review applicable laws in your jurisdiction and the target website's terms of service. For data containing personal information (individual email addresses), ensure compliance with GDPR, CCPA, and similar privacy regulations β particularly around how you store, use, and retain the data. Read more about the legality of web scraping.
FAQ
What types of emails does it find?
Emails from mailto: links, page text and schema.org data, including addresses hidden with Cloudflare email protection, [at]/[dot] spellings and HTML encoding. The actor filters out false positives: addresses at example.com or test.com, noreply@ addresses, and addresses that look like file names.
Does it find phone numbers?
Yes. It extracts numbers from tel: links, page text and schema.org data. It supports US format (e.g., (555) 123-4567), international format (e.g., +44 20 7946 0958), and common variations, and lists a number once even when the site writes it several ways. Numbers keep the format the site uses; they are not converted to E.164.
Which social platforms does it detect? LinkedIn, Twitter/X, Facebook, Instagram, YouTube, GitHub, TikTok, WhatsApp, Telegram, Threads, Pinterest, Snapchat and Discord. It reads profile links on pages and in schema.org data, and ignores share buttons and links to single posts.
How many pages should I crawl per site? 10β20 pages covers most small and medium business websites. On a large site, a higher number helps on short lists: each website has a crawl time of 20 seconds plus its share of 600 seconds across the list. On lists of 100 or more websites, expect about 20 to 40 pages per large site whatever you set.
Do I need a proxy?
Usually no. The actor uses HTTP requests without a proxy by default, and most public websites don't block them. Enable proxy only if you see timeout errors or empty results. This Actor uses the Apify datacenter group or your own proxy URLs; for sites that need residential IPs, pass your own proxy URLs in proxyConfiguration.
Does it need a browser? No. Fast HTTP requests only β no Chromium or Playwright overhead. This keeps cost and run time low.
The actor found no emails on a site I know has contact info. Why?
First check scanStatus. If it is succeeded, the most common reason is that the email is displayed as an image, rendered by JavaScript, or replaced by a contact form; check contactPageUrl. If it is partial or failed, inspect failureReason.category and retry blocked or timed-out sites with a proxy if appropriate.
Can I scrape multiple websites in one run?
Yes β bulk processing is built in. Add all URLs to the urls array and the actor scans each one and returns a separate contact record per site.
What happens if my URL list is too long for the run timeout?
The default run timeout is one hour. The actor stops starting new websites shortly before the run timeout and finishes cleanly. Every input website still gets a record: websites that were not reached are returned uncharged with scanStatus: "failed" and failureReason.category: "ACTOR_TIMEOUT", and the run status message tells you how many were scanned. Increase the run timeout or split the list, then rerun only the ACTOR_TIMEOUT websites.
What does the run's spending limit do? If you set a maximum charge per run, the actor stops when the limit is reached, saves only what was charged, and the status message says how many websites were delivered. If the limit does not cover the start fee and one website, nothing runs and nothing is charged.
Should I enable the proxy? Leave it off by default. Only enable if the target website blocks your requests (you'll see timeout errors or 403 responses in the logs). The residential group is not available on this flat price: a request for it uses the datacenter group, and the status message says so. To use residential IPs, pass your own proxy URLs.
How does pricing work for bulk runs?
You pay $0.001 per website scanned plus a $0.035 flat start fee per run (Free tier). 100 websites in one run costs ~$0.135. Pages are not charged β increasing maxPagesPerSite does not increase your bill, and each website's crawl time keeps the run bounded.
Changelog
v0.1.1 β 2026-04-30
New: opt-in inline email verification (verifyEmails)
- Added
verifyEmailsinput (boolean, defaultfalse) β when enabled, each extracted email is verified after crawling and charged at $0.002 per verified email (email-verifiedevent). - Added
verificationLevelinput ("format"|"mx"|"smtp", default"mx") β controls depth of verification. - Added
emailVerificationarray to output whenverifyEmailsis enabled. Each entry contains:email,isValidFormat,hasMxRecords,isVerified,confidenceScore,isDisposable,isFreeProvider,isRoleAccount,provider. - Confidence scores honestly reflect ambiguity: Gmail, Microsoft 365, and Yahoo cap at 45 because these providers block SMTP probing.
isVerified: trueis never set when the result is ambiguous. - Fully backward compatible β existing runs unaffected.
verifyEmailsdefaults tofalse.
Related tools β Other lead generation actors
- Google Maps Lead Finder β source local business leads from Google Maps by search query and location, including names, websites, phone numbers, and available emails
- Email Verifier, Finder & Deliverability Checker β verify discovered emails and score deliverability before outreach upload
- Email Finder β find professional email addresses for any person or company domain
- Social Media Profile Finder β find social media profiles for any person or company name
- LinkedIn Jobs Enrichment β enrich job listings with company contact data and LinkedIn profiles