Website Contact + Social Link Extractor avatar

Website Contact + Social Link Extractor

Pricing

Pay per usage

Go to Apify Store
Website Contact + Social Link Extractor

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

Brian Keefe

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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.