Website Email & Phone Scraper avatar

Website Email & Phone Scraper

Pricing

from $0.79 / 1,000 page crawleds

Go to Apify Store
Website Email & Phone Scraper

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

NanoScrape

Maintained by Community

Actor stats

5

Bookmarked

265

Total users

22

Monthly active users

5 hours ago

Last modified

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.cl rather 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:

  1. Visits the homepage
  2. Finds all internal links - contact pages, impressum, and about pages are checked first
  3. Crawls multiple pages per site (you choose how many)
  4. Extracts all emails, phone numbers, social media URLs, and addresses
  5. 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)
  • Facebook
  • Twitter / X
  • Instagram
  • YouTube (c/, channel/, user/, and modern @handle URLs)
  • TikTok (@username profile URLs)
  • WhatsApp (normalized wa.me link or group invite - critical for BR/IN/MX/MENA)
  • Telegram (t.me links)
  • Signal (signal.me links)

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-scraper to 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.

EventPriceDescription
Page crawled$0.001Each page visited on a website

How much does it cost?

Pages per site10 websites100 websites1,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?

SettingSpeedEmail discoveryBest for
5 pagesFastGood (~34% of sites)Quick checks, large batches
10 pagesMediumBetter (~50%)Most use cases
20 pagesSlowerBest (~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

ParameterTypeDefaultDescription
urlsstring[]requiredWebsite URLs to scrape
maxPagesPerSiteinteger10Pages to crawl per site (1-100)
proxyConfigurationobjectApify proxyProxy settings

Tips

  • Contact pages are checked first - /contact, /kontakt, /impressum, /about, /ueber-uns are 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

Find businesses to enrich

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, and atob('...') 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: failed immediately (no wasted retries).
  • Parked-domain detection: sedoparking / GoDaddy / HugeDomains landing pages return status: no_contacts with error_message clarifying reason.
  • www vs apex fallback: after all retries, tries the alternate host form once before giving up.
  • pages_crawled=0 is now impossible with status: no_contacts -- such cases are correctly marked failed.

v1.5.2 (2026-09-15)

  • Cloudflare data-cfemail XOR decoder restored/verified: recovers obfuscated info@ 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 returning no_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 actor santamaria-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 under BROWSER_FALLBACK_RUN_ID and stamped on every eligible output row in browser_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.signal fields added. WhatsApp phone numbers are also appended to the phones array (deduplicated). Critical for BR/IN/MX/MENA sites where WhatsApp is the primary contact channel.
  • JSON-LD contact extraction: email, telephone, and contactPoint fields from Organization/LocalBusiness JSON-LD are now parsed and merged into emails/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_note field 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] or Content-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 failed immediately.
  • Date-string phone filter: strings shaped like 03/09/2026 or 2026-09-15 are no longer emitted in the phones array.
  • 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.xml scan 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.