Skip to content

Contact Details Scraper

Try for free

Crawl public websites and extract emails, phone numbers, and social profile links into a table.

📇 Contact Details Scraper

Turn any list of websites into a clean contact list. Crawl public sites and collect the emails, phone numbers, and social profile links they already publish, in one tidy row per site or per page. No login, plain HTTP by default, and about $1.50 per 1,000 pages.

Paste a few start URLs, set how deep to crawl, and download the result as JSON, CSV, or Excel. A linktr.ee link-in-bio page is expanded to the sites it lists, so one link can lead you to a whole set of contacts.

✨ Why use Contact Details Scraper?

  • ⚡ Fast — plain HTTP crawling with TLS fingerprinting, no browser needed for ordinary HTML.
  • 💸 Cheap — one flat price per page parsed, failed pages are not charged.
  • 🧩 Merged or per page — fold a whole site into one contact row, or get one row per page.
  • 🔗 Many networks — LinkedIn, X/Twitter, Instagram, Facebook, YouTube, TikTok, Pinterest, Discord, Snapchat, Threads, Telegram, Reddit, and WhatsApp links.
  • 🌐 Link-in-bio aware — linktr.ee pages are expanded to the sites they list.
  • 🛡️ Controlled crawl — stay on the registered domain, cap pages per URL, cap depth, cap the whole run.

🎯 Use cases

  • 📬 Lead generation — build outreach lists from company websites you already have.
  • 🔎 Contact audits — check which emails and social profiles your own sites publish.
  • 🧭 Market research — collect the social presence of a set of competitors or partners.
  • 🗂️ CRM enrichment — add a site's public emails, phones, and profile links to existing records.
  • 🧑‍🎨 Creator outreach — expand a link-in-bio page into the sites and handles behind it.

🚀 How to use

  1. Open the actor and add one or more Start URLs.
  2. Set Maximum pages per start URL and Maximum link depth.
  3. Leave Merge contacts on for one row per site, or turn it off for one row per page.
  4. Click Start. The default datacenter proxy works for most sites.
  5. Export the dataset as JSON, CSV, or Excel, or read it through the API.

📥 Input

FieldTypeDescription
startUrlsarrayPages to start from. Objects like { "url": "..." } or plain URL strings.
maxRequestsPerStartUrlintegerPages to open per start URL, including the start page. Default 10.
maxDepthintegerHow many links away to follow. 0 reads only the start pages. Default 2.
maxRequestsintegerHard cap on pages across the whole run. Default 100.
sameDomainbooleanFollow only links on the same registered domain. Default on.
mergeContactsbooleanOne merged row per start URL instead of one row per page. Default on.
considerChildFramesbooleanAlso read same-domain iframes. Default on.
useBrowserbooleanRender pages in a browser for JavaScript-added contacts. Default off.
waitUntilstringBrowser read moment: commit, domcontentloaded, load, networkidle.
proxyConfigurationobjectProxy settings. Datacenter is the default.
{
  "startUrls": [{ "url": "https://webscraper.io/" }],
  "maxRequestsPerStartUrl": 10,
  "maxDepth": 2,
  "maxRequests": 100,
  "sameDomain": true,
  "mergeContacts": true,
  "considerChildFrames": true,
  "useBrowser": false,
  "proxyConfiguration": {
    "useScrapelyProxy": true,
    "scrapelyProxyGroups": ["DATACENTER"]
  }
}

📤 Output

FieldDescription
originalStartUrlThe start URL this row belongs to.
domainRegistered domain of the site.
url, depth, referrerUrlPage URL, link depth, and the page that linked to it (per-page rows).
scrapedUrlsPages folded into the row (merged rows).
emailsEmail addresses found.
phonestel: links and numbers written with a + or separators.
phonesUncertainDigit sequences that look like numbers but are not confirmed, such as registration numbers.
linkedIns, twitters, instagrams, facebooks, youtubes, tiktoks, pinterests, discords, snapchats, threads, telegrams, reddits, whatsappsSocial profile links by network.

A per-page row from a real run:

{
  "originalStartUrl": "https://webscraper.io/contact",
  "url": "https://webscraper.io/contact",
  "domain": "webscraper.io",
  "depth": 0,
  "referrerUrl": null,
  "emails": ["info@webscraper.io"],
  "phones": [],
  "phonesUncertain": [],
  "linkedIns": ["https://lv.linkedin.com/company/web-scraper"],
  "twitters": [],
  "instagrams": [],
  "facebooks": ["https://www.facebook.com/webscraperio"],
  "youtubes": ["https://youtube.com/@WebScraper"],
  "tiktoks": [],
  "pinterests": [],
  "discords": [],
  "snapchats": [],
  "threads": [],
  "telegrams": [],
  "reddits": [],
  "whatsapps": []
}

With Merge contacts on, the row carries scrapedUrls instead of url and referrerUrl.

💰 Pricing

You pay $0.0015 per page parsed, which is $1.50 per 1,000 pages. Platform usage (compute and proxy) is billed in addition to that, at the usual platform rates. Datacenter proxy traffic is $1 per GB, and browser pages use browser credits, so leave Use a browser off unless a page needs JavaScript.

Worked example: an 8-page crawl on 4 GB of memory cost $0.012 in page fees plus about $0.0047 in compute and proxy, roughly $0.0167 in total. Failed pages are not charged. If you set a maximum charge, pages already parsed are kept. With Merge contacts on, a site summary that would go over the maximum charge keeps only the first pages the remaining budget pays for, is charged for exactly those pages, and is marked truncatedAtChargeLimit: true; the run then stops.

❓ FAQ

Is it legal to scrape contact details?

The actor reads public web pages. Results can contain personal data, so you need a lawful basis to collect and use it, and you should follow the rules that apply to your outreach.

Do I need a login or my own proxy?

No login is needed. Datacenter proxies are used by default. Switch to residential only if a site refuses datacenter addresses, or supply your own proxy URLs.

Which links are followed?

Links on the same registered domain, up to the depth and page caps. Social profile hosts are saved on the row and not crawled. linktr.ee outbound sites are crawled even with Stay within domain on.

Why are some numbers under phonesUncertain?

Bare digit sequences are reported separately from numbers clearly formatted as phones. Review them before treating them as contacts.

What if a field is empty?

Empty lists mean nothing of that kind was found on the crawled pages. Many sites publish no phone numbers or no social links.

Can I schedule it or call it from the API?

Yes. Schedule runs, call the actor through the API, and read the dataset in JSON, CSV, or Excel.

If you are moving over a similar contact scraper input from another platform, the field names match; the proxy object is proxyConfiguration.

⚠️ Limits

  • 📄 The default run reads 10 pages per start URL, depth 2, and at most 100 pages in total.
  • 🌍 One datacenter proxy session is used for the run.
  • ⏱️ Big crawls take time: about 1,000 pages in 7 minutes. Rows are saved while the crawl runs, so a timeout or abort keeps the pages already done.
  • 🚦 A site that answers HTTP 429 after retries is skipped; the other start URLs continue.
  • 📦 Files that are not web pages (PDFs, images, archives) are skipped, and pages are read up to 5 MB.
  • 🧱 Browser mode connects to the platform browser; on a test run it timed out connecting and the run continued over plain HTTP. Do not rely on it for heavily protected sites.
  • 🚫 Lead enrichment, email verification, and social follower or job-title enrichment are not implemented.
  • ⚖️ Duplicate URL visits are collapsed.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.