Website Contact Finder – Emails, Phones & Social Links avatar

Website Contact Finder – Emails, Phones & Social Links

Pricing

from $4.00 / 1,000 website with contacts

Go to Apify Store
Website Contact Finder – Emails, Phones & Social Links

Website Contact Finder – Emails, Phones & Social Links

Find emails, phone numbers and social media profiles (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok) on any list of company websites. Crawls contact, about, impressum and legal pages, one clean row per domain. Pay only for domains where contacts are found.

Pricing

from $4.00 / 1,000 website with contacts

Rating

0.0

(0)

Developer

Cemal Atakli

Cemal Atakli

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Give it a list of company websites. For each one you get back email addresses, phone numbers and social media profiles (LinkedIn, X/Twitter, Facebook, Instagram, YouTube, TikTok, GitHub, Pinterest), plus the contact page URL, company name, address and logo. Each domain comes back as one clean, deduplicated row, ready for your CRM or spreadsheet.

  • Pay per domain, only when contacts are found. You pay $4 per 1,000 domains that return at least one email, phone or social profile. Domains with no contacts, dead domains, blocked sites and errors cost nothing.
  • Smart page picking. The Actor crawls the homepage, then the pages most likely to hold contact details: Contact, About, Impressum/Imprint, Team, Legal notice, Locations and footer links. It understands 15+ languages (kontakt, contacto, contatti, iletişim, mentions légales, over ons…). It does not crawl blog posts or product pages.
  • Clean emails. It finds mailto: links, plain text, obfuscated forms like name [at] domain [dot] com and name (at) domain.com, Cloudflare-protected addresses and schema.org data. Junk is filtered out: image names (logo@2x.png), Sentry/Wix tracking addresses, placeholders (name@example.com) and third-party widget addresses. A DNS MX check tells you whether each email domain can actually receive mail.
  • Normalized phone numbers. Numbers come from tel: links, schema.org and page text, parsed with Google's libphonenumber. Each one is returned in international and E.164 format with its country and line type (mobile, landline, toll-free). Fax numbers are separated out. The phone country is detected per site from the country domain and the page language.
  • Real social profiles only. Share buttons, intent links, individual posts and videos are ignored. You get the company's actual profile URLs, normalized and deduplicated.
  • Polite and fast. HTTP only (no browser) and robots.txt respected, including Crawl-delay. Each site gets at most 2 parallel requests, and about 80–100 sites are processed per minute at the default settings.

What can I use it for?

  • Lead generation and sales prospecting: turn a list of company domains (from Google Maps, a trade-fair exhibitor list, a CRM export or a directory) into emails, phone numbers and LinkedIn pages
  • CRM enrichment: add missing contact data and social profiles to existing accounts
  • Agencies and freelancers: build local business lists (restaurants, dentists, shops, hotels) with their contact details
  • Partnership and PR outreach: find the press, sales or partnership emails of brands
  • Data quality: check that companies still list the same contact details, and flag email domains that no longer receive mail
  • AI agents: give an agent a "find contact info for this company" tool (see below)

Input

