Company Contact Extractor: Emails, Phones & Social Links avatar

Company Contact Extractor: Emails, Phones & Social Links

Pricing

Pay per event + usage

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

Company Contact Extractor: Emails, Phones & Social Links

Enrich company domains with contact data: role emails (info@, sales@), main phone in E.164, LinkedIn, X, Facebook, Instagram, YouTube, TikTok and GitHub links, address, VAT IDs and contact page. GDPR-aware by default. One row per domain, batch or real-time API for AI agents.

Pricing

Pay per event + usage

Rating

0.0

(0)

Developer

Rod Services

Rod Services

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

What does Company Contact Extractor do?

Company Contact Extractor turns a list of company domains into contact data: generic business emails (info@, sales@, office@, support@), the main phone number in E.164 format, the company's LinkedIn, X (Twitter), Facebook, Instagram, YouTube, TikTok and GitHub links, postal address, EU VAT IDs, company register numbers, the contact page and the contact form URL. You get one clean row per company, ready for your CRM.

It visits the homepage and the few pages that matter (contact, impressum, imprint, about, legal) in many European languages, with plain HTTP requests and no browser. That makes it fast and cheap: about $3 per 1,000 domains, no matter how many pages it reads. It is GDPR-aware by default: personal addresses such as jane.doe@ are left out unless you switch them on.

Run it on the Apify platform with API access, scheduling, integrations (Make, Zapier, n8n, HubSpot, Google Sheets, webhooks) and monitoring, or call it one domain at a time as a real-time API from your app or AI agent.

Try it now: press Start with the prefilled example (apify.com, hetzner.com, pipedrive.com). It finishes in under 30 seconds.

Why use Company Contact Extractor?

  • B2B lead enrichment. You have a list of company websites from a trade fair, a directory, Google Maps or your CRM. Add emails, phone, LinkedIn page, address and VAT ID in one pass.
  • Sales prospecting. Build account lists with the company's own published contact channels, not guessed addresses.
  • CRM enrichment and data hygiene. Fill missing phone numbers, fix phone formats (E.164 works everywhere), attach LinkedIn company pages, verify that email domains still receive mail (MX check).
  • KYC and supplier onboarding. Pull the legal name, register number (HRB, Company No., KvK, KRS...) and VAT ID from the impressum or legal notice.
  • AI agents and LLM tools. A single GET /?domain=acme.com endpoint returns predictable JSON in a few seconds. Ideal as a tool for agents that research companies.
  • Market research. Measure which companies publish a phone, a contact form or a TikTok channel.

How to extract company contact details from a website

  1. Open the Input tab.
  2. Paste company domains or URLs into Company domains or URLs, one per line. acme.com is fine.
  3. Optional: change Max pages per domain (default 5) or the Pages to prioritise keywords.
  4. Press Start.
  5. Open the Output tab. Pick the Overview, Emails, Social profiles or Company details view. Download as JSON, CSV, Excel or HTML, or fetch by API.

Input

All fields are on the Input tab. Only domains is required.

FieldTypeDefaultDescription
domainsarray of stringsCompany domains or URLs. Duplicates and www variants are merged.
maxPagesPerDomaininteger5Homepage plus best matching priority pages (1-50). Price per domain stays the same.
priorityPagesarray of stringscontact, about, impressum, imprint, kontakt, team, legalKeywords for links worth following. Built-in ones also match translations.
includePersonalEmailsbooleanfalseAlso return addresses of named people. Read the GDPR section first.
includeAllPhonesbooleanfalseReturn every number found (max 20), not only the main company number.
checkMxbooleantrueDNS MX lookup for every email domain (mxFound).
respectRobotsTxtbooleantrueSkip pages disallowed by robots.txt.
maxConcurrencyinteger10Websites crawled in parallel.
maxConcurrencyPerDomaininteger2Pages of one website fetched at once.
timeoutSecsinteger15Timeout per page. One domain is capped at 4x this value (min. 60 s).
proxyConfigurationobjectoffOptional. Apify datacenter proxy or your own proxy URLs. No residential.
{
"domains": ["apify.com", "https://www.hetzner.com", "pipedrive.com"],
"maxPagesPerDomain": 5,
"includePersonalEmails": false
}

Output

One item per domain. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The Emails view gives one row per address, handy for CSV import into a CRM.

{
"domain": "hetzner.com",
"inputUrl": "hetzner.com",
"url": "https://www.hetzner.com/",
"companyName": "Hetzner Online GmbH",
"emails": [
{
"email": "info@hetzner.com",
"type": "role",
"sourceUrl": "https://www.hetzner.com/unternehmen/ueber-uns/",
"mxFound": true
}
],
"phones": [
{
"e164": "+4998315050",
"raw": "+49 (0)9831 505-0",
"sourceUrl": "https://www.hetzner.com/unternehmen/ueber-uns/"
}
],
"socials": {
"linkedin": "https://www.linkedin.com/company/hetzner-online",
"x": "https://x.com/hetzner_online",
"facebook": "https://www.facebook.com/hetzner.de",
"instagram": "https://www.instagram.com/hetzner.online",
"youtube": "https://www.youtube.com/user/HetznerOnline",
"tiktok": null,
"github": null
},
"address": null,
"vatIds": ["DE812871812"],
"registrationNumbers": ["HRB 6089"],
"contactPageUrl": "https://www.hetzner.com/support/",
"contactFormUrl": null,
"personalEmailsHidden": 3,
"pagesCrawled": 5,
"httpStatus": 200,
"error": null,
"scrapedAt": "2026-09-27T12:09:22.452Z"
}

Data fields

