πŸ“§ Email Scraper & Contact Finder - Bulk Emails, No API Key avatar

πŸ“§ Email Scraper & Contact Finder - Bulk Emails, No API Key

Pricing

from $10.00 / 1,000 results

Go to Apify Store
πŸ“§ Email Scraper & Contact Finder - Bulk Emails, No API Key

πŸ“§ Email Scraper & Contact Finder - Bulk Emails, No API Key

Email scraper and contact finder: pull bulk emails, phones and social links from any website with no API key. Smart crawler hits contact, about and team pages first for fast, high-hit-rate results, and detects the tech stack too. No login. Ideal for B2B lead gen. Pay per website crawled.

Pricing

from $10.00 / 1,000 results

Rating

0.0

(0)

Developer

Renzo Madueno

Renzo Madueno

Maintained by Community

Actor stats

1

Bookmarked

229

Total users

16

Monthly active users

3 days ago

Last modified

Share

πŸ“§ Email Scraper & Contact Finder for Any Website

Point it at a list of domains and it crawls each site β€” contact, about and team pages first β€” and returns one consolidated record per domain: emails, phone numbers, physical addresses, social profiles, contact-page URL and tech stack. Built for lead generation, outbound sales and CRM enrichment. Pricing: $0.006 per website crawled (plus a negligible $0.00005 run start). ~$6 per 1,000 domains, no subscription, no API key.

Email scraper without an API key: what you get per domain

FieldDescription
emailsEvery publicly listed address found across crawled pages
phonesPhone numbers extracted from page text
addressesPhysical addresses found on the site
socialLinksLinkedIn, Twitter/X, Facebook, Instagram, YouTube profile URLs
contactPageUrlDirect URL to the site's contact page, if found
companyNameAuto-detected from meta tags, title or domain
techStack25+ platforms detected: WordPress, Shopify, React, HubSpot, Google Analytics…
pagesCrawled / scrapedAtCrawl depth and timestamp per record

The crawler doesn't wander: it prioritizes the pages where contact data actually lives (contact, about, team, imprint, footer), which is why 5–10 pages per domain is usually enough for a full record.

