Website Contact Scraper: Emails, Phones, Socials + AI avatar

Website Contact Scraper: Emails, Phones, Socials + AI

Pricing

from $3.60 / 1,000 website with contacts

Go to Apify Store
Website Contact Scraper: Emails, Phones, Socials + AI

Website Contact Scraper: Emails, Phones, Socials + AI

Emails, phones, social profiles, contact page and legal notice of any company website, one row per website, with optional AI company summary. Pay per website.

Pricing

from $3.60 / 1,000 website with contacts

Rating

0.0

(0)

Developer

kelvin lab

kelvin lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

Give a list of company websites and get one clean row per website: the best contact email first, phone numbers in international format, one column per social network (LinkedIn, X, Facebook, Instagram, TikTok, YouTube), and the contact page, contact form and legal notice (Impressum) URLs. You pay per website with contacts found, never per page crawled, and websites with nothing found are free. Optional AI fields describe each company: legal name, summary, industry, B2B or B2C, offerings, country, city and address.

What you can use it for

  • Cold outreach to small businesses. Turn a Google Maps or directory export into emails and phone numbers. primaryEmail is the general inbox (info@, hello@, sales@), never noreply@ or privacy@.
  • CRM and Clay enrichment. One row per domain with the LinkedIn company page and the other profiles in their own columns, ready to join on input or domain.
  • Contact-form outreach. contactFormUrl is a page with a real contact form; contactPageUrl is the page the site links as Contact.
  • Brand and influencer research. Instagram, TikTok and YouTube profiles of a list of brands.
  • DACH B2B. The Impressum page is found and read in German, plus contact pages in 12 languages.
  • AI agents. Every field has a description an agent can follow, and each row says why a website gave nothing.

How it works

For each website the Actor reads the home page, then, in this order, the pages it links as contact, legal notice, about and team (up to 5 pages in total by default, 10 at most). It reads emails from mailto links, visible text (also "info [at] acme.de" and Cloudflare-protected addresses) and the site's structured data, and phone numbers from tel: links, structured data and text next to a phone label. Scripts, form placeholders and image names are never read as emails, and fax numbers are left out.

It connects directly, without a proxy: in our tests that reached more websites than a datacenter proxy. It respects robots.txt unless you turn that off.

Input

FieldDescription
websitesOne website per line: a domain (acme.com) or any URL on it. Up to 10,000 per run; the same website twice is read and charged once.
maxPagesPerWebsitePages read per website, home page included (default 5, at most 10). The price does not depend on it.
includePersonalContactsAlso return emails that look like a person's (jane.doe@) and personal LinkedIn profiles (default on). Turn off to keep only role inboxes and company profiles.
defaultPhoneRegionTwo-letter country code for numbers written without a country code. Empty: the country of the site's address, else its country domain, else the page language, else US.
aiEnrichmentAdd the AI company fields (default off). Charged per enriched website.
respectRobotsTxtSkip pages robots.txt disallows (default on).
maxConcurrencyWebsites read at the same time (default 10).
requestTimeoutSecsTime limit per page (default 20 s).
proxyConfigurationOptional Apify datacenter proxy or your own proxies. Residential proxy is not supported.
{
"websites": ["apify.com", "marley.de", "sunsethillvet.com"],
"maxPagesPerWebsite": 5,
"aiEnrichment": true
}

Output

One row per website. Example (shortened):

{
"input": "marley.de",
"domain": "marley.de",
"url": "https://marley.de/",
"status": "ok",
"httpStatus": 200,
"error": null,
"companyName": "Marley Deutschland GmbH",
"language": "de",
"primaryEmail": "info@marley.de",
"emails": ["info@marley.de"],
"emailDetails": [{ "email": "info@marley.de", "type": "generic", "onDomain": true, "foundOn": "https://marley.de/pages/contact" }],
"primaryPhone": "+495031530",
"phones": ["+495031530", "+4950315337"],
"linkedinUrl": "https://www.linkedin.com/company/marleydeutschland",
"xUrl": null,
"facebookUrl": "https://www.facebook.com/marleydeutschland",
"instagramUrl": "https://www.instagram.com/marley_deutschland",
"tiktokUrl": "https://www.tiktok.com/@marleydeutschland",
"youtubeUrl": "https://www.youtube.com/@marleydeutschland",
"otherSocialLinks": [],
"contactPageUrl": "https://marley.de/pages/contact",
"contactFormUrl": null,
"legalNoticeUrl": "https://marley.de/policies/legal-notice",
"pagesRead": 4,
"billable": true,
"aiEnriched": true,
"aiCompanyName": "Marley Deutschland GmbH",
"aiSummary": "Makes roof drainage and ventilation systems for builders and roofers in Germany.",
"aiIndustry": "manufacturing",
"aiBusinessModel": "b2b",
"aiOfferings": ["roof drainage", "ventilation systems"],
"aiCountryCode": "DE",
"aiCity": "Wunstorf",
"aiAddress": "Adolf-Marley-Weg 1, 31515 Wunstorf",
"aiError": null,
"scrapedAt": "2026-10-26T09:12:00.000Z"
}
  • status: ok (at least one email, phone or social profile; charged), no_contacts (read, nothing found; free) or error (not read; free, with the reason in error, e.g. HTTP 403 (the site blocks automated visits)).
  • emails and phones are ranked best first; primaryEmail and primaryPhone are the first of each. emailDetails says whether each email is a role inbox (generic) or a person's (personal) and whether it is on the site's own domain.
  • otherSocialLinks lists Pinterest, GitHub, Threads, Bluesky, Telegram, WhatsApp, Discord, Snapchat, XING and Vimeo profiles, and extra profiles of the six main networks.
  • companyName, description, address and countryCode come from the site's own markup; the ai* fields are estimates by Claude Haiku from the pages read.
  • Dataset views: Contacts, Social, AI, Errors. The run's key-value store has a SUMMARY record (websites by status and failure reason, pages read, charged events, AI usage).

Pricing

Pay per event:

EventFree planStarterScaleBusiness
Website with contacts (rows with billable: true)$0.006$0.006$0.0048$0.0036
Website enriched with AI (rows with aiEnriched: true, only when aiEnrichment is on)$0.003$0.003$0.0024$0.0018
Actor start (Apify's standard start fee)$0.00005$0.00005$0.00005$0.00005

The price is per website, whatever the number of pages read. For example, 1,000 websites of which 780 have contacts cost $4.68 on the Free plan, or $7.02 with AI fields. Free: websites with no contact found, websites that could not be read, entries that are not a website, repeated websites, and AI enrichment that failed. Set a maximum cost per run in the run options; the Actor stops cleanly when it is reached, and a website whose AI charge no longer fits is saved without the AI fields.

Your responsibility for personal data

The Actor reads only public pages of the websites you give it and does not look up people. Some results can still be personal data: an email or phone number of a named employee or a sole trader, or a personal LinkedIn profile. Under the GDPR and similar laws you need a legal basis to collect and use such data, and direct-marketing rules (such as the ePrivacy rules in the EU, CAN-SPAM in the US) apply to what you send. You are responsible for how you use the results. Turn off includePersonalContacts to keep only role inboxes and company profiles.

Limits

  • Only public pages, over plain HTTP: sites that build their content with JavaScript only, or that block automated visits (HTTP 403), give an error or no_contacts row, free.
  • At most 10 pages per website, on the same site (subdomains included).
  • Phone numbers are kept only when valid for the region; numbers written without a country code on a site with no country hints are read as US numbers.
  • No email verification and no names of people.
  • Local network and cloud metadata addresses are always blocked.