Company Contact Extractor - Emails, Phones & Socials avatar

Company Contact Extractor - Emails, Phones & Socials

Pricing

from $6.30 / 1,000 domain with contacts

Go to Apify Store
Company Contact Extractor - Emails, Phones & Socials

Company Contact Extractor - Emails, Phones & Socials

Extract public business contact details from company websites: emails, phone numbers, LinkedIn/X/Facebook/Instagram/YouTube/TikTok/GitHub/Crunchbase profiles, contact page, address. Input: domains or URLs. Output: one item per domain. Pay only for domains with contacts.

Pricing

from $6.30 / 1,000 domain with contacts

Rating

0.0

(0)

Developer

Artificially

Artificially

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Company Contact Extractor – Emails, Phones & Social Profiles from Websites

Turn a list of company domains into public business contact details: emails, phone numbers, LinkedIn / X / Facebook / Instagram / YouTube / TikTok / GitHub / Crunchbase profiles, the contact page, the contact form and the postal address. Paste domains, get one clean item per company, and pay only for companies where something was found.

Built by Artificially | Follow us on X @artificially_io

Use with AI agents (MCP)

This actor works as a tool for Claude, ChatGPT, Cursor and other AI agents through Apify's MCP server. Ask something like "find the contact email and LinkedIn page for stripe.com, apify.com and hetzner.com" and the agent calls it for you. Set compactOutput: true (and maxPagesPerDomain: 5 for speed) so results are short and fit easily in the agent's context.

Quick setup (sign in with your Apify account when asked):

  • Claude (claude.ai or Claude Desktop): Settings → Connectors → Add custom connector, and paste https://mcp.apify.com?tools=artificially/company-contact-extractor
  • Claude Code or Cursor via the Apify CLI (latest version, apify upgrade): apify mcp install claude-code --tools artificially/company-contact-extractor (use cursor instead of claude-code for Cursor)
  • Any MCP client (Cursor, VS Code, Windsurf):
{
"mcpServers": {
"apify": { "url": "https://mcp.apify.com?tools=artificially/company-contact-extractor" }
}
}

Try asking:

  • "Find the public contact email, phone and LinkedIn page for these 50 company websites."
  • "Get the contact page and support email for stripe.com, apify.com and posthog.com."

Why this actor

  • One item per company, not per page – all contacts from the home page, contact, imprint, about and legal pages are merged and deduplicated, and every email and phone keeps the sourceUrl where it was found.
  • Smart crawl, not a blind spider – the home page first, then the pages that actually carry contact details (contact, Impressum/imprint, about, team, support, legal/privacy, careers) in 20+ languages: Kontakt, Impressum, contacto, contatti, mentions légales, despre noi, over ons, and more.
  • Clean emails – mailto links, page text, schema.org data, obfuscated emails (info [at] example [dot] com, @) and Cloudflare-protected emails. Image names like logo@2x.png, Sentry/Wix tracking addresses, placeholders like name@example.com and no-reply addresses are filtered out.
  • Generic vs personal – every email is tagged generic (info@, sales@, support@, office@, presse@, vanzari@ …) or personal, plus isCompanyDomain so third-party addresses (a web agency or a regulator in the imprint) are easy to drop. Use emailFilter: "generic_only" to keep only role addresses.
  • Valid, normalized phones – tel: links, schema.org and labeled numbers in text ("Tel.:", "Phone:", "Telefon"), validated with libphonenumber and returned in international and E.164 format. The country for local numbers comes from the domain ending, the address or the page language. Fax numbers are skipped.
  • The company's own social profiles – share buttons and unrelated profiles are ignored; profiles in the header/footer, in schema.org sameAs, or matching the domain name win.
  • Fast and cheap – plain HTTP requests (no browser), about 10 requests and 3–5 seconds per domain, 10 domains in parallel with polite per-site limits.
  • You only pay for results – a domain is saved and charged only if at least one email, phone or social profile was found. Unreachable, blocked, parked and empty domains are listed for free in FAILED_DOMAINS.

Use cases

  • Lead generation and enrichment – you have a list of company domains from a CRM, a trade-show list or a directory; get their generic sales/info address, phone and LinkedIn page in one run.
  • "Hiring signal" outreach – find companies that are hiring with the Career Site Jobs Scraper, then get their contact channels here.
  • Account research – pair with the LinkedIn Company Scraper for firmographics and with this actor for the official contact channels.
  • Data hygiene – verify and refresh the phone numbers, emails and social links stored in your CRM.
  • Local and European businesses – German, Austrian and Swiss sites publish full contact details in the Impressum; the actor finds and reads it.

Input

FieldTypeDescriptionDefault
websitesarrayDomains or URLs, e.g. stripe.com, www.hetzner.com, https://apify.com/contactRequired
maxPagesPerDomainintegerPages loaded per website (1–50), most promising first10
includeEmailsbooleanExtract emailstrue
emailFilterstringall, generic_only (info@, sales@ …) or exclude_genericall
includePhonesbooleanExtract phone numberstrue
includeSocialsbooleanExtract social profilestrue
compactOutputbooleanSlim items (domain, company name, email and phone strings, found socials, contact page). Best for AI agentsfalse
sameDomainOnlybooleanStay on the website's host; false also follows the company's subdomainstrue
respectRobotsTxtbooleanSkip pages disallowed by robots.txttrue
maxConcurrencyintegerWebsites crawled in parallel (1–50)10
proxyConfigurationobjectOptional Apify Proxy for sites with bot protectionnone

