Contact Details Extractor - Emails, Phones & Social Links
Pricing
from $24.00 / 1,000 contact extractions
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
11 days ago
Last modified
Categories
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)
| Field | Type | What it is |
|---|---|---|
url | string | The URL you passed in |
finalUrl | string | Where it landed after redirects |
statusCode | number | HTTP status of the main page |
pagesScanned | string[] | Every page actually fetched for this record (1 to 3) |
pageTitle | string | null | <title> of the main page |
emails | string[] | Lowercased, de-duplicated, up to 50. Includes mailto: links |
phones | string[] | De-duplicated, up to 25. tel: links plus international-format numbers |
socialProfiles | object | One profile URL per network, keyed by network name |
found | object | { emails, phones, social } counts, handy for filtering |
error | string | Present 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
errorrecord). maxUrlsis your hard budget cap: the input list is truncated to it before anything runs, somaxUrls: 10can 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-doewill 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
errorrecords (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. socialProfilesrecords 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.