Website Contact Scraper — $3/1K Sites, Emails & Phones
Pricing
from $2.10 / 1,000 website with contacts
Website Contact Scraper — $3/1K Sites, Emails & Phones
[$3/1K sites with contacts] Website contact scraper and email extractor: paste company domains and get one row per site with emails, phones in E.164, LinkedIn, Facebook, Instagram and 6 more socials, the contact page and an MX check. Sites with no contacts are free. No API key.
Pricing
from $2.10 / 1,000 website with contacts
Rating
0.0
(0)
Developer
apifry
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Website Contact Scraper — Emails, Phones & Socials
Paste a list of company websites and get one clean lead row per website: emails, phone numbers, social profiles and the contact page URL. No API keys, no login. A fast plain-HTTP crawl by default, plus an optional browser mode for websites that only show contacts after JavaScript runs.
You only pay for websites where at least one email or phone number was found. Sites with no contacts, unreachable sites and sites behind bot protection are still listed in the results (so you know what happened) but cost nothing.
Tested on 100 real company websites
Same 100 websites, same day, compared with the most-used contact scraper in Apify Store (which charges per page), both limited to 8 pages per site:
| This Actor | Per-page contact scraper | |
|---|---|---|
| Websites with an email | 74 | 66 |
| Unique emails found | 587 | 339 |
| Placeholder / broken addresses | 0 | 3 |
| Price for these 100 websites | $0.23 | $1.44 |
You pay for the 78 websites where contacts were found, not for 732 pages. Honest notes: one run on mostly mid-size and large companies (SaaS, hosting, law firms, hotels, restaurants, brands, nonprofits in the US and Europe); the other scraper got past bot protection on more sites (97 vs. 86 reachable); about a quarter of our emails are on the company's other domains or its partners' — turn on Only emails on the website's own domain if you don't want them.
What you get for each website
| Field | Example |
|---|---|
domain | acme.de |
status | ok, no_contacts, unreachable, blocked, invalid_input |
primaryEmail | info@acme.de — the best first-touch address |
emails | ["info@acme.de", "anna.schmidt@acme.de"] |
emailDetails | type (generic / personal), same domain as the site, MX check, page where it was found |
phones | ["+493012345670"] — normalized to international E.164 format |
linkedin, facebook, instagram, twitter, youtube, tiktok, pinterest, telegram, whatsapp | company profile URLs |
contactPageUrl | https://acme.de/kontakt |
pagesScraped | 3 |
renderedWithBrowser | false — true if contacts were found only with the browser option |
Results can be downloaded as CSV, Excel or JSON, or sent to Google Sheets, HubSpot, Make, Zapier and n8n through Apify integrations.
Why this extractor finds more (and less junk)
- Goes straight to the right pages. Besides the homepage it opens the pages most likely to list contacts — Contact, About, Team, Impressum, Mentions légales, Aviso legal and their equivalents in 10+ languages — instead of crawling a blog.
- Reads hidden emails. Cloudflare-protected addresses (
[email protected]),name [at] company [dot] com, HTML entities and emails inside JSON/scripts. - Drops junk. No
logo@2x.png, tracking IDs,noreply@,you@example.comor placeholder addresses. - Checks deliverability. Every email domain is checked for mail servers (MX), so dead addresses are flagged.
- Phones you can dial. Numbers from
tel:links and page text are validated and converted to+CountryCode…. The country is guessed from the domain ending (.de→ Germany) or set by you. - Handles real-world input.
www.,http://, paths and duplicates are normalized, redirects to a new domain are followed, international domains are supported.
Use cases
- Cold outreach. You have a list of target companies from Google Maps, a directory or a trade-show exhibitor list. Get a generic address (
info@,sales@) and named people's emails for each one, ready for your email tool. - CRM enrichment. Export the websites of accounts with no contact data from HubSpot, Pipedrive or a spreadsheet, run them here and import the results back. One row per website keeps the join simple.
- Partner and supplier lists. Check hundreds of distributor, agency or supplier websites at once and see who publishes a contact email, a phone number or a LinkedIn page — and which websites are down.
- List cleanup. Spot dead domains (
unreachable), websites that redirect to another company, and emails whose domain can no longer receive mail (mxValid: false) before you send a campaign.
How to use it
- Add websites to Websites — one domain or URL per line (thousands per run are fine).
- Optionally adjust Max pages per website (default 8) and the other options.
- Many websites came back
no_contactsorblocked? Turn on Render JavaScript for sites with no contacts (browser). Only those websites are opened again in a headless browser, and they are billed at the browser price only if contacts are found. Give the run at least 2 GB of memory.
- Many websites came back
- Click Start and download the results.
Input example
{"urls": ["acme.de", "https://www.example-bakery.co.uk/about"],"maxPagesPerDomain": 8,"includePhones": true,"includeSocials": true,"onlySameDomainEmails": false,"verifyMx": true,"renderJavaScript": false}
Output example
{"domain": "acme.de","status": "ok","primaryEmail": "info@acme.de","emails": ["info@acme.de", "anna.schmidt@acme.de"],"phones": ["+493012345670"],"linkedin": "https://www.linkedin.com/company/acme-gmbh","instagram": "https://www.instagram.com/acme.de","contactPageUrl": "https://acme.de/kontakt","pagesScraped": 3}
Pricing
| Event | When | Price |
|---|---|---|
| Website with contacts | Email or phone found with the normal (fast) crawl | $3.00 / 1,000 websites |
| Website with contacts (browser) | Contacts found only after rendering the site in a browser — only if you turn this option on | $12.00 / 1,000 websites |
Each website is billed at most once. Websites where nothing was found, unreachable or blocked websites are free — also when the browser was tried. The renderedWithBrowser field in the results shows which price applied. You can set a maximum spend per run in the run options; the extractor stops cleanly when the limit is reached.
Use with the API, AI agents and MCP
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<username>/website-contact-extractor").call(run_input={"urls": ["acme.de"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["domain"], item["primaryEmail"], item["phones"])
The extractor also works as a tool for AI agents through the Apify MCP server.
FAQ
Do I need proxies? Usually not. Sites that answer with bot protection are automatically retried once through Apify Proxy. If many sites still come back as blocked, turn on the browser option (it gets past some bot checks) or Apify Proxy (Residential) for all requests in the input.
What about very long lists? Runs time out after 1 hour by default. Before the timeout the extractor stops cleanly and tells you how far it got; resurrect the run (Actions → Resurrect) and it continues where it stopped without charging twice for any website.
Why is a website no_contacts? The site doesn't publish an email or phone on its main pages (some only have a contact form), or loads its content with JavaScript only. You are not charged for it. For JavaScript-only sites, turn on the browser option and run those websites again.
Is it legal? See Responsible use below.
Responsible use
The extractor only opens publicly available pages of the websites you list. It does not log in, solve CAPTCHAs or bypass paywalls, and it does not guess or generate email addresses. Personal data such as named employees' emails is still personal data: you are responsible for having a lawful basis to process it and for following the rules that apply to your outreach (for example GDPR in the EU/UK and CAN-SPAM in the US). If you are unsure, ask a lawyer.
Support
Something missing, wrong or unclear? Open an issue on the Issues tab — include the website and what you expected to see. Issues are answered within one business day. Need a custom version (other fields, other sources, a scheduled pipeline)? Open an issue with the details too.