Use case
Find contact details for a list of company websites
Turn a batch of company website URLs into contactable details — email, phone, social links and address, de-obfuscated, classified, and franchise-flagged, one row per site.
Say a colleague drops a spreadsheet on you: 300 companies you’re supposed to reach out to before the end of the week, one column of website URLs, and nothing else. Every one of those companies almost certainly publishes a way to reach it on its own site — an email, a phone number, a row of social icons, a street address — on a contact page, an about page, a team page. But a URL isn’t something you can send to or call, and 300 sites is not something you can open by hand between now and Friday.
The manual way, and what it costs
The free path is real: open a site, click into its menu looking for “Contact” or “About,” read off whatever’s there, paste it next to the URL, and move to the next one. For five companies, that’s ten minutes and you should just do it — no tool is worth setting up for five rows.
The cost is linear and it’s brutal at 300. Each site is a small hunt — the email might be on the
contact page, or the footer, or a team page, or written as info [at] company [dot] com to dodge
scrapers; the phone is in a header on one site and an image on another; the socials are icons you have
to hover to read. A good chunk of the list won’t have some of it at all, so you spend the same effort
per site to conclude “nothing here.” Half a day of clicking, a spreadsheet you don’t fully trust, and
no way to tell the ones you missed from the ones that genuinely had nothing.
The faster way
Business Email, Phone & Contact Details Scraper takes the whole list and returns one clean row per URL.
{
"urls": ["https://basecamp.com", "https://www.zapier.com", "https://www.notion.so"],
"maxPagesPerSite": 6
}
Drop your URLs into urls (or wire the whole spreadsheet in through startUrls, which takes a
linked dataset or Google Sheet, so you don’t paste 300 lines by hand). For each site the actor reads
the homepage and up to maxPagesPerSite of its contact/about/team pages — the default 6 is the right
starting point, and raising it is what you do if too many rows come back empty.
What comes back
{
"website": "https://acme-consulting.com",
"emails": [
{ "email": "info@acme-consulting.com", "source_url": "https://acme-consulting.com/contact", "type": "generic", "confidence": "high" },
{ "email": "jane@acme-consulting.com", "source_url": "https://acme-consulting.com/team", "type": "personal", "confidence": "high" }
],
"phones": ["+1 (415) 555-0100"],
"socials": [
{ "platform": "linkedin", "url": "https://www.linkedin.com/company/acme-consulting/" },
{ "platform": "facebook", "url": "https://www.facebook.com/acmeconsulting" }
],
"address": "123 Main St, Concord, CA, 94520",
"email_domain_matches_website": true,
"status": "found",
"source_url": "https://acme-consulting.com"
}
| Field | Example value | Meaning |
|---|---|---|
website | https://acme-consulting.com | The site crawled (after redirects) |
emails | [{email, type, confidence}] | Every address found, cleaned and classified |
phones | ["+1 (415) 555-0100"] | Phone numbers found (tel: links + visible text) |
socials | [{platform, url}] | Social-profile links found on the site |
address | 123 Main St, Concord, CA, 94520 | Best-effort postal address, when published |
email_domain_matches_website | true | false = a franchise/corporate email, not this site’s business |
status | found | found / no_email / unreachable / corporate_site |
source_url | https://acme-consulting.com | The input website |
emails is the column that turns the URL list into an outreach list, and it’s already been de-junked
— template placeholders and tracking noise are stripped, addresses are de-obfuscated, and each is
tagged personal, role or generic so you can send to jane@ rather than info@ where you have
the choice. phones and socials give you the other channels — a number to call and the profiles to
follow or DM — and address gives you a mailing/location field when the site publishes one. And
email_domain_matches_website: false flags the franchise trap — an email on a different domain than
the site is corporate, not the local business.
What you’d do with it
Export to CSV and you have your outreach list keyed back to the original URLs — import straight into
the CRM or mail-merge. Sort emails by type to lead with personal addresses, use phones for the
call list and socials for the follow/DM pass, and keep the rows with neither email nor phone as a
“no public contact” bucket rather than a to-do. The Friday deadline is a run that finishes while you
get coffee.
Worth knowing
This finds details a business has actually published on its own public pages — it does not guess or
brute-force, and it does not verify that an email delivers, so treat the output as “details this
company put on the web,” not a validated list. Emails and social links are the most reliable; phone
covers tel: links and standard visible formats; the postal address is best-effort, populated when
the site publishes it as JSON-LD, an address tag, or a recognizable US street address. It also
deliberately doesn’t crawl Facebook and Instagram themselves — those wall their content behind login
and JavaScript challenges — though it returns the social-profile links a site puts on its own pages.
Run it yourself: How to run Business Email, Phone & Contact Details Scraper walks the whole thing step by step.
If you don’t have the URLs yet, Chamber of Commerce Member Directory & Business Leads Scraper finds local businesses and runs this same enrichment engine on them in one pass — see Concord Chamber members with contact emails for that combined version.
Last updated 2026-07-15