Company Contact Extractor: Emails, Phones & Social Links
Pricing
Pay per event + usage
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
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.comendpoint 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
- Open the Input tab.
- Paste company domains or URLs into Company domains or URLs, one per line.
acme.comis fine. - Optional: change Max pages per domain (default 5) or the Pages to prioritise keywords.
- Press Start.
- 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.
| Field | Type | Default | Description |
|---|---|---|---|
domains | array of strings | Company domains or URLs. Duplicates and www variants are merged. | |
maxPagesPerDomain | integer | 5 | Homepage plus best matching priority pages (1-50). Price per domain stays the same. |
priorityPages | array of strings | contact, about, impressum, imprint, kontakt, team, legal | Keywords for links worth following. Built-in ones also match translations. |
includePersonalEmails | boolean | false | Also return addresses of named people. Read the GDPR section first. |
includeAllPhones | boolean | false | Return every number found (max 20), not only the main company number. |
checkMx | boolean | true | DNS MX lookup for every email domain (mxFound). |
respectRobotsTxt | boolean | true | Skip pages disallowed by robots.txt. |
maxConcurrency | integer | 10 | Websites crawled in parallel. |
maxConcurrencyPerDomain | integer | 2 | Pages of one website fetched at once. |
timeoutSecs | integer | 15 | Timeout per page. One domain is capped at 4x this value (min. 60 s). |
proxyConfiguration | object | off | Optional. 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
| Field | Description |
|---|---|
domain | Company domain without www. |
companyName | From 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. |
socials | Company profile per network: linkedin, x, facebook, instagram, youtube, tiktok, github. |
address | { street, postalCode, city, region, country, formatted } from schema.org Organization/LocalBusiness. |
vatIds | Validated EU VAT formats (DE123456789, ATU12345678, NL123456789B01...), UK VAT and Swiss UID. |
registrationNumbers | Register entries as printed: HRB 12345, Company No. 01234567, KvK, KRS, SIREN, IČO, CVR and more. |
contactPageUrl | The contact page that was crawled. |
contactFormUrl | Page with a contact form (HTML form with a message field, or HubSpot/Typeform/Jotform embeds). |
personalEmailsHidden | How many personal addresses were seen but not returned. |
pagesCrawled | HTML pages read for this domain. |
error | Why 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 likeinfo [at] acme [dot] com,info(at)acme.deorkontakt (at) firma (punkt) deare decoded. Image names likelogo@2x.pngand 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.comAuthorization: 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.
| Event | Price |
|---|---|
| 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). includePersonalEmailsis 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
maxConcurrencyto 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 examplekundenserviceoransprechpartner. - 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
includePersonalEmailsandincludeAllPhonesoff 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.