Contact Details Scraper — Emails & Socials from URLs or Search avatar

Contact Details Scraper — Emails & Socials from URLs or Search

Pricing

from $2.70 / 1,000 per domain scrapeds

Go to Apify Store
Contact Details Scraper — Emails & Socials from URLs or Search

Contact Details Scraper — Emails & Socials from URLs or Search

Find business websites from a search such as 'dentists in Miami' or paste URLs, and get one CRM-ready row per domain with emails, phones, WhatsApp, 14 social profiles and address. Billed per domain, however many pages are crawled.

Pricing

from $2.70 / 1,000 per domain scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

1

Bookmarked

168

Total users

17

Monthly active users

2 days ago

Last modified

Features

Limited permissions

Share

What is Contact Details Scraper?

Contact Details Scraper visits company websites and returns one row per domain with the contacts it finds: email addresses, phone numbers, WhatsApp links, social profiles such as LinkedIn, X, Facebook, Instagram, YouTube, TikTok and GitHub, postal addresses and the company name. Give it website URLs, plain domains, or a search like dentists in Miami, and it crawls the contact, about and team pages first. Sales teams, agencies, recruiters, researchers and AI agents use it to turn a list of websites into contact details for outreach and CRM enrichment.

Why sales teams use it for website enrichment

  • One clean row per company. Everything found across a site is merged into a single record per domain, ready for a spreadsheet or CRM.
  • Contact pages first. Contact, about, team and imprint pages are crawled before the rest, so a small page budget still finds the useful details.
  • Social profiles by network. social_links is keyed by network, so you can read social_links.linkedin directly.
  • URLs or a search. Paste websites you already have, or type a business type and city and let the Actor find the websites.
  • Your budget, your depth. maxPagesPerDomain, maxDepth and maxResults decide how thorough each run is.

How to use it

Enrich a list of company websites:

{
"startUrls": [
{ "url": "https://apify.com" },
{ "url": "https://www.iana.org" }
],
"maxPagesPerDomain": 5,
"maxDepth": 1
}

Find websites from a search and collect their contacts:

{
"searchQueries": ["dentists in Miami Florida"],
"maxResults": 20,
"maxPagesPerDomain": 5
}
InputWhat it controls
startUrlsWebsites to scan, one record per domain
domainsUp to 500 public domains or full URLs; bare domains use HTTPS; combines with startUrls
searchQueriesBusiness type and location phrases; the Actor finds matching websites from web search
maxPagesPerDomainPages to crawl on each site, from 1 to 50 (default 10)
maxDepthHow many links deep to follow from the start page, from 0 to 5 (default 2)
domainsPlain domains such as apify.com, one per line; combine with startUrls and searchQueries
checkEmailDomainsMail-server check for each email domain (default on; turn off for the fastest run)
maxResultsMost domains to save in one run, from 1 to 500 (default 20)
proxyConfigApify Proxy settings; datacenter suits most websites

Use startUrls when you already know the companies; continue with searchQueries when you only know the niche and city.

Output: contact data you receive

Illustrative output shape; published contacts and field values vary by website:

{
"domain": "apify.com",
"company_name": "Apify",
"emails": ["hello@apify.com", "support@apify.com"],
"email_details": [
{ "email": "hello@apify.com", "type": "role", "free_provider": false, "same_domain": true, "mail_server": true },
{ "email": "support@apify.com", "type": "role", "free_provider": false, "same_domain": true, "mail_server": true }
],
"phones": [],
"phones_e164": [],
"whatsapp": [],
"social_links": {
"discord": "https://discord.com/invite/jyEM2PRvMU",
"twitter": "https://x.com/apify",
"linkedin": "https://www.linkedin.com/company/apify",
"tiktok": "https://www.tiktok.com/@apifyoffice",
"github": "https://github.com/apify"
},
"addresses": ["Na Příkopě 959/27, Prague, 11000, CZ"],
"pages_scraped": 2,
"source_url": "https://apify.com/contact",
"scraped_at": "<ISO 8601 UTC timestamp>"
}
FieldWhat it contains
domain, company_nameThe website and the company name found on it
emailsEmail addresses published on the site, best contact first, with placeholder and no-reply addresses filtered out
email_detailsPer email: type (role such as info@, or personal), free_provider (Gmail and similar), same_domain (matches the website) and mail_server (true when the domain can receive mail, from a DNS lookup; nothing is sent)
phones, phones_e164, whatsappUp to 10 distinct phone numbers (tel links first), the same numbers in international format when the country is clear, and WhatsApp links
social_linksSocial profiles keyed by network
addressesPostal addresses found on the pages
pages_scraped, source_urlHow many pages were read and where the scan started