FieldDescription
domainCompany domain without www.
companyNameFrom schema.org Organization, the copyright line, og:site_name or the page title.
emails{ email, type: role or personal, sourceUrl, mxFound }. Company domains first, third parties removed.
phones{ e164, raw, sourceUrl }. Main company number by default. Fax numbers are never returned.
socialsCompany profile per network: linkedin, x, facebook, instagram, youtube, tiktok, github.
address{ street, postalCode, city, region, country, formatted } from schema.org Organization/LocalBusiness.
vatIdsValidated EU VAT formats (DE123456789, ATU12345678, NL123456789B01...), UK VAT and Swiss UID.
registrationNumbersRegister entries as printed: HRB 12345, Company No. 01234567, KvK, KRS, SIREN, IČO, CVR and more.
contactPageUrlThe contact page that was crawled.
contactFormUrlPage with a contact form (HTML form with a message field, or HubSpot/Typeform/Jotform embeds).
personalEmailsHiddenHow many personal addresses were seen but not returned.
pagesCrawledHTML pages read for this domain.
errorWhy a domain failed (DNS, timeout, bot protection, robots.txt). Failed domains are free.

How the extraction works

  • Emails come from mailto: links, visible text, schema.org and Cloudflare-protected addresses. Obfuscated forms like info [at] acme [dot] com, info(at)acme.de or kontakt (at) firma (punkt) de are decoded. Image names like logo@2x.png and tracker IDs are ignored.
  • Role vs personal: the local part is compared with a multilingual list of shared mailboxes (info, sales, office, support, kontakt, vertrieb, datenschutz, pardavimai, myynti...).
  • Phones are normalised with libphonenumber to E.164. The country is guessed from the domain TLD, the schema.org address or the page language. Numbers in national format count only next to a "phone" keyword, so order numbers and dates are not mistaken for phones.
  • Social links are only collected from links on the company website. Share buttons, single posts and personal LinkedIn profiles (/in/) are ignored. When several profiles exist, the one in the header/footer that matches the brand wins.

Use it as an API for AI agents (Standby mode)

The Actor also runs as an always-ready HTTP endpoint. Each request enriches one domain and returns the JSON row:

GET https://rod-analytics--company-contact-extractor.apify.actor/?domain=acme.com
Authorization: Bearer <APIFY_TOKEN>

Optional query parameters: maxPages, includePersonalEmails, includeAllPhones, respectRobotsTxt, checkMx. Calls are billed per successful domain, like batch runs. Add it to your agent as a tool through the Apify MCP server or any HTTP tool.

How much does it cost to extract company contacts?

The Actor uses pay per event pricing: you pay for results, not for compute time.

EventPrice
Actor start$0.001 per run
Domain processed$0.003 ($3.00 per 1,000)
  • 1,000 domains cost about $3.00, whether the Actor reads 1 page or 5 pages per site.
  • Failed domains are free: DNS errors, timeouts, bot walls and robots.txt blocks are listed but not charged.
  • Set Maximum cost per run in the run options to cap spending. The Actor stops when the limit is reached.
  • With the Apify free plan's monthly credit you can enrich well over a thousand companies.

GDPR, ePrivacy and responsible use

This Actor is built for B2B use and follows privacy by design:

  • Default mode returns only generic role mailboxes (info@, sales@, contact@, hello@, office@, support@ and similar) and the company's main phone number. Addresses and phone numbers of named employees are not returned; only their count is (personalEmailsHidden).
  • includePersonalEmails is off by default. If you switch it on, the output can contain personal data under the GDPR (for example jane.doe@company.com). You are the data controller for that data. You need a lawful basis (for example legitimate interest for B2B outreach, documented in a balancing test), must inform the people concerned (Art. 14 GDPR), honour objections and deletion requests, and follow ePrivacy / national marketing rules (in many EU countries cold emails to individuals need prior consent). If you cannot meet these duties, keep the option off.
  • No guessing. The Actor never generates, permutes or guesses email addresses (no firstname.lastname@ patterns). It only reports what the company itself publishes on its website.
  • No social network scraping. LinkedIn, Facebook, X, Instagram, TikTok, YouTube and GitHub are never visited. The Actor only reads links that appear on the company's own site.
  • Polite crawling. robots.txt is respected by default, at most 2 parallel requests per site, a few pages per domain.

This is not legal advice. Check your use case with your data protection officer.

Tips and advanced options

  • Speed: raise maxConcurrency to 20-30 for big lists. The job is network bound; 1 GB of memory is plenty.
  • Depth: 5 pages find the impressum and contact page on most sites. Raise it for sites with many languages.
  • Different languages: add your own keywords to priorityPages, for example kundenservice or ansprechpartner.
  • Blocked sites: some big-brand sites use bot protection and answer 403 to datacenter IPs (about 10% in our tests of large corporate sites). Try Apify datacenter proxy or your own proxy URLs for those domains.
  • Personal data minimisation: keep includePersonalEmails and includeAllPhones off unless you really need them.

FAQ, disclaimers and support

Does it work on JavaScript-only websites? It reads the server HTML without a browser. Sites that render their menu only with JavaScript may return fewer pages. Contacts in the footer or in schema.org data are usually still found.

Why is an email I can see on the site missing? Addresses on other companies' domains (agencies, regulators, partners) are removed on purpose. Personal addresses need includePersonalEmails.

Which proxies can I use? No proxy (the default), Apify datacenter proxy, or your own proxy URLs. Residential and SERP proxies are not supported. A run that asks for them stops at the start with a clear message and does no work.

Is scraping company websites legal? Reading publicly available business contact information is generally allowed, but you are responsible for how you store and use the data. Respect the websites' terms, robots.txt and privacy laws.

Found a bug or need a custom field? Open an issue on the Issues tab. Custom enrichment pipelines are available on request.