Company Contact Extractor - Emails, Phones & Socials
Pricing
from $6.30 / 1,000 domain with contacts
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
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(usecursorinstead ofclaude-codefor 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
sourceUrlwhere 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 likelogo@2x.png, Sentry/Wix tracking addresses, placeholders likename@example.comand no-reply addresses are filtered out. - Generic vs personal – every email is tagged
generic(info@, sales@, support@, office@, presse@, vanzari@ …) orpersonal, plusisCompanyDomainso third-party addresses (a web agency or a regulator in the imprint) are easy to drop. UseemailFilter: "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
| Field | Type | Description | Default |
|---|---|---|---|
websites | array | Domains or URLs, e.g. stripe.com, www.hetzner.com, https://apify.com/contact | Required |
maxPagesPerDomain | integer | Pages loaded per website (1–50), most promising first | 10 |
includeEmails | boolean | Extract emails | true |
emailFilter | string | all, generic_only (info@, sales@ …) or exclude_generic | all |
includePhones | boolean | Extract phone numbers | true |
includeSocials | boolean | Extract social profiles | true |
compactOutput | boolean | Slim items (domain, company name, email and phone strings, found socials, contact page). Best for AI agents | false |
sameDomainOnly | boolean | Stay on the website's host; false also follows the company's subdomains | true |
respectRobotsTxt | boolean | Skip pages disallowed by robots.txt | true |
maxConcurrency | integer | Websites crawled in parallel (1–50) | 10 |
proxyConfiguration | object | Optional Apify Proxy for sites with bot protection | none |
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"}
| Field | Description |
|---|---|
input | The website exactly as you entered it |
domain | The company's registrable domain after redirects (e.g. ritter-sport.de → ritter-sport.com) |
websiteUrl | The home page URL after redirects |
companyName | From 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 |
socials | Company profile URL per network, or null |
contactPageUrl | The contact page (or the imprint page if there is no contact page) |
contactFormUrl | A page with a contact form (textarea + email field, or an embedded HubSpot/Typeform/Jotform/CF7 form) |
address | Postal address from schema.org Organization/LocalBusiness data, when published |
pagesCrawled | Pages 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.
Related actors
- LinkedIn Company Scraper: company profiles with size, industry, headquarters, website and more.
- LinkedIn Company Employees Scraper: people working at a company, to find the right decision maker.
- Career Site Jobs Scraper: open jobs from company career sites (Greenhouse, Lever, Ashby, Workday and more) – find companies that are hiring, then get their contacts here.