Website Contact + Social Link Extractor
Pricing
Pay per usage
Website Contact + Social Link Extractor
Extract public emails, phone numbers, contact pages, booking links, and social profiles from business websites in bulk for lead enrichment.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Brian Keefe
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
website-contact-social-link-extractor
Production-oriented Apify Actor for shallow crawling of public websites to extract contact details, company clues, and social profile links.
It is intentionally narrow:
- Public data only
- No login, no session bypassing, no protected pages
- Best suited for company websites, agency sites, startup sites, directories, and public landing pages
What It Extracts
- Emails
- Phone numbers
- Contact form URLs
- Contact page URLs
- About, team, and legal/privacy page URLs
- Social profile URLs for LinkedIn, X, Twitter, Facebook, Instagram, YouTube, TikTok, and GitHub
- Schema.org organization clues and company-name hints
- Page title and meta description
- Confidence score and crawl metadata
- Source evidence showing where each signal was found
Input
Use startUrls, domains, or row-oriented inputs: googleMapsRows, businessRows, shopifyRows, serpRows, and generic rows.
Supported row fields are intentionally CSV-friendly: website, url, domain, link, displayedLink, storeUrl, shopDomain, shopifyDomain, and sourceUrl.
All seeds are normalized to public site homepages and deduped by site.
Example:
{"googleMapsRows": [{ "name": "Example Co", "website": "https://example.com" }],"serpRows": [{ "title": "Example Org Contact", "link": "https://example.org/contact" }],"rows": [{ "domain": "example.net" }],"maxPagesPerSite": 8,"maxDepth": 1,"maxConcurrency": 10,"requestTimeoutSecs": 20}
See examples/sample-input.json.
Output
The actor writes one record per site to the Apify Dataset.
Example:
{"inputSource": "https://example.com","siteUrl": "https://example.com/","domain": "example.com","title": "Example Company","metaDescription": "Example Company public contact page.","emails": ["hello@example.com"],"phones": ["+14155550101"],"contactFormUrls": ["https://example.com/contact"],"contactPageUrls": ["https://example.com/contact"],"aboutPageUrls": ["https://example.com/about"],"teamPageUrls": ["https://example.com/team"],"legalPageUrls": ["https://example.com/privacy"],"socialProfiles": {"linkedin": ["https://www.linkedin.com/company/example-company"],"x": ["https://x.com/examplecompany"],"twitter": [],"facebook": [],"instagram": [],"youtube": [],"tiktok": [],"github": []},"schemaOrg": {"types": ["Organization"],"names": ["Example Company LLC"],"sameAs": ["https://www.linkedin.com/company/example-company"]},"companyClues": {"names": ["Example Company", "Example Company LLC"],"legalMentions": ["Example Company LLC"]},"pagesCrawled": 4,"crawl": {"pagesCrawled": 4,"maxPagesPerSite": 8,"maxDepth": 1,"sameHostOnly": true,"shallow": true},"confidenceScore": 0.95,"evidence": {"emails": [{ "value": "hello@example.com", "sourceUrl": "https://example.com/contact" }]}}
See examples/sample-output.json.
Crawl Strategy
- Seeds each site with
/,/contact,/contact-us,/about,/about-us, and/team - Follows same-host links only
- Prioritizes contact/about/team/legal-like links
- Stays shallow through
maxDepth - Caps work per site with
maxPagesPerSite - Surfaces crawl metadata in each result for easier QA downstream
Local Development
Install dependencies:
$npm install
Run the actor locally with Apify local storage:
$npm start
Run tests:
$npm test
Run deterministic smoke verification against a local HTML fixture server:
$npm run smoke
Run with Apify CLI:
$npx --yes apify-cli run
Notes
- The actor does not attempt to bypass access controls.
- The actor is intended for generic public website extraction, not scraping protected platforms.
- Some websites hide contact details behind JavaScript apps or images; those cases may produce partial results.