Example input

{
"websites": ["stripe.com", "https://www.manufactum.de", "fancourier.ro", "plausible.io"],
"maxPagesPerDomain": 10,
"emailFilter": "all",
"compactOutput": false
}

Output

One item per company website:

{
"input": "manufactum.de",
"domain": "manufactum.de",
"websiteUrl": "https://www.manufactum.de/",
"companyName": "manufactum",
"emails": [
{ "email": "info@manufactum.de", "type": "generic", "isCompanyDomain": true, "sourceUrl": "https://www.manufactum.de/" },
{ "email": "presse@manufactum.de", "type": "generic", "isCompanyDomain": true, "sourceUrl": "https://www.manufactum.de/kontakt-c199446/" }
],
"phones": [
{ "number": "+49 2309 939050", "e164": "+492309939050", "country": "DE", "sourceUrl": "https://www.manufactum.de/" }
],
"socials": {
"linkedin": null,
"twitter": null,
"facebook": "https://www.facebook.com/manufactum",
"instagram": "https://www.instagram.com/manufactum",
"youtube": null,
"tiktok": null,
"github": null,
"crunchbase": null
},
"contactPageUrl": "https://www.manufactum.de/kontakt-c199446/",
"contactFormUrl": null,
"address": {
"streetAddress": "Hiberniastraße 5",
"locality": "Waltrop",
"region": null,
"postalCode": "45731",
"country": "DE",
"full": "Hiberniastraße 5, 45731 Waltrop, DE"
},
"pagesCrawled": 6,
"scrapedAt": "2026-09-23T10:12:44.120Z"
}
FieldDescription
inputThe website exactly as you entered it
domainThe company's registrable domain after redirects (e.g. ritter-sport.de → ritter-sport.com)
websiteUrlThe home page URL after redirects
companyNameFrom og:site_name, schema.org Organization or the page title
emails{ email, type, isCompanyDomain, sourceUrl }; type is generic or personal. Company-domain emails and emails from contact/imprint pages come first
phones{ number, e164, country, sourceUrl }; number is the international format
socialsCompany profile URL per network, or null
contactPageUrlThe contact page (or the imprint page if there is no contact page)
contactFormUrlA page with a contact form (textarea + email field, or an embedded HubSpot/Typeform/Jotform/CF7 form)
addressPostal address from schema.org Organization/LocalBusiness data, when published
pagesCrawledPages loaded for this domain

With compactOutput: true an item looks like this:

{
"domain": "apify.com",
"companyName": "Apify",
"emails": ["support@apify.com", "hello@apify.com"],
"phones": [],
"socials": { "linkedin": "https://www.linkedin.com/company/apify", "twitter": "https://x.com/apify", "github": "https://github.com/apify" },
"contactPageUrl": "https://apify.com/contact"
}

The key-value store also contains:

  • SUMMARY – hit rates (domains with email/phone/social), average pages, requests, KB and seconds per domain, and per-domain stats.
  • FAILED_DOMAINS – domains that were not saved, with a reason: unreachable (DNS, connection or HTTP errors), blocked (bot protection; try a proxy), blocked_by_robots, parked_domain, not_html, invalid_input, no_contacts_found. These are never charged.

Pricing

This actor uses pay-per-event pricing: a tiny fee per run plus a fee per company website saved to the dataset. You only pay for domains where contacts were found – unreachable, blocked, parked and empty domains cost nothing, and there is no per-page fee no matter how many pages are crawled. Set a maximum cost per run in Apify Console and the actor stops cleanly when it is reached. See the Pricing tab for current prices.

FAQ

Which pages are crawled? The home page, then internal links ranked by how likely they are to contain contact details: contact → imprint/Impressum → about → team → support/press → legal/privacy → careers. If nothing is found, common paths such as /contact, /kontakt and /impressum are tried. Blog posts, product pages, files and login pages are skipped. External websites are never crawled.

Why is a website missing from the results? Check FAILED_DOMAINS. The most common reasons are a dead domain (unreachable), bot protection (blocked – try proxyConfiguration with Apify Proxy), a robots.txt that disallows crawling (blocked_by_robots), or a website that simply publishes no email, phone or social link (no_contacts_found).

Does it work with JavaScript-heavy sites? The actor reads the HTML the server returns, without a browser, which makes it fast and cheap. Most company sites (WordPress, Shopify, Webflow, Next.js, Nuxt and other server-rendered sites) work well. Single-page apps that render everything in the browser may return fewer or no results; FAILED_DOMAINS then says the home page is almost empty without JavaScript.

Are the emails verified? Emails are syntax-checked and filtered for junk and placeholders, but not verified by SMTP. They are exactly what the company publishes on its own website.

Why do some emails have isCompanyDomain: false? Imprint and privacy pages often list third parties such as the web agency, the data-protection authority or a consumer arbitration board. They are kept but flagged and sorted last, so you can filter them out.

Is this legal? What about GDPR? The actor only collects business contact information that the company itself publishes on its own public website. It does not log in, bypass protection, or visit social networks or third-party sites. Pages disallowed by robots.txt are skipped by default. You are responsible for how you use the data: personal data (for example a named employee's email) is regulated by GDPR in the EU/UK and by laws such as CAN-SPAM and CCPA in the US. Make sure you have a lawful basis, honor opt-outs, and prefer emailFilter: "generic_only" for cold outreach.

Support

Found a website where contacts are missed or wrong? Open an issue on the actor's Issues tab – we usually respond within a day.