Website Contact Extractor: Emails, Phones, Socials
Pricing
from $2.00 / 1,000 website scanneds
Website Contact Extractor: Emails, Phones, Socials
Extract emails, phone numbers (E.164), social profiles, contact page and address from company websites. Crawls homepage plus contact, about, team and imprint pages, obeys robots.txt. One row per website.
Pricing
from $2.00 / 1,000 website scanneds
Rating
0.0
(0)
Developer
Ailu Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Website Contact Extractor: Emails, Phone Numbers, Social Links and Addresses from Company Websites
Give it a list of company websites and get one clean row per website: email addresses, phone numbers normalised to E.164, LinkedIn / X (Twitter) / Facebook / Instagram / YouTube / TikTok / GitHub profiles, the contact page URL, the company name and the postal address from schema.org JSON-LD. The Actor fetches the homepage and up to 8 contact-like pages on the same domain (contact, imprint/Impressum, about, team, support, legal, privacy), reads robots.txt first and never submits forms or logs in. Unlike per-page priced contact scrapers, you pay once per website, whatever number of pages was scanned, and every item comes with the pages it was found on (foundOn). No browser and no proxy are needed, so runs are fast and cheap.
Use cases
- B2B lead research: turn a list of company domains into generic contact emails (info@, sales@, support@) and phone numbers.
- CRM enrichment: add LinkedIn company pages, X handles and headquarters addresses to existing accounts.
- Supplier and partner directories: collect imprint (Impressum) contact data of European companies.
- Data quality: check which websites still publish a contact page, an email or a phone number.
- AI agents: a single call returns structured contact data instead of raw HTML.
Input
| Field | Default | Meaning |
|---|---|---|
websites | ["https://apify.com", "https://www.python.org"] | Company websites, one per line. Bare domains are accepted (acme.com). Duplicates by host are removed. |
maxPagesPerSite | 8 | Contact-like pages fetched per website in addition to the homepage (0 to 19), best candidates first. |
includePhones | true | Extract phone numbers (tel: links, JSON-LD, text next to a phone keyword). |
includeSocialLinks | true | Extract social profile links. |
sameDomainEmailsOnly | false | Keep only emails on the website's own domain in emails. |
timeoutSecs | 20 | Timeout per page. |
maxConcurrency | 3 | Websites crawled in parallel (pages of one site are fetched one by one). |
maxItems | 100 | Maximum charged rows (websites whose homepage loaded). |
Example: { "websites": ["stripe.com", "https://www.hetzner.com"], "maxPagesPerSite": 5, "sameDomainEmailsOnly": true }
Output
One row per website. Fields:
| Field | Meaning |
|---|---|
id | site:<host> |
inputUrl, domain, finalUrl | Input, registrable domain, homepage after redirects |
companyName | og:site_name, JSON-LD Organization name or page title |
emails, emailsSameDomain | Unique emails (same-domain first) and the same-domain subset |
phones, phonesE164 | Numbers as written, and valid numbers in E.164 |
socialLinks | { linkedin, twitter, facebook, instagram, youtube, tiktok, github }, arrays of profile URLs |
contactPageUrl | Contact page that was found, if any |
addresses | schema.org PostalAddress objects (street, locality, region, postal code, country, formatted) |
countryHint | Country used to read national phone numbers |
pagesCrawled, crawledUrls | Pages scanned |
robotsBlocked | Pages skipped because robots.txt disallows them |
foundOn | Map item -> page URLs where it appeared |
error, fetchedAt | Error reason (free rows) and run time |
Sample row (trimmed):
{"id": "site:apify.com", "inputUrl": "https://apify.com", "domain": "apify.com", "finalUrl": "https://apify.com/","companyName": "Apify","emails": ["support@apify.com", "hello@apify.com", "legal@apify.com", "privacy@apify.com"],"emailsSameDomain": ["support@apify.com", "hello@apify.com", "legal@apify.com", "privacy@apify.com"],"phones": [], "phonesE164": [],"socialLinks": { "linkedin": ["https://www.linkedin.com/company/apify"], "twitter": ["https://x.com/apify"], "facebook": [], "instagram": [],"youtube": ["https://www.youtube.com/apify"], "tiktok": ["https://www.tiktok.com/@apifytech"], "github": ["https://github.com/apify"] },"contactPageUrl": "https://apify.com/contact","addresses": [{ "streetAddress": "Na Příkopě 959/27", "addressLocality": "Prague", "addressRegion": null, "postalCode": "11000","addressCountry": "CZ", "postOfficeBoxNumber": null, "formatted": "Na Příkopě 959/27, 11000 Prague, CZ" }],"countryHint": "CZ", "pagesCrawled": 8, "robotsBlocked": 0,"foundOn": { "hello@apify.com": ["https://apify.com/contact"] },"error": null, "fetchedAt": "2026-11-04T11:30:02.588Z"}
How it works and limits
- robots.txt is read for every host before any page is fetched (rules for
User-agent: *orapify-actor-website-contact-extractor). If robots.txt answers 5xx or cannot be reached, the host is not crawled. Disallowed pages are counted inrobotsBlocked. - Pages are found from homepage links (URL or link text matching contact, kontakt, impressum, imprint, about, team, support, legal, privacy and a few translations), then from sitemap.xml when the homepage has too few such links. Only the website's own domain and its sub-domains are visited, at most 20 pages per website, at most 2 requests per second per host.
- Emails: mailto links, visible text, JSON-LD, Cloudflare email protection and simple obfuscation such as
name [at] domain [dot] com. Image names likelogo@2x.png, placeholder domains and error-tracking addresses are removed. - Phones: tel: links and JSON-LD always; numbers in text only when they are valid (libphonenumber) and international, or national with a phone keyword nearby and a known country.
- Plain HTML only: content that appears only after JavaScript runs, contact forms and pages behind logins or bot challenges are not covered. A website whose homepage fails (HTTP error, timeout, non-HTML, robots.txt) gets a free row with
error.
Pricing
Pay per result: $2.00 per 1,000 rows (result event). Platform usage is billed separately by Apify. Removed/free rows are not charged.
One row is one website whose homepage loaded, however many pages were scanned. Error rows are free.
Legal
Not affiliated with any of the scanned websites or social networks. Uses only publicly accessible web pages and obeys robots.txt. Data licence/terms: each website's own terms of use apply. This Actor is meant for B2B lead research on public company websites. It does not scrape personal social media profiles; it only lists links that a company publishes on its own site. You are responsible for complying with GDPR, CAN-SPAM, ePrivacy and other laws when you store or contact the addresses you collect, and with each website's terms of use.
FAQ
Why did a website return no emails? Many companies only offer a contact form or load contact details with JavaScript. Check crawledUrls, robotsBlocked and error.
Why are some numbers in phones but not in phonesE164? A national number such as (415) 555-2671 can only be converted when the country is known. Numbers with a + prefix are always converted.
Does it verify the emails? No. Use an email validation Actor (syntax, MX, disposable checks) on the results.
Can I crawl more pages per site? Yes, up to 19 extra pages with maxPagesPerSite; the price per website stays the same.