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

Contact Details Scraper — Emails & Socials from URLs or Search

Pricing

from $3.00 / 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 $3.00 / 1,000 per domain scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

1

Bookmarked

164

Total users

27

Monthly active users

6 days ago

Last modified

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, 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
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)
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

A real row for a company website, collected from two pages:

{
"domain": "apify.com",
"company_name": "Apify",
"emails": ["hello@apify.com", "support@apify.com"],
"phones": [],
"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": "2026-10-01T00:12:51.264Z"
}
FieldWhat it contains
domain, company_nameThe website and the company name found on it
emailsEmail addresses published on the site, with placeholder and no-reply addresses filtered out
phones, whatsappPhone numbers 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 or VALID_EMPTY) 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 run 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 live Pricing tab on this page shows the current price.

  • 50 domains = 50 domain events + 1 start event, however many pages each one needed.
  • maxResults caps each run, so it doubles as a cost ceiling.
  • maxPagesPerDomain changes how thorough each domain is, not the price per domain.

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; 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 run defaults 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.