Contact Details Extractor - Emails, Phones & Social Links avatar

Contact Details Extractor - Emails, Phones & Social Links

Pricing

from $24.00 / 1,000 contact extractions

Go to Apify Store
Contact Details Extractor - Emails, Phones & Social Links

Contact Details Extractor - Emails, Phones & Social Links

Pass website URLs or domains; get emails, phone numbers and social profile links as structured JSON, one record per URL. Each URL also scans /contact, /contact-us and /about on the same site, all for one $0.03 charge. Failed fetches are free. Built for lead gen, CRM enrichment and AI agents.

Pricing

from $24.00 / 1,000 contact extractions

Rating

0.0

(0)

Developer

Broke to Built

Broke to Built

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

11 days ago

Last modified

Share

Contact Details Extractor - emails, phone numbers and social profiles from any website

Give it a website URL. Get back every public email address, phone number and social profile link on that site's contact surface, as one clean JSON record per URL. No API key, no proxy setup, no crawler to configure.

One URL in = up to 3 pages scanned. For each URL you pass, this actor also tries /contact, /contact-us and /about on the same origin and merges everything it finds into a single record. That is where business contact details actually live, so you do not have to guess which page to point it at, and you are not billed per page it touches.

What you get (exact output fields)

FieldTypeWhat it is
urlstringThe URL you passed in
finalUrlstringWhere it landed after redirects
statusCodenumberHTTP status of the main page
pagesScannedstring[]Every page actually fetched for this record (1 to 3)
pageTitlestring | null<title> of the main page
emailsstring[]Lowercased, de-duplicated, up to 50. Includes mailto: links
phonesstring[]De-duplicated, up to 25. tel: links plus international-format numbers
socialProfilesobjectOne profile URL per network, keyed by network name
foundobject{ emails, phones, social } counts, handy for filtering
errorstringPresent instead of the above when the site could not be fetched

Networks detected in socialProfiles: twitter (x.com and twitter.com), linkedin (/company/ and /in/), facebook, instagram, youtube (@handle, /channel/, /c/), github, tiktok. Share/intent/login links are filtered out, so you get real profiles, not "share this page on Facebook" buttons.

Example 1 - a single company site

Input:

{ "url": "https://www.apify.com" }

Output (real run, 2026-08-15):

{
"url": "https://www.apify.com",
"finalUrl": "https://apify.com/",
"statusCode": 200,
"pagesScanned": [
"https://apify.com/",
"https://www.apify.com/contact",
"https://www.apify.com/about"
],
"pageTitle": "Apify: The largest marketplace of trusted tools for AI",
"emails": ["support@apify.com", "hello@apify.com"],
"phones": [],
"socialProfiles": {
"twitter": "https://x.com/apify",
"linkedin": "https://linkedin.com/company/apify",
"github": "https://github.com/apify",
"tiktok": "https://tiktok.com/@apifytech"
},
"found": { "emails": 2, "phones": 0, "social": 4 }
}

Example 2 - bulk enrichment of a lead list

Input:

{
"urls": ["stripe.com", "https://vercel.com", "linear.app"],
"maxUrls": 3
}

You get three records, one per input URL, in the same order. Bare domains are accepted - stripe.com becomes https://stripe.com automatically. This is the shape you want when enriching a CRM export: one row in, one row out, join on url.

Example 3 - a site that cannot be fetched

Input:

{ "url": "https://does-not-exist.invalid" }

Output (real run, 2026-08-15):

{
"url": "https://does-not-exist.invalid",
"error": "fetch failed: fetch failed"
}

Failed fetches are recorded as a diagnostic record and are not charged - that run reported chargedEventCounts: { "contact-extracted": 0 }. Filter on the presence of error to separate diagnostics from results.

Pricing

$0.03 per URL processed - billed as the contact-extracted event, once per URL in your input, whether that URL yields 40 emails or none. The extra /contact, /contact-us and /about pages scanned for that URL are included in the same single charge.

  • A URL that fails to fetch is free (it comes back as an error record).
  • maxUrls is your hard budget cap: the input list is truncated to it before anything runs, so maxUrls: 10 can never cost more than $0.30.
  • There is no per-run start fee.

