How to extract emails, phone numbers and social links from a list of company domains
Updated 2026-10-28 ยท Tool used: Contact Details Extractor - Email, Phone & Social from Website on Apify ยท Price: about $2 per 1,000 domains with a contact found; domains with no contact, unreachable or blocked hosts are free
You already have the companies (a CRM export, a trade-show list, the output of a tech stack lookup), and now you need a way to reach them: the public info@ or sales@ inbox, a phone number and the LinkedIn company page. Opening 500 websites and hunting for the contact page by hand takes days, and many contact info scrapers charge per page or per result even when nothing is found.
This guide shows how to give a list of domains and get one clean row per company: emails tagged as role/generic (info@, sales@) or personal-looking (first.last@), phones, social profiles, postal addresses and the page each value came from. It reads only the homepage and contact/about/impressum pages on the same host, respects robots.txt and needs no login or browser.
Open Contact Details Extractor on Apify โSteps
- Paste your company domains or URLs into
domains(one per line; URLs and duplicates are normalized). - Optionally raise
maxPagesPerDomain(default 8) for sites with deep contact pages, and keeprespectRobotsTxton. - Run it, then filter the dataset on
hasContactandemails.roleOrGenericand export as CSV/Excel, or schedule it to refresh contact data monthly.
Example input
{
"domains": [
"apify.com",
"example.com"
],
"maxPagesPerDomain": 8,
"respectRobotsTxt": true
}
Example output (one item, shortened)
{
"input": "apify.com",
"domain": "apify.com",
"finalUrl": "https://apify.com/",
"title": "Apify: Full-stack web scraping and data extraction platform",
"socials": {
"linkedin": [
"https://www.linkedin.com/company/apifytech"
],
"twitter": [
"https://x.com/apify"
],
"facebook": [],
"instagram": [],
"youtube": [],
"github": [
"https://github.com/apify"
],
"tiktok": []
},
"addresses": [],
"pagesScraped": [
{
"url": "https://apify.com/",
"statusCode": 200,
"title": "Apify: Full-stack web scraping and data extraction platform"
}
],
"socialsFound": 3,
"blocked": false,
"error": null,
"checkedAt": "2026-10-09T07:05:00.000Z"
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"domains": [
"apify.com",
"example.com"
],
"maxPagesPerDomain": 8,
"respectRobotsTxt": true
}
run = client.actor("tinyrex/contact-details-extractor").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/contact-details-extractor').call({
"domains": [
"apify.com",
"example.com"
],
"maxPagesPerDomain": 8,
"respectRobotsTxt": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~contact-details-extractor/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["apify.com", "example.com"], "maxPagesPerDomain": 8, "respectRobotsTxt": true}' > results.csv
Get your API token in Apify Console โ Settings โ API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/contact-details-extractor",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Contact info scraper alternative for this list and give me a table".
Pricing
Pay per result: about $2 per 1,000 domains with a contact found; domains with no contact, unreachable or blocked hosts are free. You can cap the cost of every run in the run options.
FAQ
Is this an alternative to the popular contact info scrapers?
Yes, for the common case where you already know the company websites. It does not crawl search engines or directories; it visits only the homepage and contact-looking pages of each domain you give it, which keeps it fast and cheap. You pay about $0.002 per domain where at least one contact was found, and nothing for domains without contacts or that fail.
How do I find the email address of a company from its website?
Most companies publish a role inbox (info@, hello@, sales@) on the homepage footer, contact page or impressum. The actor collects every mailto link and on-page address from those pages and flags which ones are role/generic, so you can pick the right inbox per company.
Can I get the LinkedIn company page for a list of domains?
Yes. Social links the company itself puts on its site (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, GitHub, TikTok) are returned in the socials object, one column per network in the CSV export.
Is it GDPR compliant?
Emails and phone numbers can be personal data. You decide the purpose and act as the controller; the personalLooking flag helps you keep only role/generic addresses for outreach. Check the email-marketing rules of each recipient's country before contacting anyone.
More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON
- How to turn any RSS or Atom feed into JSON or CSV (bulk, with monitoring)
- How to take bulk website screenshots from a URL list and save them to CSV or Google Drive
- How to export US federal (SAM.gov) and UK (Contracts Finder) tenders to CSV or JSON
- How to look up French companies by SIREN or SIRET and build a B2B list from Sirene
- How to look up Norwegian companies by organisation number and build lead lists from Brreg
- How to download SEC filings (10-K, 10-Q, 8-K, Form 4) by ticker and search EDGAR full text
- How to validate NPI numbers in bulk and build US healthcare provider lists from NPPES
- How to look up hundreds of UK companies on Companies House at once (profile, officers, PSC)
- How to look up Finnish companies by Y-tunnus and build B2B lead lists from the YTJ register
- How to extract all URLs from a website's sitemap (and find broken links)
- How to transcribe hundreds of audio and video files to text and subtitles with Whisper
- How to extract text from hundreds of PDFs, including scanned ones, in one run
- How to clean an email list before a campaign: bulk MX, disposable and typo check
- How to get Dutch public tenders from TenderNed into a spreadsheet, with daily alerts
- How to audit titles, meta descriptions, H1s and canonicals for hundreds of pages at once
- How to find every broken link and redirect on a website, with the pages to fix
- How to validate LEI codes and find the LEI for a list of companies in bulk
- How to run Lighthouse on hundreds of URLs and get Core Web Vitals in one table