Website Contact & Email Finder – Emails, Phones & Tech Stack
Pricing
from $4.00 / 1,000 website with contacts founds
Website Contact & Email Finder – Emails, Phones & Tech Stack
Website contact & email finder: paste domains, get MX-verified emails, phones, LinkedIn, Instagram, X & other socials plus the site's tech stack (Shopify, WordPress, HubSpot, Klaviyo, Stripe…) in one row per site. Filter by technology, e.g. Shopify stores only. Pay only for sites with contacts.
Pricing
from $4.00 / 1,000 website with contacts founds
Rating
0.0
(0)
Developer
Ani Björkström
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share
Website Contact & Email Finder – Emails, Phones, Socials & Tech Stack
Website Contact & Email Finder turns any list of websites or bare domains into a clean lead list: it crawls each site's homepage plus its contact, about, team, impressum and support pages and returns emails, phone numbers, social media profiles, address, company name and the site's tech stack — one row per website.
Four things set this email scraper apart from cheap "extract emails from websites" actors:
- MX-verified emails. Every email domain gets a DNS MX lookup, so each address carries
mxValid: true / false / null. Dead domains are flagged before they bounce in your outreach tool. - Everything in one row. Emails (labelled generic vs personal), phones (raw + E.164), LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub, Threads and Pinterest, plus the best contact page, address and company name. No second enrichment step.
- Tech stack detection built in. Every row says which CMS, ecommerce platform, analytics, marketing tools, payment providers and hosting/CDN the site runs — Shopify, WooCommerce, WordPress, HubSpot, Klaviyo, Mailchimp, Intercom, Stripe, Klarna and ~400 more — so you can find Shopify stores' emails or HubSpot customers in one run, without a separate Wappalyzer/BuiltWith lookup.
- You pay only for websites where contacts were found. Unreachable sites, parked domains and pages without any contact data are delivered as explanatory rows — free.
No proxy setup, no API key, no login, no headless browser. Paste 5 domains or 50,000.
What you get
One row per website. Arrays stay inside the row, so the dataset is flat, agent-friendly and MCP-ready.
| Field | Description |
|---|---|
url | The website exactly as you entered it |
finalUrl | Where the homepage actually resolved (www / https / redirects followed) |
status | ok (contacts found, charged), no_contacts_found (free), unreachable (free), filtered_out (does not use your filter technologies — free, no contact data) |
error | Plain-English reason when the status is not ok |
companyName | og:site_name → schema.org Organization name → page title |
primaryEmail | The best address for outreach: on-site domain, MX-valid, info@/contact@/hello@ first |
emails[] | { email, type: "generic" | "personal", mxValid, onSiteDomain, foundOn } — sorted best-first |
emailCount | Number of distinct emails after filtering |
primaryPhone | First phone number in E.164 when it can be resolved, otherwise as written |
phones[] | { raw, normalized, e164, foundOn } |
phoneCount | Number of distinct phone numbers |
linkedin, twitter, facebook, instagram, youtube, tiktok, github, threads, pinterest | One canonical profile URL per network |
socials[] | Every social profile URL found, canonicalised and de-duplicated |
contactPageUrl | The contact / kontakt / impressum page that was found |
addressText | Postal address from schema.org PostalAddress JSON-LD or an <address> block — null when the site does not state one, never guessed |
technologies[] | { name, categories[], version, confidence } for every detected technology (see Tech stack detection) |
technologyCount | Number of technologies detected |
cms | Main CMS / site builder, e.g. WordPress, Webflow, Wix, HubSpot CMS Hub — null if none detected |
ecommercePlatform | Shopify, WooCommerce, Magento, BigCommerce, PrestaShop… or null |
analytics[] | Analytics tools, e.g. Google Analytics, Hotjar, Microsoft Clarity, Matomo Analytics |
marketingTools[] | Marketing automation, email, live chat, CRM, scheduling: HubSpot, Klaviyo, Mailchimp, Intercom, Calendly… |
paymentProviders[] | Stripe, PayPal, Klarna Checkout, Shop Pay, Adyen, Afterpay… |
hostingCdn | Most specific host or CDN: Vercel, WP Engine, Netlify, Cloudflare, Fastly… or null |
matchedTechnologies[] | Which of your technologies filter terms the site matched (empty when no filter is set) |
siteTitle, metaDescription, language | Homepage title, meta description and <html lang> |
fetchedViaProxy | true when the site was fetched through Apify Proxy (automatic fallback for blocked sites, or your own proxy setting) |
pagesCrawled | How many pages were fetched for this site |
scrapedAt | ISO 8601 UTC timestamp |
Example row (abridged)
{"url": "https://www.netlight.com", "status": "ok", "companyName": "Netlight","primaryEmail": "info@netlight.com", "emailCount": 18,"emails": [{ "email": "info@netlight.com", "type": "generic", "mxValid": true, "onSiteDomain": true, "foundOn": "https://www.netlight.com/contact" }],"primaryPhone": "+4686169940","phones": [{ "raw": "+46 8 616 99 40", "normalized": "+4686169940", "e164": "+4686169940", "foundOn": "https://www.netlight.com/contact" }],"linkedin": "https://www.linkedin.com/company/netlight-consulting/","instagram": "https://www.instagram.com/netlightconsulting/","contactPageUrl": "https://www.netlight.com/contact","cms": "Sanity", "ecommercePlatform": null, "hostingCdn": "Vercel","technologies": [{ "name": "Sanity", "categories": ["CMS"], "version": null, "confidence": 100 },{ "name": "Next.js", "categories": ["JavaScript frameworks", "Web frameworks", "Static site generator"], "version": null, "confidence": 100 }],"addressText": "Herengracht 282, 1016 BX Amsterdam, Netherlands","language": "en", "pagesCrawled": 4, "scrapedAt": "2026-09-22T18:41:07Z"}
How the website contact finder works
- Homepage first. Bare domains get
https://;www/non-wwwandhttps/httpvariants are tried, redirects followed, tracking parameters stripped. - Smart page selection. Same-domain links are scored by URL and anchor text — contact, kontakt, about, team, impressum, imprint, support, help, press, careers, legal, privacy, om oss, über uns — and the best
maxPagesPerSite − 1pages are fetched;/contact,/about,/kontakt,/impressumare guessed as a fallback. - Deep email extraction.
mailto:links, text regex, JSON-LDOrganizationdata, obfuscations (name [at] domain [dot] com,name (at) domain,name at domain dot com, HTML entities) and Cloudflaredata-cfemailprotection are all decoded. Image filenames (logo@2x.png),example.com, Sentry/Wix/GoDaddy noise andnoreply@are filtered out. - Phone number scraper.
tel:links plus international patterns such as+46 8 123 45 67,(415) 555-0132,0800 123 456— returned as written, as digits, and as E.164 when the country can be inferred from a+prefix, the country TLD or the page language. - Social media links extractor. Profile links from headers, footers, social widgets and schema.org
sameAs, canonicalised (twitter.com/x→https://x.com/x; share/intent/login links ignored); the profile matching the site's brand wins. - MX verification. Each unique email domain is resolved once (3 s timeout, cached across the run). No MX but a valid A record still counts as deliverable (RFC 5321); NXDOMAIN →
false; timeout →null. - Parked-domain protection. Registrar parking pages and hosting placeholders ("website is currently not available", "domain for sale", nginx/Apache default pages) come back as
unreachable, so you are never charged for a hosting provider's support address.
Pages are fetched with a desktop Chrome user agent, HTML only (bodies capped at 3 MB), one page at a time per site with a short pause. Websites run in parallel; one dead site never affects another.
Tech stack detection
With Detect technologies on (the default), the email finder also works as a tech stack lookup / Wappalyzer alternative for every site in your list — at no extra cost and with no extra requests. It reuses the homepage and contact pages it already downloads and matches them against ~420 technology fingerprints:
- Response headers and cookies —
x-shopify-stage,powered-by: Shopify,x-pingback,cf-ray,x-vercel-id,_shopify_y,__stripe_mid… <meta name="generator">—WordPress 6.6,Drupal 10,Wix.com Website Builder,WooCommerce 9.1(with version numbers where the site exposes them)- Script URLs —
cdn.shopify.com,js.hs-scripts.com,static.klaviyo.com,js.stripe.com,widget.intercom.io… - HTML patterns and CSS selectors —
/wp-content/,data-wf-site,woocommerceclasses, HubSpot form embeds - JavaScript globals, only when they appear as code in inline scripts (
Shopify.theme,_hsq.push,klaviyo.push) — nothing is executed
Each technology gets a confidence (50–100) and, when available, a version. Implied technologies are added (WooCommerce → WordPress), and app-specific entries are only kept when their parent platform is present, which keeps false positives low.
Covered categories: CMS & site builders (WordPress, Webflow, Wix, Squarespace, Drupal, Joomla, HubSpot CMS, Contentful, Sitevision…), ecommerce (Shopify, WooCommerce, Magento, BigCommerce, PrestaShop, Shopware, Wikinggruppen…), analytics (Google Analytics, Hotjar, Clarity, Matomo, Plausible…), marketing automation & email (HubSpot, Marketo, Pardot, Mailchimp, Klaviyo, ActiveCampaign, Brevo…), live chat (Intercom, Drift, Zendesk, Tawk.to, Crisp…), payments (Stripe, PayPal, Klarna, Adyen, Svea, Nets Easy, Qliro, Walley…), cookie consent (Cookiebot, OneTrust…), hosting/CDN (Cloudflare, Fastly, Vercel, Netlify, WP Engine…), JS frameworks, recruiting tools (Teamtailor, Greenhouse, Lever) and more.
Filter: only keep sites that use a technology
Set Only keep sites using these technologies (technologies) to e.g. ["Shopify"], ["WooCommerce", "Magento"], ["HubSpot"] or a whole category such as ["Ecommerce"] or ["Live chat"]. Sites that use at least one of them are crawled for contacts as usual and charged as normal ok rows. Every other site gets a free filtered_out row (with its detected technologies, but no contact data) after a single homepage request — so filtering a big list down to Shopify stores is fast and you only pay for the matches.
Shopify stores work out of the box. Shopify (and some Cloudflare-protected sites) block cloud datacenter IPs with HTTP 429/403 or a bot-challenge page. When that happens the actor automatically retries just that site through Apify Proxy with a fresh session — no setting needed, and sites that answer normally never use the proxy. Such rows have
fetchedViaProxy: true.
{"startUrls": ["rains.com", "deathwishcoffee.com", "woocommerce.com", "kvadrat.se"],"technologies": ["Shopify"]}
Tech stack use cases
- Find Shopify stores with emails — feed a list of brand domains, keep only Shopify, and get the store's contact email, phone, Instagram and payment providers (Shop Pay, Klarna, Afterpay) for app or agency outreach.
- Find WooCommerce / Magento shops for migration offers, plugin sales or ecommerce agencies.
- Find HubSpot, Marketo or Pardot customers — partners and agencies selling HubSpot services can target companies already on the platform.
- Klaviyo vs Mailchimp prospecting — email-marketing agencies spot stores still on Mailchimp, or Klaviyo users for an app pitch.
- WordPress maintenance & security leads — WordPress sites with emails, plugin versions (Yoast, Elementor, WPML) and hosting.
- Competitive / market research — what share of an industry list runs Shopify vs WooCommerce, which analytics and consent tools they use.
Input
{"startUrls": ["https://www.netlight.com","kvadrat.se","www.zingermans.com","https://russanddaughters.com/"],"maxPagesPerSite": 8,"verifyEmailDomains": true,"includeGenericEmails": true,"concurrency": 10,"requestTimeoutSecs": 20,"detectTechnologies": true,"technologies": []}
| Option | Default | What it does |
|---|---|---|
startUrls | 3 demo sites | Websites to scan — full URLs or bare domains, one per line; [{ "url": "..." }] objects from other actors also work. |
maxPagesPerSite | 8 | Homepage + up to this many contact-like pages (1–30). 2–3 is fast; 8 finds nearly everything on a business site. |
verifyEmailDomains | true | DNS MX lookup per email domain → mxValid. |
includeGenericEmails | true | Keep info@, contact@, sales@… Turn off for named / personal addresses only. |
detectTechnologies | true | Detect CMS, ecommerce platform, analytics, marketing tools, payments, hosting and ~400 more technologies from the pages already fetched. Free. |
technologies | empty | Optional filter: keep only sites using at least one of these technologies or categories (e.g. Shopify, HubSpot, Ecommerce). Others → free filtered_out rows. |
concurrency | 10 | Websites processed in parallel (1–50). |
requestTimeoutSecs | 20 | Per-page timeout (5–120). |
proxyConfiguration | off | Requests go out directly; sites that block datacenter IPs (403/429/challenge) are retried automatically through Apify Proxy. Set a proxy here only to route every request through it. |
Running with no input scans the three demo websites, so you can see the output shape in one click.
Use cases
- Sales & SDR teams — bulk domain to email. Export target-account domains from your CRM, run the finder, push
primaryEmail,primaryPhoneandlinkedinback as enrichment. Only MX-valid addresses reach your sequences. - Local business prospecting for agencies. Chain the email finder after the Google Maps Lead Scraper: Maps gives you the business website, this website contact scraper gives you the email, Instagram and Facebook page behind it.
- Recruiters and staffing firms. Find
careers@, HR and hiring-manager addresses plus LinkedIn company pages for a list of employers. - PR, link-building and outreach. Turn a list of blogs, publishers or partner sites into
press@/ editorial contacts with the correct social handles for a personalised pitch. - Shopify & ecommerce app vendors. Filter a domain list to Shopify (or WooCommerce) stores and get the store's email and socials in the same row — see Tech stack detection.
- HubSpot / Klaviyo partners and martech agencies. Find companies already using (or not using) a marketing tool, with their contact details.
- Market researchers. Company name, language, address and social footprint for a whole industry list, exported to CSV or Excel.
- AI agents and RAG pipelines. Flat JSON rows with stable field names make this a drop-in contact-lookup tool for LLM agents via the Apify MCP server.
Pricing
The website contact & email finder is pay-per-result: the website event is charged once per row with status: "ok" (at least one email, phone number or social profile delivered). Tech stack detection is included at no extra cost. Rows with status: "no_contacts_found", "filtered_out" or "unreachable" (DNS failure, 403/5xx, parked domain, timeout) are free, so you still learn what happened to every input. No start fee, no charge per page crawled — raising maxPagesPerSite never costs more.
Integrations
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("nourishing_courier/website-contact-email-finder").call(run_input={"startUrls": ["netlight.com", "kvadrat.se", "zingermans.com"],"maxPagesPerSite": 8,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["url"], row["primaryEmail"], row["primaryPhone"], row["linkedin"])
JavaScript (npm i apify-client):
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_APIFY_TOKEN" });const run = await client.actor("nourishing_courier/website-contact-email-finder").call({startUrls: ["netlight.com", "kvadrat.se", "zingermans.com"],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((r) => [r.url, r.primaryEmail, r.emails.length]));
curl (run synchronously and get the dataset back):
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~website-contact-email-finder/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": ["netlight.com", "kvadrat.se"], "maxPagesPerSite": 5}'
n8n, Make, Zapier. Use the Apify node/module: trigger on a new row in Google Sheets, HubSpot or Airtable, run this actor with the domain, and write primaryEmail, primaryPhone and the social URLs back. Every input produces exactly one row, so lead-enrichment mapping is one-to-one.
MCP / AI agents. Add the actor to the Apify MCP server and your agent gets a find website contacts tool returning flat JSON it can reason over.
Limits, legal & fair use
This actor only reads publicly published business contact information — the same addresses, phone numbers and social links a company puts on its own website for people to use. It sends plain HTTP requests at a gentle pace (pages within one site are fetched sequentially with a pause), does not log in anywhere, does not bypass paywalls or CAPTCHAs, and does not guess or generate email addresses.
Use the results responsibly. Under GDPR, contacting a business at a role or corporate address is generally covered by legitimate interest for B2B outreach, but you remain the data controller: honour opt-outs and unsubscribe requests, keep a lawful basis for personal (named) addresses, respect anti-spam rules such as CAN-SPAM and PECR, and never use this data for unsolicited consumer marketing or spam.
Technical limits worth knowing:
- JavaScript-only sites. Contact details rendered purely by client-side JavaScript (some React/Vue single-page apps) are invisible to a plain HTTP email scraper. WordPress, Wix, Squarespace, Shopify and Webflow sites expose contacts in the HTML and work fine.
- Automatic proxy fallback. Sites that block the direct request (HTTP 403/429 or an anti-bot challenge page, e.g. Shopify stores) are retried once through Apify Proxy. If that also fails, the row is
unreachableand free. - Anti-bot walls. A small share of sites behind aggressive Cloudflare or Akamai rules return 403 to datacenter traffic. Those are retried through Apify Proxy automatically; if they still refuse, they come back as
unreachable— free. - Tech detection sees the HTML, not the browser. Tags that are injected only at runtime by Google Tag Manager (or loaded after consent) may not show up — GTM itself is reported. Detection is fingerprint-based and can occasionally miss a heavily customised setup; it never guesses from the site's text content.
- Caps. 250 emails and 100 phones per site, 3 MB per page.
- Phone detection is pattern-based; on pages full of numeric codes a stray ID can occasionally slip through.
tel:links and+-prefixed numbers are always reliable.
FAQ
How do I extract emails from a list of websites in bulk?
Paste the domains into Websites (one per line — bare domains are fine), leave the defaults, and click Start. You get one row per domain with all emails found, MX-verified, plus phones and socials. Thousands of domains in one run are fine; raise Parallel websites to speed it up.
Does this email finder work without an API key or login?
Yes. It reads public web pages directly — no Hunter/Apollo/Clearbit key, no Google account, no proxy.
What does mxValid mean and how is it different from email verification services?
mxValid checks the DNS of the email's domain: true means the domain has mail servers (or an A record fallback) and can receive mail, false means it cannot, null means DNS timed out. It is not an SMTP mailbox check, so it cannot tell you whether john@ specifically exists — but it removes every address on a dead or misspelled domain for free.
Can it tell generic emails from personal ones?
Yes. info@, contact@, hello@, sales@, support@, press@, kontakt@ and about a hundred similar role addresses are labelled generic; named addresses like anna.svensson@ are personal. Set Include generic emails to off to keep only personal ones.
Why is a website marked unreachable, and does the email finder charge for it?
The homepage could not be fetched as HTML — DNS failure, connection refused, HTTP 403/404/5xx, timeout, a parked domain or a hosting placeholder page. The error field says which. Unreachable and empty websites are never charged.
Does this website contact scraper work with n8n, Make or Zapier?
Yes. Use the Apify integration in any of them, pass the domain as startUrls, and map primaryEmail, primaryPhone, linkedin, facebook, instagram from the single output row back into your sheet or CRM.
How do I find Shopify stores and their email addresses?
Put the store domains in Websites and Shopify in Only keep sites using these technologies. Shopify stores come back as normal rows with emails, phones, Instagram/Facebook and the detected apps and payment providers; non-Shopify sites come back as free filtered_out rows. The same works for WooCommerce, Magento, BigCommerce, Wix or Squarespace.
Is this a Wappalyzer / BuiltWith alternative?
For lead generation, yes: every row includes a Wappalyzer-style tech stack lookup (technologies, cms, ecommercePlatform, analytics, marketingTools, paymentProviders, hostingCdn) next to the contacts, with no API key and no extra charge. It does not provide historical "used since" data or traffic estimates.
How do I find companies that use HubSpot (or Klaviyo, Intercom, Stripe)?
Set the technology filter to HubSpot (this also matches HubSpot CMS Hub and HubSpot Analytics), or to any other tool or category such as Klaviyo, Intercom, Stripe, Live chat or Marketing automation. Only sites that use it are charged.
Does tech stack detection cost extra or slow the run down?
No. It reuses the pages already downloaded for contact extraction, adds no requests and is not a separate charge event. Turn Detect technologies off if you do not need the columns.
Can I combine the email finder with Google Maps results?
Yes — run the Google Maps Lead Scraper for "dentists in Austin" or "restauranger Stockholm", take the website column, and feed it here to get emails, Instagram and Facebook pages for every business.
Technology fingerprints are derived from the MIT-licensed Wappalyzer project (2023 snapshot) plus this actor's own signatures.