Find company contact details from a domain name
How to get an email, phone number and social profile for a company from its domain alone — what is findable, what is not, and why many sites return nothing.
You have a list of company domains and you need a way to reach each one. The contact details are published on the sites — that is what a contact page is for — but visiting two thousand of them by hand is not a plan, and the tools that do it for you have a habit of returning things that look like contacts and are not.
This page covers what is genuinely findable from a domain, where the published information runs out, and how to tell a real company address from the two kinds of fake one.
What is actually on a company website
Four things, in descending order of how often they appear:
- A role address —
info@,sales@,support@. Published deliberately, intended for strangers, and safe to contact. - Social profiles — often the most reliably present item, because the links sit in the footer of every page.
- A phone number — common on smaller and regional companies, rarer on software companies.
- A named person’s address —
firstname@orfirstname.lastname@. Least common, most valuable, and the one that carries obligations.
What is frequently absent is any address at all. A large share of companies publish a contact form and nothing else, deliberately, precisely to avoid what you are doing. That is not a failure of extraction; there is nothing there to extract.
This matters more than it sounds. If a tool hands you a row for every domain you submitted and none of them are empty, it is inventing addresses — usually by guessing [email protected] — and you will not find out until you send.
The two kinds of fake address
Both are common enough that a list without them filtered is unusable.
Placeholder addresses in the page’s own copy. Marketing sites are built from templates and documentation, and the example addresses do not always get removed. This is not a fringe case: stripe.com publishes [email protected] and [email protected] on its own site, and mollie.com publishes [email protected] and [email protected]. A scraper that takes every string matching an email pattern returns those as contacts for Stripe and Mollie.
The filter has to match on the whole domain, not a fragment. acme.com is a placeholder; acmetrading.nl is a real company, and a substring match quietly deletes it.
Addresses belonging to somebody else. The agency that built the site, the PR firm handling press, an embedded support widget’s vendor. These are real addresses that a pattern match finds on the page, and they have nothing to do with the company you are researching. The test is whether the address is on the company’s own domain — including its subdomains, and treating www. as the same host.
Keep off-domain finds; do not discard them. The agency’s address is occasionally the right route, and more often it is the signal that tells you why the row looks odd.
Role addresses and personal addresses are different things
Treating them as one column is the mistake that makes most lead lists unusable, for two separate reasons.
Legally. [email protected] is a company contact point. [email protected] is personal data about an identifiable person, and under GDPR contacting it carries obligations that contacting the first one does not. A list that mixes them gives you no way to apply different rules to each, which means you either over-restrict the whole list or under-restrict the part that matters.
Practically. They perform differently. A role address reaches whoever is on duty and tolerates a cold approach. A named address reaches one person who will judge you on relevance. The same message to both is wrong for at least one of them.
So the useful output is not “contacts” but two labelled sets. Then the decision about which to use is yours and is auditable, rather than being made silently by whatever tool built the list.
One caution: the split cannot be perfect from a domain alone. [email protected] might be Sam, or it might be a small firm’s shared inbox. Anything that claims certainty here is overstating.
The gaps are information
The most useful column in a contact dataset is the one that says nothing was found, and why. A reachable site that publishes no address at all is a different situation from a site that did not respond, and both are different from a domain that was never valid.
Told apart, those three tell you something about your target list: what proportion of your market is reachable by email at all, which is a number most people running outbound have never actually measured. Collapsed into a blank cell, they tell you nothing and look like a defect in the tool.
Doing it at scale
- Start from clean domains. Strip protocols, paths and
www.. A surprising share of failures at scale are malformed inputs rather than unreachable sites. - Fetch the pages where contacts live. The homepage, and the contact, about, imprint and legal pages. German and Dutch sites carry a legally mandated imprint that is often the only place a real address appears.
- Filter placeholders before classifying, or the placeholder gets classified and looks legitimate.
- Split on-domain from off-domain, then role from personal, and keep all four sets.
- Record a reason for every empty row. Unreachable, no contacts published, or bad input.
- Do not verify by sending. Sending to an unverified list to see what bounces damages your sending domain and is the most expensive way to learn what an SMTP check would have told you.
Limitations
Nothing here finds an address that was never published. No tool can. A company using only a contact form is unreachable by this method, and any product implying otherwise is guessing at a pattern.
Contact pages behind JavaScript, images or obfuscation may not yield text. Some sites render addresses as images or assemble them in script specifically to defeat extraction. That is a deliberate signal and worth respecting.
Classification is a judgement, not a fact. The role-versus-personal split is right most of the time and wrong sometimes, particularly at small companies where a founder’s first name is the general inbox.
Published does not mean fair game. In the EU, a business email that identifies a person is personal data whether or not it sits on a public page, and the lawful basis for contacting it is yours to establish. Under GDPR you also owe that person notice and a route to object. This page describes what is technically findable; it is not legal advice, and the compliance question is not answered by the data being public.
Details go stale. People leave, companies rebrand, addresses get retired. A contact list is a snapshot, and one over six months old should be re-checked rather than trusted.
FAQ
Can I get a named person’s email from a domain alone?
Sometimes, when the company publishes it. What you cannot legitimately do is derive it — taking a name from LinkedIn and guessing first.last@domain is fabrication, and the fact that it sometimes works does not make the output a found address.
What hit rate should I expect?
It depends entirely on the segment, and anyone quoting a single number across all domains is quoting marketing. Local service businesses publish addresses at a high rate; enterprise software companies frequently publish none. Measure it on a sample of your own list before you plan around it.
Is scraping contact details from websites legal?
Reading pages that are publicly served is generally permissible; what you then do with personal data is the regulated part, and it varies by jurisdiction. In the EU and UK, GDPR applies to any address identifying a person. Take advice on your specific use rather than relying on a general page.
Why do I get an agency’s email instead of the company’s?
Because it was on the page. Small companies’ sites often carry the builder’s contact details in the footer. That is why on-domain and off-domain finds belong in separate columns rather than one merged list.
Should I use a contact form instead?
Often, yes. Where a company publishes only a form, the form is the route they have chosen to offer, and using it converts better than an address they deliberately did not publish.
This page describes the problem. The hosted tool solves it at scale — bulk input, structured output, and no charge for videos that return nothing.
Run it on Apify