Website Contact Finder – Emails, Phones & Social Links
Pricing
from $4.00 / 1,000 website with contacts
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
Maintained by CommunityActor 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 likename [at] domain [dot] comandname (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
| Field | Description |
|---|---|
urls | Domains or URLs (acme.com, https://www.acme.de/en/). Each domain is processed once. |
bulkText | Paste any list: one per line, comma separated, or a whole CSV export |
sourceFileUrl | Public URL of a .txt/.csv file (e.g. a published Google Sheet) |
maxPagesPerSite | Pages per website, homepage included (default 10, max 50). The price per domain stays the same. |
maxDepth | 0 = homepage only, 1 = + contact-like pages linked from it, 2 = + one more level (default) |
extractEmails, extractPhones, extractSocials | Choose what to find |
verifyEmailDomains | DNS MX check for every email domain (default on) |
phoneCountry | Force a country for local-format numbers (DE, GB…). Empty = auto per site |
includePageDetails | Add a pages array showing what was found on each crawled URL |
maxSites, respectRobotsTxt, maxConcurrency, requestTimeoutSecs, proxyConfiguration | Advanced |
{"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:
| Event | Price |
|---|---|
| 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 domains | free |
How that compares with other contact scrapers in the Apify Store (listed prices, September 2026):
| Actor | Listed price | Approx. 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 results | about $4+ |
| jurassic_jove | $6 per 1,000 results | about $6+ |
| delicious_zebu | $10 per 1,000 results | about $10+ |
| caprolok | $20 per 1,000 results | about $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