Cheaper per-URL contact scrapers exist on the Store (measured 2026-08-15: $0.003 to $0.006 per page or dataset item is common). They typically bill per page or per dataset item; this actor bills per input URL and folds the contact/about pages into that one charge, and it returns a fixed, documented record shape rather than a variable number of rows. If you are extracting from a single known page and want the lowest possible unit price, one of those is the better buy - see "When not to use this" below.

FAQ

How do I extract email addresses from a website? Pass the site URL as url (or a list as urls). Every address found on the home page plus the /contact, /contact-us and /about pages comes back in the emails array, lowercased and de-duplicated, including addresses that only appear inside mailto: links.

Can it get phone numbers too? Yes. phones collects tel: links and international-format numbers found in the page text, keeping only 8-to-15-digit candidates and rejecting dates and version strings. Up to 25 per record.

Which social networks does it find? Twitter/X, LinkedIn (company and personal), Facebook, Instagram, YouTube, GitHub and TikTok - one profile URL per network in socialProfiles.

Does it crawl the whole website? No, and that is deliberate - a crawler is where costs explode. It fetches the URL you gave it plus at most two well-known contact paths on the same origin (/contact, /contact-us, /about), which pagesScanned reports exactly. If a business hides its email on /impressum or /team, pass that URL directly.

How many URLs can I process in one run? As many as you set maxUrls to; it defaults to 25 and truncates the list. Each URL is fetched sequentially, so plan roughly a few seconds per URL for large batches.

Can an AI agent call this as a tool? Yes. It is exposed through the Apify MCP server (mcp.apify.com), and the output record shape is fixed and documented above, so a model can rely on the field names.

Is scraping contact details legal? It reads only public contact information already published on the pages you point it at - the same data any visitor sees. What you then do with that data is governed by your jurisdiction (GDPR, CAN-SPAM, PECR and friends). Check before cold outreach; that part is on you, not on the tool.

When not to use this

  • You need to find pages, not read them. This actor never discovers URLs on its own. If you have a company name and no website, use a search or Google Maps scraper first, then feed the URLs here.
  • You need a full-site crawl. Contact data buried on /team/jane-doe will not be found unless you pass that URL. Use a crawler, or generate the URL list yourself.
  • The contact details are rendered by JavaScript. There is no headless browser here - it reads the HTML the server returns. Single-page apps that inject the footer client-side will look empty.
  • You need verified, deliverable emails. This extracts what is published; it does not do SMTP or MX verification. Pair it with an email verifier if bounce rate matters.
  • You are extracting one known page and unit price is everything. At $0.03 per URL this is priced for the "one URL covers the whole contact surface" case, not for cheapest-per-page bulk scraping.

Honest limits

  • Fetch timeout is 15 seconds per page; slow sites come back as error records (free).
  • Sites that block non-browser user agents at the CDN return their block page, which usually means empty arrays rather than an error.
  • Emails are matched by pattern. Obfuscated addresses (name [at] example.com, images, JS assembly) are not decoded.
  • socialProfiles records the first matching link per network, not every profile on the page.
  • Input URLs are not de-duplicated, so passing the same URL twice costs twice.

Run it from code

curl -X POST "https://api.apify.com/v2/acts/EliAI~contact-details-extractor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H 'content-type: application/json' \
-d '{"url":"https://www.apify.com"}'

Callable as an agent tool through the Apify MCP server (mcp.apify.com).

For AI agents

This Actor is built to be called by software, not just by people.

  • Mount it directly as an MCP tool — no Store search, no ranking, just this one tool: https://mcp.apify.com/?actors=eliai/contact-details-extractor
  • Or call it over HTTP and get the results in the same request: POST https://api.apify.com/v2/acts/eliai~contact-details-extractor/run-sync-get-dataset-items
  • Pay with x402, without an Apify account. This Actor is whitelisted for agentic payments, so an agent holding USDC on Base can buy a prepaid token and spend it here. The minimum purchase is $1, the token balance is an absolute spending cap, and it expires 14 days after purchase.
  • Costs are predictable before you call. Pricing is pay-per-event (see Pricing above), so an agent can budget a run in advance instead of discovering the bill afterwards.
  • Send only the field you mean. If you pass the bulk field, it is used on its own; the single-value field is a fallback, never merged into your request. You are charged for the items you sent and nothing else.