Website Contact Extractor — Email, Phone, Socials
Pricing
$5.00 / 1,000 domain contact-extracteds
Website Contact Extractor — Email, Phone, Socials
One row per input domain. Visits the homepage plus up to 5 standard contact pages (/contact, /about, /team, /imprint, /privacy). Surfaces emails (optionally MX-verified), phone numbers (E.164 + raw), social links, mailing addresses, and embedded platforms like Calendly, Hubspot, Mailchimp.

Website Contact Extractor
One row per domain. Emails, phones, social handles, and embedded
platforms — pulled from the homepage and five standard contact pages
(/contact, /about, /team, /imprint, /privacy). Emails are
MX-verified by default. No headless browser, no cookies, no login.
What you get
{"domain": "stripe.com","origin": "https://stripe.com","pagesProbed": 6,"pagesOk": 6,"emails": [{ "email": "dpo@stripe.com", "role": "legal", "mxValid": true },{ "email": "privacy@stripe.com", "role": "legal", "mxValid": true },{ "email": "complaints-in@stripe.com", "role": null, "mxValid": true }],"phones": ["+14155551212"],"socials": {"twitter": ["https://twitter.com/stripe"],"github": ["https://github.com/stripe"],"youtube": ["https://youtube.com/@stripe"],"facebook": ["https://facebook.com/StripePayments"],"instagram": ["https://instagram.com/stripe"]},"platforms": ["google-analytics", "stripe-checkout"]}
How to use
Input. A list of domains or URLs.
acme.com→ crawls the homepage plus the five default contact pages.https://acme.com/team→ crawls only that one page.extraPaths: ["/legal", "/kontakt"]→ adds locale-specific paths to the default set for every domain.
Output. Apify dataset, one row per domain. Schema above.
Verification. verifyEmails: true runs a DNS MX lookup on every
extracted email's domain. No SMTP probing — just MX-record presence.
Fast (~50ms per unique domain), no rate-limit risk.
Proxy. Off by default; turn on useResidentialProxy only for
sites that refuse datacenter IPs.
v0.2 — what's new
Role classification. Every email is tagged with a role inferred from
the local part: ceo, press, security, legal, billing,
careers, sales, support, info. info@, hello@, contact@
fall under info; careers@, jobs@, hr@ under careers; etc.
Unknown locals get role: null. Filter role == "sales" to surface BD
contacts across a portfolio without manual triage.
Strict same-domain. Set strictSameDomain: true to drop any email
whose host doesn't match the input domain (or a subdomain of it). This
removes SDK noise — e.g. on stripe.com you'd otherwise see
noreply@sentry.io because of the embedded Sentry init script.
Flat email rows for CSV export. Set emitFlatEmails: true to
additionally emit one row per email shaped
{domain, email, role, mxValid}What this actor does NOT do
- No LinkedIn. Deliberately excluded. LinkedIn's TOS and the
hiQ v. LinkedInchain of litigation make it unsuitable for an open Apify Store actor. Use a separate first-party LinkedIn-aware workflow. - No SMTP probing. MX-record presence is the only verification.
SMTP
RCPT TO:probing trips spam-score listings on the source IP — bad ROI. - No JavaScript rendering. Sites that ship contact info only via JS bundles (rare for contact pages) will surface as empty.
Pricing
PAY_PER_EVENT · $0.005 per domain_extracted · 200 domains = $1.
Source
Each domain's public HTTP responses on /, /contact, /about,
/team, /imprint, /privacy, plus any extraPaths. Parsing is
regex + light HTML stripping; deobfuscates the common (at) / [dot]
email tricks before extraction. Phone numbers are normalized to E.164
best-effort.