OUTPUT in the default key-value store reports the run outcome (COMPLETE, PARTIAL, VALID_EMPTY, INVALID_INPUT or UPSTREAM_FAILED) and how many domains were saved.

Example workflow: building an outreach list for an agency

A web design agency wants to pitch dental clinics in Miami. They search for dentists in Miami Florida with maxResults set to 50 and maxPagesPerDomain set to 5. They keep domains where emails has at least one address, use social_links.instagram to see how active each clinic is, and load the list into their CRM. Then they pass the emails to Email Address Validator to keep only deliverable addresses before the first campaign.

Pricing

This Actor uses Pay per event. Apify platform usage is included in the event price, so you pay one event per domain saved plus one start event per run. The current price is $0.003 per saved domain plus $0.00005 per start event. The live Pricing tab is authoritative. At the normal 1 GB memory setting, 50 domains cost $0.15005. The platform start event is charged once per GB, with a minimum of one event, so more memory increases that start fee.

  • At 1 GB, 50 domains = 50 domain events + 1 start event, however many pages each one needed.
  • maxResults caps saved domain events. The start fee is additional; use Apify’s maximum charge setting for a total spending limit.
  • maxPagesPerDomain changes how thorough each domain is, not the price per domain.
  • Apify Store discounts apply to the per-domain price: $0.003 on Free and Bronze, $0.0029 on Silver, $0.0027 on Gold and above.

Free Apify plan

Free Apify plan runs return up to 25 domains and use up to 3 search queries per run. Every field, search route and data check is the same as on paid plans, and results are identical. Paid Apify plans have no per-run limit. The run summary reports freePlanLimit when the limit was reached.

Contact enrichment with AI agents (MCP)

Connect this Actor to an AI agent through Apify MCP and ask in plain language:

Find contact details for these 10 company websites. Return emails, phone numbers and LinkedIn pages for each, and list the companies that publish only social links.

Agent checklist:

  1. Put known websites in startUrls as { "url": "..." } objects, or plain domains in domains; put niche-and-city requests in searchQueries.
  2. Keep maxPagesPerDomain around 5 for quick answers.
  3. Read rows with get-dataset-items; one row is one domain.
  4. Read OUTPUT.outcome to confirm the outcome before using the rows.

API example

curl -X POST "https://api.apify.com/v2/acts/khadinakbar~contact-details-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls": [{"url": "https://apify.com"}], "maxPagesPerDomain": 5, "maxDepth": 1}'
Your next stepUseWhy
When you then want to check which emails are deliverableEmail Address ValidatorSyntax, mail server, disposable and role checks
When you want each company's LinkedIn pageLinkedIn Company Finder from WebsiteWebsite in, LinkedIn company URL out
When you search local businesses by category and cityGoogle Maps ScraperPhones, ratings, reviews and opening hours from Google Maps
When you want scored leads for a nicheB2B Lead FinderCompanies with contacts and a lead score

Best results

Starting situationHelpful actionExpected outcome
A CRM export of company websitesPaste them into startUrlsOne contact row per company
Large corporate sitesRaise maxPagesPerDomain to 10 to 15More regional emails and phones
Small business sitesKeep maxPagesPerDomain around 5Quick runs that still reach the contact page
A niche with no list yetUse searchQueries with a city, such as roofers DenverWebsites found and scanned in one run

Builder's note

