Website Contact Extractor: Emails, Phones & Social Links
Pricing
$2.00 / 1,000 website with contacts
Website Contact Extractor: Emails, Phones & Social Links
Extract emails, phone numbers and social media links from company websites. Paste domains, get one row per site with the page each email was found on. Pay only for websites where contacts are found.
Pricing
$2.00 / 1,000 website with contacts
Rating
0.0
(0)
Developer
API Samurai
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Features
Share
Paste a list of company websites and get one clean row per site: email addresses (each with the page it was found on), phone numbers in international format, social media profiles, the contact page link and the company name. The Actor reads the home page and the pages where companies put their contact details (contact, imprint or Impressum, legal notice, about and team pages), so you get the contacts without crawling the whole site.
You pay only for websites where at least one email, phone number or social link is found. Dead, blocked and empty websites are free.
What you can use it for
- Lead generation: turn a list of domains from a CRM export, a trade fair list or a directory into emails and phone numbers.
- CRM enrichment: add missing emails, phones and LinkedIn company pages to existing accounts.
- Social media research: find the official LinkedIn, Facebook, Instagram, X, YouTube, TikTok, Pinterest, WhatsApp and Telegram profiles of brands.
- List cleaning: see which domains are dead, parked or for sale, and which email domains cannot receive mail.
- Agencies and outreach: get the contact page link to send a message through the site's form.
How to use it
- Paste websites into Websites, one per line. Domains (
acme.com), links (https://acme.com/contact) and lists copied from a sheet all work. - Keep Max pages per website at 5 for most sites. Raise it for large sites with many regional contact pages.
- Click Start. A list of 100 websites usually takes about one minute.
- Download the results as Excel, CSV or JSON, or open the SUMMARY record for counts per status.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
websites | list | Domains or links, one per line. Each domain is checked once. | |
maxPagesPerSite | number | 5 | Pages read per website: home page, then contact, imprint, legal, about and team pages on the same site. |
includePhones | yes/no | yes | Phone numbers from phone links, structured data and text next to words like Phone or Tel. |
includeSocials | yes/no | yes | Links to the company's profiles on nine social networks. |
checkEmailDomains | yes/no | no | DNS lookup that marks emails whose domain has no mail server. |
maxTotalItems | number | Optional cap on websites checked in one run. |
Example input:
{"websites": ["apify.com", "https://www.buffer.com/contact", "heise.de"],"maxPagesPerSite": 5,"checkEmailDomains": true}
Output
One row per website. Real example from a run (social networks without links shortened):
{"input": "apify.com","domain": "apify.com","url": "https://apify.com/","companyName": "Apify","emails": [{ "email": "support@apify.com", "foundOn": "https://apify.com/", "domainCanReceiveMail": null },{ "email": "hello@apify.com", "foundOn": "https://apify.com/contact", "domainCanReceiveMail": null }],"phones": [],"socials": {"linkedin": ["https://www.linkedin.com/company/apify"],"tiktok": ["https://www.tiktok.com/@apifytech", "https://www.tiktok.com/@apifyoffice"],"facebook": [], "instagram": [], "x": [], "youtube": [], "pinterest": [], "whatsapp": [], "telegram": []},"contactPageUrl": "https://apify.com/contact","pagesVisited": ["https://apify.com/", "https://apify.com/contact", "https://apify.com/about", "https://apify.com/contact-sales"],"status": "ok","statusDetail": null,"scrapedAt": "2026-11-10T13:24:42.625Z"}
Phones look like { "phone": "+18007787879", "country": "US", "foundOn": "https://buffer.com/legal" }.
The status field tells you what happened on each website:
| Status | Meaning | Charged |
|---|---|---|
ok | At least one email, phone number or social link found | Yes |
no contacts found | The site works but shows no contacts, or the domain is parked or for sale | No |
unreachable | The domain does not exist, times out or returns an error | No |
blocked | The site refuses automated visitors | No |
statusDetail adds the reason, for example domain not found, HTTP 403 or domain parked or for sale.
Pricing
$2.00 per 1,000 websites with contacts found ($0.002 per website). No start fee. Websites with no contacts, unreachable or blocked websites and duplicates are free. Several pages per website are included in the price.
Integrations
Run it from the Apify API with the Actor ID apisamurai~website-contact-extractor:
curl -X POST "https://api.apify.com/v2/acts/apisamurai~website-contact-extractor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"websites": ["apify.com", "heise.de"]}'
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("apisamurai/website-contact-extractor").call(run_input={"websites": ["apify.com"]})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["domain"], [e["email"] for e in row["emails"]])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('apisamurai/website-contact-extractor').call({ websites: ['apify.com'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();
It also works with Zapier, Make and n8n (Apify apps: run the Actor, then read the dataset), with Google Sheets and webhooks, and with AI agents through the Apify MCP server (https://mcp.apify.com), so an assistant can look up the contacts of a company website for you.
FAQ
Which input formats work?
Domains (acme.com), full links (https://www.acme.com/de/kontakt), links with tracking parameters, lists pasted from a sheet or a chat (commas, semicolons, bullets, quotes, markdown links) and { "url": "..." } objects. An email such as sales@acme.com is read as the website acme.com. Field names from other contact scrapers (startUrls, urls, domains, maxRequestsPerStartUrl) are read too. Social network pages and free email addresses (Gmail, Outlook) are skipped with a note in the log.
Which pages does it read? The page you give (or the home page), then pages found through the site's own links: contact first, then imprint and legal notice, about, team, locations and support. It stays on the same website and never follows links to other domains.
How are phone numbers formatted?
In international E.164 format (+4930123456) when the country is clear: from the number itself, the site's country domain (.de, .co.uk) or its page language (en-GB). Otherwise the number is given as written, digits only, with country: null. Numbers in the page text are only taken next to a word such as Phone, Tel or Telefon, so order numbers and dates are left out. Fax numbers are skipped.
Does it verify that an email address exists?
No. With Check email domains on, each email gets domainCanReceiveMail: false when its domain does not exist or has no mail server, true when it has one, null when the lookup failed. It does not contact mail servers or test single mailboxes, so it never sends anything.
Does it find personal emails of employees or LinkedIn profiles of staff? No. It returns what the company publishes on its own website. Personal social links found on inner pages (team members, commenters) are left out unless they are the only link to that network on the site. We do not offer lead enrichment from other databases.
Why is a website blocked or without contacts? Some sites refuse automated visitors, and some show contacts only through scripts or images. A blocked page is tried once more through a residential IP. Sites that load their content only with scripts may show no contacts, because the Actor reads the HTML and does not run a browser. You are not charged for these websites.
What junk is filtered out?
Image file names that look like emails (logo@2x.png), placeholder addresses (name@example.com, your@email.com), error-tracking and site-builder addresses, tracking IDs, share buttons, and the default social links that site builders leave in footers.
Fair billing
- One charge per website, only when at least one email, phone number or social link is found.
- Unreachable, blocked, parked and empty websites are free and still get a row, so you can clean your list.
- Duplicate domains in the input are checked and charged once.
- No start fee and no charge per page.
- The run stops cleanly at your spending limit; rows saved so far stay in the dataset.