Website Contact Scraper - Company Emails, Phones & Socials avatar

Website Contact Scraper - Company Emails, Phones & Socials

Pricing

from $1.65 / 1,000 website with contacts

Go to Apify Store
Website Contact Scraper - Company Emails, Phones & Socials

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

Teddy Wasserman

Maintained by Community

Actor 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 sameAs profiles, 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?

FieldExampleDescription
websitehttps://apify.com/The website you gave
domainapify.comDomain without www
companyNameApifyFrom schema.org or og:site_name
legalNameApify 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
linkedinhttps://www.linkedin.com/company/apifyLinkedIn company page
facebookhttps://www.facebook.com/joesbarbershopsfFacebook page
instagramhttps://www.instagram.com/ikeaInstagram account
xhttps://x.com/apifyX / Twitter account
youtubehttps://www.youtube.com/c/ApifyYouTube channel
tiktokhttps://www.tiktok.com/@apifytechTikTok 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
countryNLAddress country
contactPageUrlhttps://www.mozilla.org/en-US/contact/Contact or imprint page
contactFormUrlhttps://basecamp.com/supportPage with a contact form
personalEmailsSkipped2Personal-looking emails found but not returned
pagesScanned5Pages read on this website
error / _infohttp_403, No company contact details foundFree rows: why nothing was returned

How to use Website Contact Scraper (step by step)

  1. Click Try for free.
  2. Paste company websites or domains into Websites, one per line (apify.com, https://www.patagonia.com, …). Thousands per run are fine.
  3. Optional: change Max pages per website (default 5) or switch on Only emails on the website's own domain.
  4. Click Start.
  5. Open the Contacts view, or export the dataset to CSV, Excel or JSON. Join it back to your list on the website or domain column.

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.

EventPrice (Free plan)When it is charged
Actor start$0.0005Once 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 ApifyClient
client = 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.

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.