Website Contact Extractor: Emails, Phones & Social Links avatar

Website Contact Extractor: Emails, Phones & Social Links

Pricing

$3.00 / 1,000 website processeds

Go to Apify Store
Website Contact Extractor: Emails, Phones & Social Links

Website Contact Extractor: Emails, Phones & Social Links

Find emails, phone numbers and social media links on company websites. List of domains in, one row per site out. Fast HTTP crawling, reads Contact/About/Team pages, respects robots.txt. $3 per 1,000 websites.

Pricing

$3.00 / 1,000 website processeds

Rating

0.0

(0)

Developer

ensorcelling _melilot

ensorcelling _melilot

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Give it a list of company websites. Get back one row per site with the emails, phone numbers and social media profile links found on it. No browser, no proxies to set up, no per-page math: you pay per website.

It reads the home page and then the pages most likely to hold contact details (Contact, About, Team, Impressum/Imprint, Support), so a typical site costs one fixed price however many pages it reads.

What you get for each website

FieldExample
domainacme.com
statusok, blocked-by-robots, unreachable, http-error, invalid-url
emails["hello@acme.com", "sales@acme.com"] (addresses on the company's own domain come first)
phones["+442083661177"] (E.164)
phonesFormatted["+44 20 8366 1177"]
linkedin, facebook, twitter, instagram, youtube, tiktok, github, pinterestProfile links that appear on the site
pagesCrawled, pagesHow many pages were read, and which
titleThe home page title
errorWhy a site gave nothing, in plain words

What it finds, and how

  • Emails from mailto: links, plain text, Cloudflare-protected emails, and simple obfuscations like name [at] domain [dot] com. Image file names, tracking IDs and placeholder addresses (you@example.com) are dropped.
  • Phone numbers from tel: links and page text. Every number is checked against real numbering plans, so order numbers and dates don't slip in. Set a default country if the site writes local numbers without +.
  • Social links only if they are linked from the site. Share buttons and tweet intents are ignored. The social networks themselves are never visited.

Input

  • Websites: one per line. acme.com, www.acme.com/about and https://acme.com all work. Duplicate domains are checked once.
  • Max pages per website (default 5): the home page plus the best contact-looking pages.
  • Find emails / phones / social links: switch off what you don't need.
  • Default country: two-letter code for local phone numbers.
  • Respect robots.txt (default on).
  • Websites at once (default 10).

Pricing

$0.003 per website ($3 per 1,000). Websites that are not readable are not charged: unreachable, HTTP errors, invalid addresses, and sites whose robots.txt says no. A readable site that simply has no contact details on it is charged, since it was crawled. No start fee, no per-page fee.

Good manners and limits

  • Public pages only. No logins, no forms, no hidden APIs. The Actor reads the same pages a visitor sees.
  • robots.txt is respected by default.
  • No JavaScript rendering. Sites that build their pages only in the browser, or that sit behind bot protection (Cloudflare challenges, CAPTCHAs), will often show no contact details or an http-error. The Actor tells you; it doesn't guess. If you need those, use a browser-based scraper.
  • No proxy rotation. Requests come from Apify datacenter IPs, so some large sites refuse them.
  • Emails are what the site publishes. They aren't verified; use an email verifier before sending bulk mail. You are responsible for using the data in line with the privacy and anti-spam laws that apply to you (GDPR, CAN-SPAM and similar).

Use it from code

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('YOUR_USERNAME/contact-extractor').call({
websites: ['apify.com', 'basecamp.com'],
maxPagesPerSite: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();