Website Contact Scraper: Emails, Phones, Socials + AI
Pricing
from $3.60 / 1,000 website with contacts
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
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.
primaryEmailis 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
inputordomain. - Contact-form outreach.
contactFormUrlis a page with a real contact form;contactPageUrlis 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
| Field | Description |
|---|---|
websites | One 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. |
maxPagesPerWebsite | Pages read per website, home page included (default 5, at most 10). The price does not depend on it. |
includePersonalContacts | Also 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. |
defaultPhoneRegion | Two-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. |
aiEnrichment | Add the AI company fields (default off). Charged per enriched website. |
respectRobotsTxt | Skip pages robots.txt disallows (default on). |
maxConcurrency | Websites read at the same time (default 10). |
requestTimeoutSecs | Time limit per page (default 20 s). |
proxyConfiguration | Optional 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) orerror(not read; free, with the reason inerror, e.g.HTTP 403 (the site blocks automated visits)).emailsandphonesare ranked best first;primaryEmailandprimaryPhoneare the first of each.emailDetailssays whether each email is a role inbox (generic) or a person's (personal) and whether it is on the site's own domain.otherSocialLinkslists Pinterest, GitHub, Threads, Bluesky, Telegram, WhatsApp, Discord, Snapchat, XING and Vimeo profiles, and extra profiles of the six main networks.companyName,description,addressandcountryCodecome from the site's own markup; theai*fields are estimates by Claude Haiku from the pages read.- Dataset views: Contacts, Social, AI, Errors. The run's key-value store has a
SUMMARYrecord (websites by status and failure reason, pages read, charged events, AI usage).
Pricing
Pay per event:
| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
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
errororno_contactsrow, 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.