Website Contact + Social Link Extractor
Pricing
Pay per usage
Website Contact + Social Link Extractor
Extracts public emails, phones, contact pages, and social profile links from websites.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Brian Keefe
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 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.