Website Contact Scraper avatar

Website Contact Scraper

Pricing

Pay per usage

Go to Apify Store
Website Contact Scraper

Website Contact Scraper

Crawl any list of websites and extract emails, phone numbers, and social media profiles. Visits the homepage plus contact, about, and team pages, then returns one clean deduped row per domain. No login.

Pricing

Pay per usage

Rating

5.0

(1)

Developer

Goutam Soni

Goutam Soni

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Extract emails, phone numbers, and social media profiles from any list of websites. No login, no API key required. Give it domains and it returns one clean, deduped contact row per site.

What it does

This website contact scraper crawls each target site starting at the homepage, follows the pages most likely to hold contact details (contact, about, team), and pulls every public contact point into a single normalized row per domain.

Features

  • Email extraction from mailto: links and visible page text, with asset filenames, tracking ids, and placeholder addresses filtered out so you get real, usable emails.
  • Phone number extraction from tel: links and page text, validated by digit count and pattern so years, prices, dates, and ids are never mistaken for phone numbers.
  • Social profile extraction across Twitter / X, Facebook, Instagram, LinkedIn, YouTube, GitHub, TikTok, Pinterest, Telegram, and WhatsApp. Share widgets and intent links are skipped, and each profile is returned as a clean canonical URL plus handle.
  • Smart contact-page crawl. Starts at the homepage, follows same-site links that look like contact pages, and probes conventional paths like /contact and /about even when they are not linked, up to the depth and page budget you choose.
  • One deduped row per domain. Contacts found across every visited page are merged and deduplicated, with handy per-network columns and total counts.
  • Bulk friendly. Pass hundreds of domains in one run with adjustable parallelism.

Use cases

  • Lead generation. Turn a list of company domains into an outreach-ready list of emails, phones, and social handles.
  • Lead list enrichment. Add missing phone numbers and social profiles to an existing CRM or prospect list.
  • Market and competitor research. Map the public contact footprint of companies in a niche or region.
  • Recruiting and partnerships. Find the right inbox and social channels to reach a target organization.
  • Website audit. Check which of your own sites publicly expose contact details, and where.

Input

FieldTypeDescription
websitesarrayDomains or URLs to crawl, with or without https. One result row is returned per entry. Required.
crawlDepthintegerLink levels to follow from the homepage. 0 = homepage only, 1 also follows contact, about, and team links. Default 1, max 3.
maxPagesPerSiteintegerHard cap on pages fetched per website. Keeps runs fast and predictable. Default 5, max 30.
probeCommonPathsbooleanAlso try /contact, /about, /team even when the homepage does not link them. Default true.
concurrencyintegerHow many websites to process in parallel. Default 5, max 20.
proxyConfigobjectProxy configuration. Residential is the default and most reliable option.

Example input

{
"websites": ["example.com", "https://www.acme-co.example"],
"crawlDepth": 1,
"maxPagesPerSite": 5,
"probeCommonPaths": true,
"concurrency": 5
}

Output

One clean row per website, with the most useful columns first:

{
"type": "contact",
"domain": "example.com",
"websiteUrl": "https://example.com/",
"emailCount": 2,
"phoneCount": 1,
"socialCount": 2,
"emails": ["hello@example.com", "sales@example.com"],
"phones": ["+15550100199"],
"socialProfiles": [
{ "network": "linkedin", "handle": "acme-co", "url": "https://www.linkedin.com/company/acme-co" },
{ "network": "twitter", "handle": "example_co", "url": "https://x.com/example_co" }
],
"twitter": "https://x.com/example_co",
"facebook": null,
"instagram": null,
"linkedin": "https://www.linkedin.com/company/acme-co",
"youtube": null,
"github": null,
"pagesCrawled": 4,
"scrapedAt": "2026-06-18T08:00:00.000Z"
}

Key fields

  • domain and websiteUrl identify the site the row belongs to.
  • emailCount, phoneCount, and socialCount let you sort and filter rows at a glance.
  • emails, phones, and socialProfiles hold the full deduped lists.
  • twitter, facebook, instagram, linkedin, youtube, github give a single primary URL per network for easy spreadsheet use.
  • pagesCrawled and scrapedAt are run metadata. A field is null or an empty list when that contact type is not published on the site.

FAQ

Do I need a login or API key? No. The scraper reads only publicly visible pages, so there is nothing to log into and no key to supply.

How many websites can I scrape? As many as you like in one run. Pass hundreds of domains in the websites list and raise concurrency to process more in parallel.

How fast is it? Each site is fetched over plain HTTP with a small contact-page crawl, so throughput depends mainly on concurrency and maxPagesPerSite. Most sites finish in a few seconds each, and many run in parallel.

Why are some emails or phones empty? Many sites publish contact forms instead of raw addresses, or hide details behind scripts. The row returns whatever is publicly visible at crawl time, and an empty list simply means that contact type was not exposed on the pages visited. Raising crawlDepth and maxPagesPerSite finds more.

What is the pricing? Billing follows the actor's pricing shown on its Apify Store page. You pay per result returned, so cost scales with the number of domains you scrape.

Which proxy should I use? Residential is the default and recommended option because it works reliably across the widest range of sites. You can change it in the proxy configuration.