Bulk email extraction, step by step

  1. Paste domains (or full URLs β€” they're normalized) into domains.
  2. Optionally set maxPagesPerDomain (default 4, max 50), includeGenericEmails (set false to drop info@/support@ for sales lists), detectTechStack, maxConcurrency (1–10 domains in parallel).
  3. Run. Export the dataset to CSV, Excel, JSON, or pull it via API into your CRM.

Example input:

{
"domains": ["stripe.com", "https://shopify.com"],
"maxPagesPerDomain": 10
}

Example output (one record per domain):

{
"domain": "stripe.com",
"companyName": "Stripe",
"emails": ["press@stripe.com", "support@stripe.com"],
"phones": ["+1 (888) 926-2289"],
"addresses": [],
"socialLinks": {
"linkedin": "https://www.linkedin.com/company/stripe",
"twitter": "https://twitter.com/stripe",
"facebook": "https://www.facebook.com/StripeHQ",
"instagram": "https://www.instagram.com/stripe",
"youtube": "https://www.youtube.com/c/stripe"
},
"contactPageUrl": "https://stripe.com/contact",
"techStack": ["Cloudflare", "Google Analytics", "Next.js", "React", "Stripe"],
"pagesCrawled": 10
}

Which platforms and tools it detects on a domain

detectTechStack (on by default) matches the fetched HTML against 25 fingerprints and returns the hits as a techStack array, so a run over a domain list doubles as a platform census β€” filter the column to find every Shopify store, every WordPress site, or every account already running HubSpot or Intercom:

What you want to findDetected as
Ecommerce / CMSShopify, WordPress, Magento, Drupal, Ghost, Wix, Squarespace, Webflow
CRM, chat & supportHubSpot, Intercom, Zendesk
Analytics & taggingGoogle Analytics, Google Tag Manager
PaymentsStripe
Front-end frameworksReact, Next.js, Vue.js, Angular, jQuery, Bootstrap, Tailwind CSS
Hosting & CDNCloudflare, Vercel, Netlify

Detection is signature-based on the HTML actually served (script URLs, CSS bundles, platform markers such as wp-content, cdn.shopify.com, __NEXT_DATA__, hs-scripts), so it reflects what the site loads today. Anything outside those 25 signatures is not reported β€” the field is a shortlist for targeting, not a full BuiltWith-style inventory.

Emails are not the only thing pulled out of each page. The same crawl fills four more columns:

  • phones β€” every number in the page text and tel: links across all crawled pages, kept only when it has 7–15 digits, so a phone in the footer or the contact page is caught even when the homepage shows none.
  • socialLinks β€” LinkedIn, Twitter/X, Facebook, Instagram and YouTube. The first profile URL per network is kept, which in practice is the header or footer link (the company account) rather than a share button deep in a blog post.
  • addresses β€” street addresses found in the page text, usually from the contact page or the imprint.
  • contactPageUrl β€” the crawled URL that actually served the contact details, so you can check any record by hand.

The pages visited, in order, are /, /contact, /contact-us, /contacto, /kontakt, /about, /about-us, /sobre-nosotros, /team, /our-team, /people, /imprint, /impressum, /legal, /privacy, /privacy-policy, /footer, /sitemap β€” cut off at maxPagesPerDomain. Only if you set that above 18 does the crawler start following discovered links. German impressum and Spanish contacto/sobre-nosotros are in the list on purpose: EU sites are legally required to publish contact details on the imprint page, which makes them the highest-yield page on the whole domain.

Finding the contact page for a list of websites

Most sites bury the address that actually gets read. contactPageUrl is the resolved link to the page a human would use β€” /contact, /contact-us, /get-in-touch, whatever that site calls it β€” found by crawling the domain rather than guessing at a path.

That column matters when the domain publishes no address at all. A contactPageUrl with an empty emails array is not a dead row: it is a company that routes everything through a form. For an outreach list, that is a different bucket β€” worth a form submission or a LinkedIn touch, not a bounced send.

Sort your export by whether emails is empty and you have split the list into two campaigns without opening a single site.

Enriching a CSV of domains

The input is a list of domains, so the normal shape of a run is: export the domain column from your CRM or lead list, paste it in, and join the result back on domain.

Every row comes back keyed by the domain you passed, so the join is exact β€” no fuzzy matching on company names, no duplicates from Acme Inc versus Acme, Inc.. companyName is filled in from the site itself, which is often cleaner than whatever your CRM has stored.

For a large list, the pagesCrawled column tells you how much of each site was read before the Actor stopped. A domain with a low count and no emails is usually a single-page site or a redirect, not a failure worth retrying.

What it detects on a domain besides the email

Three columns come back that are not contact details, and each one is a filter:

  • techStack β€” the platforms and libraries found on the site, such as ["Google Analytics", "Magento", "Next.js", "React"]. Selling a Shopify app, a Magento migration or a React contract? Filter on this and the list is pre-qualified.
  • socialLinks β€” an object with the profiles found: linkedin, twitter, facebook, instagram, youtube. A company with a LinkedIn page and no email is reachable; one with neither is usually dormant.
  • phones β€” dialable numbers pulled from the page. Analytics ids and version strings that merely look numeric are rejected, so what lands here is meant to be called.

Verifying which domains can actually receive mail

Scraping an address is half the job; the other half is knowing whether sending to it is worth a slot in your sequence. emails returns every address found on the domain, and the count itself is signal: a domain with five role addresses (info@, sales@, support@) is a company with departments, while a single personal address is usually a small team where that person reads it.

If you need syntax and MX verification on top, chain Email Verifier over this output β€” this Actor finds addresses, it does not test their deliverability.

Where it fits: prospecting pipelines

  • Google Maps β†’ contacts. Run the Google Maps Business Scraper for your niche and location, feed the website URLs here, and push enriched leads to your CRM on a schedule β€” fully hands-off via Make, n8n, Zapier, Sheets or webhooks.
  • List enrichment. Already have target accounts? Paste their domains and fill in the email/phone/social columns in one run.
  • Tech-stack targeting. Sell a Shopify app? Filter techStack for Shopify stores. Compete with Intercom? Target the sites running it.
  • Decision-maker emails. This Actor extracts what sites publish. For a specific person's unpublished address, chain into the Email Finder (name + domain β†’ pattern-ranked guess), then clean everything with the Email Verifier.

FAQ

How do I extract email addresses from a website? Paste the domain into this Actor and run it β€” it crawls the homepage plus the highest-value pages and returns every publicly listed email, along with phones, addresses and social links. No code, no browser extension, no API key.

Can it scrape emails from multiple websites at once? Yes β€” that's the primary design. Paste hundreds or thousands of domains; they're crawled in parallel (maxConcurrency up to 10) and land in one dataset, one row per domain.

How many emails will I get per site? Whatever each site publishes. Sites with real contact/team pages yield the most; form-only sites expose fewer. Even then you still get phones, socials, contact-page URL and tech stack, so no row comes back empty-handed.

Can I exclude info@ and support@ addresses? Yes β€” set includeGenericEmails: false to keep only personal or department-specific emails, which converts better for sales outreach.

Is scraping contact information legal? The Actor only extracts information companies publish publicly on their own websites. Using that data (GDPR, CAN-SPAM, recipient preferences) is your responsibility in your jurisdiction.

How is this different from Hunter.io's domain search? Hunter searches its pre-crawled index behind a subscription with credit tiers. This Actor crawls the site live at run time β€” no account, no credit caps, $0.006 per domain β€” and returns phones, addresses, socials and tech stack that email-only tools skip. Hunter's index can surface addresses a site no longer publishes; live crawling reflects what's there today.

What does a 1,000-domain run cost? About $6 ($0.006 Γ— 1,000 + $0.00005 start). You pay per domain processed β€” no monthly fee, no idle cost.

Can I schedule it to keep lists fresh? Yes β€” add it to an Apify Schedule (daily/weekly) and connect the output to your stack via native integrations: Google Sheets, Slack, Make, n8n, Zapier, or a webhook straight into your CRM.