Website Contact Scraper - Company Emails, Phones & Socials
Pricing
from $1.65 / 1,000 website with contacts
Website Contact Scraper - Company Emails, Phones & Socials
Extract company contact details from business websites: role-based emails (info@, sales@, support@), phone numbers, LinkedIn/Facebook/Instagram/X/YouTube profiles, address and contact page. GDPR-friendly: no personal emails. Fast, no browser. Export JSON/CSV or call via API/MCP.
Pricing
from $1.65 / 1,000 website with contacts
Rating
0.0
(0)
Developer
Teddy Wasserman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What does Website Contact Scraper do?
Website Contact Scraper is a company contact details extractor for lead generation and CRM enrichment. Give it a list of company websites or domains and it returns, for each one, the company emails (info@, sales@, support@, press@ …), phone numbers, social media profiles (LinkedIn company page, Facebook, Instagram, X/Twitter, YouTube, TikTok, GitHub, Pinterest and more), the postal address, and the contact page and contact form URLs.
It scans the homepage and the most relevant contact, about, imprint and support pages of each site with fast HTTP requests, no browser. It is GDPR-friendly by design: it returns company-level contact points only and never outputs personal email addresses such as jane.doe@company.com.
Why use Website Contact Scraper?
- One row per company. All contacts of a website merged and de-duplicated, ready to import into a CRM or a spreadsheet.
- Company contacts, not personal data. Role-based emails, switchboard numbers and official company profiles are what B2B outreach and data enrichment need, and they carry far less privacy risk than scraped personal addresses. Personal-looking addresses are counted (
personalEmailsSkipped) but never returned. - Social profiles done right. LinkedIn company pages only (never personal
/in/profiles), real account URLs instead of share buttons, and the full list of profiles found per network. - Structured data aware. Reads schema.org Organization / LocalBusiness JSON-LD for the company name, legal name, address, phone and
sameAsprofiles, and decodes Cloudflare-protected emails. - Pay only for results. You are charged per website where contacts were found. Unreachable websites and websites without any contact details are free.
- Fast and cheap. No browser: 10 websites take about 7 seconds. robots.txt is respected.
What data can you extract?
| Field | Example | Description |
|---|---|---|
website | https://apify.com/ | The website you gave |
domain | apify.com | Domain without www |
companyName | Apify | From schema.org or og:site_name |
legalName | Apify Technologies s.r.o. | schema.org legalName when published |
emails | ["hello@apify.com", "support@apify.com"] | Role-based company emails |
emailSources | [{"email": "hello@apify.com", "foundOn": "https://docs.apify.com/legal"}] | Page where each email was found |
phones | ["+14152559096"] | Phone numbers from tel: links and schema.org data |
linkedin | https://www.linkedin.com/company/apify | LinkedIn company page |
facebook | https://www.facebook.com/joesbarbershopsf | Facebook page |
instagram | https://www.instagram.com/ikea | Instagram account |
x | https://x.com/apify | X / Twitter account |
youtube | https://www.youtube.com/c/Apify | YouTube channel |
tiktok | https://www.tiktok.com/@apifytech | TikTok account |
socialProfiles | {"github": ["https://github.com/apify"], "bluesky": […]} | Up to 5 profiles per network (also Pinterest, GitHub, Xing, Threads, Bluesky, Mastodon) |
address | {"streetAddress": "Olof Palmestraat 1", "postalCode": "2616 LN", "addressLocality": "Delft", "addressCountry": "NL"} | Postal address from schema.org |
country | NL | Address country |
contactPageUrl | https://www.mozilla.org/en-US/contact/ | Contact or imprint page |
contactFormUrl | https://basecamp.com/support | Page with a contact form |
personalEmailsSkipped | 2 | Personal-looking emails found but not returned |
pagesScanned | 5 | Pages read on this website |
error / _info | http_403, No company contact details found | Free rows: why nothing was returned |
How to use Website Contact Scraper (step by step)
- Click Try for free.
- Paste company websites or domains into Websites, one per line (
apify.com,https://www.patagonia.com, …). Thousands per run are fine. - Optional: change Max pages per website (default 5) or switch on Only emails on the website's own domain.
- Click Start.
- Open the Contacts view, or export the dataset to CSV, Excel or JSON. Join it back to your list on the
websiteordomaincolumn.
Input example
{"websites": ["apify.com","https://www.patagonia.com","https://www.joesbarbershop.com"],"maxPagesPerWebsite": 5,"ownDomainEmailsOnly": true}
Output example
[{"website": "https://apify.com/","domain": "apify.com","loadedUrl": "https://apify.com/","companyName": "Apify","legalName": "Apify Technologies s.r.o.","emails": ["hello@apify.com", "legal@apify.com", "privacy@apify.com", "support@apify.com"],"phones": [],"linkedin": "https://www.linkedin.com/company/apify","x": "https://x.com/apify","youtube": "https://www.youtube.com/c/Apify","tiktok": "https://www.tiktok.com/@apifytech","socialProfiles": {"github": ["https://github.com/apify"], "tiktok": ["https://www.tiktok.com/@apifytech", "https://www.tiktok.com/@apifyoffice"]},"address": {"streetAddress": "Na Příkopě 959/27", "postalCode": "11000", "addressLocality": "Prague", "addressCountry": "CZ"},"country": "CZ","contactPageUrl": "https://apify.com/contact","contactFormUrl": "https://apify.com/contact-sales","personalEmailsSkipped": 0,"pagesScanned": 5,"scrapedAt": "2026-10-21T19:58:00Z"},{"website": "https://www.joesbarbershop.com/","domain": "joesbarbershop.com","companyName": "Joe's Barbershop","emails": [],"phones": ["+14152559096"],"facebook": "https://www.facebook.com/joesbarbershopsf","x": "https://x.com/joesbarbershop","pagesScanned": 2,"scrapedAt": "2026-10-21T19:58:01Z"}]
Real output from October 2026; each website returns what it publishes.
How much does it cost?
Website Contact Scraper uses pay-per-event pricing, charged per website with results, not per page.
| Event | Price (Free plan) | When it is charged |
|---|---|---|
| Actor start | $0.0005 | Once per run |
| Website with contacts | $0.003 ($3 per 1,000 websites) | A website where at least one email, phone, social profile or address was found |
Unreachable websites (DNS errors, timeouts, 403 bot protection), websites blocked by robots.txt and websites without any contact details are free. Paid Apify plans get Store discounts (Bronze −15%, Silver −30%, Gold and up −45%).
Worked examples (Free plan prices):
- Enrich 1,000 leads from a spreadsheet, 800 with contacts: 800 × $0.003 ≈ $2.40.
- 10,000 domains from a trade-fair exhibitor list, 7,000 with contacts: ≈ $21.
- Weekly refresh of 200 key accounts: ≈ $0.60 per run, about $2.40 per month.
The Apify Free plan includes monthly platform credit, which covers runs like these.
Use cases
- B2B lead generation. Turn a list of company domains (from a directory, a trade fair, Google Maps exports or a tech-stack search) into contact points for outreach.
- CRM enrichment. Fill missing phone numbers, generic emails and LinkedIn company URLs in HubSpot, Salesforce or Pipedrive.
- Social media research. Find every official social account of a list of brands, e.g. to monitor competitors or build influencer and partner lists.
- Market mapping. Collect addresses and countries of companies in a niche to see where they are based.
- Data cleaning. Check which websites in your database are dead (free error rows) and which still publish contact details.
- AI agents. Give an agent a tool that answers "how do I contact this company?" with structured, company-level data.
Use with AI agents, MCP and the API
curl -X POST "https://api.apify.com/v2/acts/teddythebuilder~website-contact-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"websites":["apify.com","patagonia.com"]}'
Python with apify-client:
from apify_client import ApifyClientclient = ApifyClient("<TOKEN>")run = client.actor("teddythebuilder/website-contact-scraper").call(run_input={"websites": ["apify.com", "python.org", "patagonia.com"],})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["website"], row.get("emails"), row.get("phones"), row.get("linkedin"))
MCP: the actor is available as a tool in the Apify MCP server (https://mcp.apify.com) for Claude, ChatGPT, Cursor and other MCP clients.
Integrations
Send results to Google Sheets, HubSpot, Salesforce, Pipedrive, Airtable, Make, Zapier, n8n, Slack or a webhook when a run finishes. Combine with a scheduled run to keep account data fresh.
Data source and legality
The actor reads public pages of the websites you provide over HTTP, after checking each site's robots.txt. It does not log in, does not bypass bot protection or CAPTCHAs, and does not use proxies to hide.
It is built to return company-level contact points only: role-based mailboxes (info@, sales@, support@, …), phone numbers published on the website or in its structured data, official company social accounts and the business address. Emails that look personal (first or last names) are skipped and only counted. LinkedIn personal profiles are never returned. That keeps the output suited to B2B use under GDPR's legitimate-interest rules, but you remain responsible for how you contact people: follow your local direct-marketing laws (e.g. opt-in rules for email marketing) and honour opt-outs.
FAQ
Why are some emails missing?
Personal addresses (e.g. anna.svensson@company.se) are intentionally not returned. Many companies also use only contact forms; then you get contactFormUrl instead. Emails that are only shown by JavaScript or as images can't be read without a browser.
Which emails count as "role-based"? Addresses whose name part is a function: info, contact, hello, sales, support, service, office, press, media, marketing, hr, jobs, careers, billing, invoice, booking, orders, privacy, legal and about 150 more, in several languages (kontakt, kundservice, vertrieb, …), also with region suffixes like info.se@ or salesuk@.
Why did a website return an error?
http_403 usually means bot protection; dns_error means the domain doesn't resolve; blocked_by_robots_txt means the site disallows crawlers. All of these rows are free.
Does it find phone numbers written in the page text?
It returns numbers published as clickable tel: links or in schema.org data, which are the numbers companies intend to be called on. Free-text number guessing is avoided because it produces many false positives (order numbers, VAT IDs).
How many pages are scanned?
The homepage plus up to 4 pages whose URL or link text looks like contact, about, imprint, support, press or locations. Change it with maxPagesPerWebsite.
Can I run it on Google Maps results? Yes. Export the website column of any business list and paste it in.
Something looks wrong for a website. Open an issue with the URL. We reply within 24 hours. If the actor helps you, a rating on the Store page helps others find it.
Related actors
- Tech Stack Detector: find companies that use Shopify, HubSpot, WordPress and 3,000 other technologies, then get their contacts here.
- Domain WHOIS & DNS Lookup API: registration, MX/SPF/DMARC and SSL data for the same domains.
- Nordic Company Registry API: official company records for Sweden, Norway and Finland.
- Website to Markdown: the readable content of any web page for AI and research.
- Career Site Jobs API: which companies are hiring, from their own job boards.
Changelog and support
- 1.0 (October 2026): first release. Role-based emails, phones, social profiles, schema.org name/address, contact page and form, Cloudflare email decoding, free rows for unreachable or empty websites.
Questions or feature requests? Open an issue on the actor page. We reply within 24 hours.