I found that most people want one tidy row per company rather than a list of every page crawled, so the Actor merges each site into a single record with social profiles keyed by network. I learned that the contact, about and team pages hold most published details, so they are crawled first and a small page budget goes a long way.

FAQ

Which email addresses does it collect?

The addresses a company publishes on its own website, such as sales, support or team addresses.

Why are some fields empty for a domain?

Many websites publish only a contact form or only social links. The row still shows whatever the site does publish, such as its social profiles.

What kinds of social profiles are returned?

LinkedIn, X, Facebook, Instagram, YouTube, TikTok, GitHub, Pinterest, Telegram, Discord, Reddit, Medium, Threads and Snapchat, each under its own key in social_links.

How do search queries work?

The Actor runs a web search for your phrase, takes the websites from the results, and scans each one like a URL you pasted. Directory sites can appear in the results too.

How many pages should I crawl per site?

About 5 suits most small business sites. Larger companies with regional offices can use 10 to 15.

Responsible use

This Actor collects contact details that companies publish on their public websites. Business contact data can still be personal data under laws such as the GDPR and CCPA, so use it with a lawful basis, follow CAN-SPAM and anti-spam rules for outreach, and honor opt-out requests. Read Apify's guide on whether web scraping is legal for more context. For questions or bugs, open a ticket in the Issues tab.

Call over HTTP

Use this Actor's actual Endpoints URL with an Apify bearer token. GET /contacts?url=https%3A%2F%2Fexample.com supports one public target. POST /contacts accepts startUrls as objects with url, maxPagesPerDomain, maxDepth, maxResults and proxyConfig, plus optional maxCostUsd. Results and a summary are returned directly. Search queries and persistent bulk exports remain available through normal runs.

Existing prices, free-user limits, paid features, normal default crawl settings and included platform usage are unchanged. One domain-result costs $0.003 for a completed domain contact report, including an accessible website with no public contact details. No extra manual startup charge is added per HTTP request.

All contact fields, company and address extraction, WhatsApp, phone deduplication and 14 social platforms use the same parser as normal runs. HTTP keeps the selected 1–50 pages per domain, depth 0–5 and up to 500 domains, subject to the synchronous work bounds below.

maxCostUsd is checked before source or proxy work against the maximum planned unique domain results after maxResults. It caps result events for that HTTP request; it does not enforce a user/day quota or read a Console-wide allowance. Readiness and input/budget rejections charge no result event. Completed validated units are attributed to the Apify request ID and charged before delivery. Unconfirmed billing withholds results; do not automatically retry an uncertain charge. Partial useful work returns HTTP206 with complete records and explicit counts.

HTTP accepts two isolated request workers per instance, 1 MiB input, 20 MiB cumulative decoded source transfer and 2 MiB complete output. Oversized complete output is withheld before result billing. New work stops after 180 seconds and each worker has a 240-second hard deadline. Use a normal run for long or large work. These are HTTP transport bounds and do not change free or paid batch limits. Idle instances can scale down, so later calls may cold-start.

Caller inputs, page content, results and credentials are not saved in shared Dataset/KV or general service logs. Only operational aggregates remain. HTTP does not create a caller-specific run, stored export or history entry; use normal runs for those features. No browser, login or new paid data provider was added. Optional Apify/custom proxy costs can still apply within existing included platform usage. Public HTTP(S) targets without URL credentials are required; private IPs, unsafe DNS answers and redirects are rejected. A configured proxy remains a separate resolver trust boundary.

Normal-run billing records pending effects before charging or saving, retains an accepted final spending-cap unit and stops on ambiguous effects without automatic replay. Result charges follow the reviewed complete-row writer. These safeguards do not promise distributed exactly-once delivery or final invoice settlement.

What's new

2026-11 Cheaper and faster runs: pages are queued in memory and a domain stops being crawled once an email, a phone and a social profile are found. New: plain-domain entry (domains), email_details (role or personal, free provider, same domain, mail server), phones_e164, phones capped at 10 with tel links first, best email first, agentSummary in OUTPUT, and a time-limit guard that saves collected domains instead of timing out. Price per domain is unchanged.

⌂ 换网址