Website Email & Phone Scraper
Pricing
from $0.79 / 1,000 page crawleds
Website Email & Phone Scraper
Extract emails, phone numbers, and social media links from any website. No API keys needed, just paste URLs. Visits multiple pages per site to find all contact details.
Pricing
from $0.79 / 1,000 page crawleds
Rating
1.0
(1)
Developer
NanoScrape
Maintained by CommunityActor stats
5
Bookmarked
265
Total users
22
Monthly active users
5 hours ago
Last modified
Categories
Share
Extract emails, phone numbers, social media links, and physical addresses from business websites. Point it at a company's own domain - not at social profiles or marketplace listings (see below).
What This Actor Is For
This actor extracts contact details from a company's own website - the domain the business controls. Feed it a homepage, a contact page URL, or a batch of company domains and it returns emails, phones, social handles, and addresses found on those pages.
Designed for:
- Company homepages and contact pages (
acme-corp.com,firma-gmbh.de,entreprise.fr) - Impressum pages on German/Austrian/Swiss business sites
- About and team pages on SaaS, agency, or B2B websites
- Any URL where the domain belongs to the business you want to contact
Not designed for:
- Social media platform pages - Instagram profiles (
instagram.com/brand), Facebook pages, TikTok accounts. These are hosted on someone else's domain. Use instagram-scraper for Instagram profiles, or facebook-ad-library-scraper for Facebook pages. - Marketplace listing pages - Yapo.cl, OLX, MercadoLibre, Craigslist, Marktplaats individual listings. The URL resolves to the marketplace operator's domain, so this actor returns the operator's
info@yapo.clrather than the individual seller. See dedicated marketplace scrapers under Related Actors. - Aggregator platforms where the URL points to a listing on someone else's site (job boards, directories, review sites). The contact info you get belongs to the platform, not the business listed on it.
Why this matters: the actor uses regex and HTML parsing on the source domain. On yapo.cl/auto/ford-123, the source domain is yapo.cl, so you get Yapo's contact details. The actor flags these cases with a marketplace_note field (v1.3+), but the most reliable fix is to feed it the business's own domain from the start.
How It Works
For each website you provide, the scraper:
- Visits the homepage
- Finds all internal links - contact pages, impressum, and about pages are checked first
- Crawls multiple pages per site (you choose how many)
- Extracts all emails, phone numbers, social media URLs, and addresses
- Deduplicates everything and returns clean results
Pages are crawled in parallel for maximum speed.
Social Platforms Extracted
The scraper picks up profile links to nine platforms when they appear anywhere on the crawled pages:
- LinkedIn (
/company/and/in/profile paths) - Twitter / X
- YouTube (
c/,channel/,user/, and modern@handleURLs) - TikTok (
@usernameprofile URLs) - WhatsApp (normalized
wa.melink or group invite - critical for BR/IN/MX/MENA) - Telegram (
t.melinks) - Signal (
signal.melinks)
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client - Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/website-email-scraper
Example prompt once connected:
"Use
website-email-scraperto process data with website email. Return results as a table."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
Input Example
{"urls": ["https://www.example-company.ch","https://www.another-business.de"],"maxPagesPerSite": 10}
Output Example
{"url": "https://www.example-company.ch","domain": "example-company.ch","emails": ["info@example-company.ch", "jobs@example-company.ch"],"phones": ["+41 44 123 45 67"],"social_urls": {"linkedin": "https://www.linkedin.com/company/example-company","facebook": "https://www.facebook.com/examplecompany","instagram": "https://www.instagram.com/example_handle","tiktok": "https://www.tiktok.com/@example_handle"},"address": "Bahnhofstrasse 1, 8001 Zurich, Switzerland","pages_crawled": 8,"contact_page_url": "https://www.example-company.ch/kontakt"}
Pricing
You pay per page scanned - the more pages you crawl, the more contact details you find.
| Event | Price | Description |
|---|---|---|
| Page crawled | $0.001 | Each page visited on a website |
How much does it cost?
| Pages per site | 10 websites | 100 websites | 1,000 websites |
|---|---|---|---|
| 5 pages | $0.05 | $0.50 | $5.00 |
| 10 pages | $0.10 | $1.00 | $10.00 |
| 20 pages | $0.20 | $2.00 | $20.00 |
No monthly fees. No minimum spend.
How Many Pages Should I Crawl?
| Setting | Speed | Email discovery | Best for |
|---|---|---|---|
| 5 pages | Fast | Good (~34% of sites) | Quick checks, large batches |
| 10 pages | Medium | Better (~50%) | Most use cases |
| 20 pages | Slower | Best (~70%) | Maximum coverage, smaller batches |
More pages = more emails found. German/Austrian/Swiss sites almost always have an impressum page with email and phone - the scraper prioritizes finding it.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | string[] | required | Website URLs to scrape |
maxPagesPerSite | integer | 10 | Pages to crawl per site (1-100) |
proxyConfiguration | object | Apify proxy | Proxy settings |
Tips
- Contact pages are checked first -
/contact,/kontakt,/impressum,/about,/ueber-unsare always prioritized - Start with 10 pages - good balance of speed and coverage for most websites
- Use 20+ pages for maximum email discovery on large corporate sites
- No API keys needed - the scraper uses regex pattern matching, not AI/LLM
Related Actors
Find businesses to enrich
- Kleinanzeigen.de Scraper - Germany
- Willhaben.at Scraper - Austria
- Tutti.ch Scraper - Switzerland
- Subito.it Scraper - Italy
- Marktplaats.nl Scraper - Netherlands
Real Estate
- Homegate.ch Scraper - Swiss real estate
- Immowelt.de Scraper - German real estate
- Oikotie.fi Scraper - Finnish real estate
E-Commerce
Enrichment
Changelog
v1.5.4 (2026-09-15)
- JavaScript static-string extraction: recovers emails hidden in
<script>blocks as concatenation ('info' + '@' + 'x.com'),String.fromCharCode(...)sequences, andatob('...')base64. mailto:form action extraction:<form action="mailto:contact@x.com">legacy pattern.- Meta/OpenGraph/Schema.org scan:
og:email,og:phone_number,<link rel="me" href="mailto:...">,itemprop="email",itemprop="telephone".
v1.5.3 (2026-09-15)
- Homepage-fetch resilience: retry up to 3 times with fresh proxy session on 403/429/503/soft-block/connection-reset. Recovers ~30% of previously blocked homepages.
- Dead-domain detection: NXDOMAIN and connect-timeout failures mark
status: failedimmediately (no wasted retries). - Parked-domain detection: sedoparking / GoDaddy / HugeDomains landing pages return
status: no_contactswith error_message clarifying reason. - www vs apex fallback: after all retries, tries the alternate host form once before giving up.
pages_crawled=0is now impossible withstatus: no_contacts-- such cases are correctly markedfailed.
v1.5.2 (2026-09-15)
- Cloudflare
data-cfemailXOR decoder restored/verified: recovers obfuscatedinfo@addresses on Cloudflare-protected DSGVO sites. INFO log emitted when CF-encoded emails are found on a page. - Subdomain probing on zero-yield apex: tries
mail.,contact.,info.,karriere.before returningno_contacts. Adds up to 4 pages_crawled per domain when needed.
v1.4.4 (2026-09-15)
- README scope clarifier: emphasize business-website target, redirect social/marketplace users to dedicated actors.
v1.4 (2026-09-15)
- Browser-tier fallback (
enableBrowserFallback): when enabled, sites that fail HTTP extraction (WAF-blocked, Cloudflare/DataDome challenged, 403/429) are automatically re-queued to the sister actorsantamaria-automations/website-email-scraper-browser(Camoufox + residential proxies). Fire-and-forget: the HTTP run completes immediately, then the browser run processes the failed URLs in a separate billed run. The browser run ID is stored in the KV store underBROWSER_FALLBACK_RUN_IDand stamped on every eligible output row inbrowser_fallback_run_id. Opt in on European B2C batches where yield matters more than cost. - SPA embedded JSON extraction (
__NEXT_DATA__/__NUXT_DATA__/__APOLLO_STATE__/window.__INITIAL_STATE__): the scraper now recursively walks these server-rendered state blobs before stripping scripts, recovering emails and phones that are never rendered as visible text. Targets ~10% yield uplift on Next.js / Nuxt / Apollo sites. - Hreflang alternate-URL probing: for large multilingual corporate sites that serve
/es/contacto/only under lang-alternate links, the scraper now parses<link rel="alternate" hreflang>tags from the homepage and appends language-specific candidate contact paths resolved against each alternate base. Capped at 8 hreflang-derived URLs per site. - Sitemap sub-file traversal cap raised from 3 to 5: large multi-location care-home and franchise chains with 15+ sub-sitemaps now get better coverage.
v1.3 (2026-09-15)
- WhatsApp / Telegram / Signal extraction:
social_urls.whatsapp,social_urls.telegram,social_urls.signalfields added. WhatsApp phone numbers are also appended to thephonesarray (deduplicated). Critical for BR/IN/MX/MENA sites where WhatsApp is the primary contact channel. - JSON-LD contact extraction:
email,telephone, andcontactPointfields from Organization/LocalBusiness JSON-LD are now parsed and merged intoemails/phones. - Soft-404 and Cloudflare gate detection: pages that return HTTP 200 but contain error titles ("404", "page not found", etc.) or Cloudflare cookie/block pages are now skipped silently instead of contributing noise.
- Marketplace note: when the input URL matches a known marketplace (Yapo, OLX, MercadoLibre, Craigslist, Leboncoin, Marktplaats, etc.) a
marketplace_notefield explains that only operator contacts are returned. - Multilingual contact paths (ES/PT/IT/NL/PL/TR/JA): the fabricated candidate URL list now uses language-specific paths detected from
html[lang]orContent-Language. Sites in Spanish, Portuguese, Italian, Dutch, Polish, Turkish, and Japanese now get native-language paths like/contatto/,/iletisim/,/contato/.
v1.2 (2026-09-15)
- Prefetch error fallback: when the orchestrator prefetch fails (HTTP/2 parse error, 403, 429), the actor now retries with its own TLS client and fresh proxy IP instead of returning
failedimmediately. - Date-string phone filter: strings shaped like
03/09/2026or2026-09-15are no longer emitted in thephonesarray. - Expanded contact page discovery:
/contact-us/,/about/,/about-us/,/support/,/team/,/get-in-touch/, and FR equivalents added alongside the existing German set. - Sitemap fallback: sites with fewer than 3 homepage links (JS-nav WordPress, Squarespace, Wix) now get a
/sitemap.xmlscan to discover contact and about URLs. - Malformed URL handling: inputs like
"http/::example.com "are repaired automatically; social platform URLs (Instagram, Facebook, LinkedIn, etc.) return a clear error instead of crawling silently.
Issues & Feature Requests
If something is not working or you're missing a feature or data field, please open an issue and we'll look into it.