FieldDescription
urlsDomains or URLs (acme.com, https://www.acme.de/en/). Each domain is processed once.
bulkTextPaste any list: one per line, comma separated, or a whole CSV export
sourceFileUrlPublic URL of a .txt/.csv file (e.g. a published Google Sheet)
maxPagesPerSitePages per website, homepage included (default 10, max 50). The price per domain stays the same.
maxDepth0 = homepage only, 1 = + contact-like pages linked from it, 2 = + one more level (default)
extractEmails, extractPhones, extractSocialsChoose what to find
verifyEmailDomainsDNS MX check for every email domain (default on)
phoneCountryForce a country for local-format numbers (DE, GB…). Empty = auto per site
includePageDetailsAdd a pages array showing what was found on each crawled URL
maxSites, respectRobotsTxt, maxConcurrency, requestTimeoutSecs, proxyConfigurationAdvanced
{
"urls": ["hawksheadrelish.com", "puccinibomboni.com", "fairmountbagel.com"],
"maxPagesPerSite": 10,
"maxDepth": 2,
"extractEmails": true,
"extractPhones": true,
"extractSocials": true,
"verifyEmailDomains": true
}

Output

You get one row per domain. The Contacts and Social profiles tables in the Output tab show the main columns; the full JSON looks like this (shortened):

{
"domain": "puccinibomboni.com",
"url": "https://puccinibomboni.com",
"companyName": "Puccini Bomboni",
"emails": ["customerservice@puccinibomboni.com", "info@puccinibomboni.com", "webshop@puccinibomboni.com"],
"phones": ["+31 20 626 5474", "+31 20 427 8341", "+31 20 737 0530"],
"faxNumbers": [],
"linkedin": "https://www.linkedin.com/company/puccini-bomboni",
"facebook": "https://www.facebook.com/PucciniBomboniAmsterdam",
"instagram": "https://www.instagram.com/puccinibomboni_amsterdam",
"twitter": null, "youtube": null, "tiktok": null, "github": null, "pinterest": null,
"socialLinks": {"linkedin": ["..."], "facebook": ["..."], "instagram": ["..."]},
"contactPageUrl": "https://puccinibomboni.com/contact",
"hasContactForm": true,
"emailDetails": [
{"email": "customerservice@puccinibomboni.com", "domainMatchesSite": true, "mxValid": true,
"foundOnPages": ["https://puccinibomboni.com/faq"], "occurrences": 2}
],
"phoneDetails": [
{"phone": "+31 20 626 5474", "e164": "+31206265474", "country": "NL", "type": "fixed_line",
"isFax": false, "source": "tel-link", "foundOnPages": ["https://puccinibomboni.com/contact"], "occurrences": 20}
],
"address": null,
"language": "nl-NL",
"contactsFound": 9,
"pagesCrawled": 9,
"robotsTxt": "ok",
"jsRenderedSite": false,
"blocked": false,
"error": null
}

Emails on the company's own domain come first. domainMatchesSite: false marks outside addresses such as a Gmail inbox, a parent company or the web agency credited in the footer. Sites that fail have error set (DNS resolution failed, Blocked by bot protection, Disallowed by robots.txt…), and those rows are free.

See SAMPLE_OUTPUT.json for complete real results.

Pricing

Pay per event:

EventPrice
Domain with contacts (at least one email, phone or social profile found)$0.004 ($4 per 1,000 domains)
Actor start$0.0005
Domains with no contacts, failed or blocked domainsfree

How that compares with other contact scrapers in the Apify Store (listed prices, September 2026):

ActorListed priceApprox. per 1,000 domains*
vdrmota/contact-info-scraper (market leader)$2 per 1,000 pages$10–20 (at 5–10 pages per domain)
emastra$4 per 1,000 resultsabout $4+
jurassic_jove$6 per 1,000 resultsabout $6+
delicious_zebu$10 per 1,000 resultsabout $10+
caprolok$20 per 1,000 resultsabout $20+
This Actor$4 per 1,000 domains with contacts$4, and $0 for domains without contacts

*Our estimate. Prices differ in unit (pages, results or domains), so check each Actor's pricing tab.

Set a maximum cost per run in the run options. The Actor stops cleanly once the next domain would go over it.

FAQ

Is it legal to collect contact data from websites? This Actor only reads publicly published business contact information (the kind of details companies put on their contact, imprint and legal pages so that people can reach them). It respects robots.txt. You are responsible for how you use the data. Personal data such as a named employee's email is still personal data under the GDPR/UK GDPR, and email marketing is regulated (for example CAN-SPAM, ePrivacy/PECR and CASL). Make sure you have a lawful basis (such as legitimate interest for B2B outreach), honor opt-outs, and do not use the data for spam. If you are unsure, ask a lawyer. Apify's article Is web scraping legal? is a good starting point.

Why did a site return no contacts? Common reasons:

  • The site shows contact details only inside a JavaScript app (jsRenderedSite: true) or only through a contact form (hasContactForm: true).
  • The site blocks automated HTTP clients (blocked: true).
  • The domain is parked or for sale.

You are not charged for these domains.

Does it use a headless browser? No. It uses plain HTTP, which is what keeps it fast and cheap. Sites protected by Cloudflare/Incapsula "checking your browser" pages are reported as blocked rather than retried with an expensive browser.

How are pages chosen? Links on the homepage are scored by URL and link text: contact/imprint pages first, then about/team/legal/locations, then privacy/terms. Footer links get a bonus. If no contact link exists, the Actor tries common paths such as /contact and /impressum. Other subdomains and sister domains of the same brand are included, and all other websites are ignored.

Can I get the page where each email was found? Yes. emailDetails[].foundOnPages and phoneDetails[].foundOnPages list the URLs, and includePageDetails: true adds a per-page breakdown.

Can I feed it a Google Sheet? Yes. Publish the sheet as CSV and paste the link into sourceFileUrl. To send the results back to a sheet, use a Google Sheets integration.

Use with AI agents / Apify MCP

The Actor works well as a tool for AI agents. It takes a small input (a domain list), returns one compact row per domain and costs very little. Through the Apify MCP server (https://mcp.apify.com?actors=gazidev/website-contact-finder), Claude, ChatGPT, Cursor and other MCP clients can call it directly, for example: "find the contact email and LinkedIn page of these 20 companies". You can also call it over the Apify API: POST https://api.apify.com/v2/acts/gazidev~website-contact-finder/run-sync-get-dataset-items with the input JSON.

Categories

Lead generation · Marketing · SEO tools · Automation · Developer tools