Website Contact Scraper - Emails, Phones & Socials
Pricing
from $2.00 / 1,000 domain inspecteds
Website Contact Scraper - Emails, Phones & Socials
Paste company domains or website URLs. Get one contact record per company with public emails, phones, social profiles, MX status and the page where each email was found.
Pricing
from $2.00 / 1,000 domain inspecteds
Rating
0.0
(0)
Developer
Vadim Bezrukov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
Paste company domains. You get one contact record per company: public emails, phone numbers and social profiles, with an MX check and the page where each email was found.
Use it after a Google Maps, directory or CRM export, when the next step is a spreadsheet, a CRM or an outreach workflow. You do not need a second job to merge the homepage, contact page and about page into one row, and you do not need a separate MX lookup for the addresses the site actually published.
This Actor reads public HTML over HTTP. It does not open a browser, log in, guess addresses, or build emails from people's names. HAS_MX means the email domain publishes mail servers. It does not mean the mailbox exists, and a role label such as sales does not prove who reads that inbox.
Run it
{"websites": ["python.org", "https://www.iana.org/"],"maxPagesPerSite": 5,"includePhones": true,"includeSocials": true,"checkMx": true}
The default input is python.org. The run returns one Dataset row for that domain with each public email it found, the page the email came from and its MX status. On another domain, NO_CONTACTS is a finished inspection with nothing public to keep. It is not a failed download.
For an agent or API run, set maxTotalChargeUsd to at least $0.01 plus $0.002 for each domain you expect to inspect. At the default 512 MB the start event is $0.01. That cap is the event bill. Platform usage is included.
What you get
Each row is one registrable domain. example.com, www.example.com and https://example.com/?utm_source=x are the same target. The original string stays in input. domain is the public-suffix domain. homepageUrl is the final homepage after ordinary redirects.
Emails include sourceUrl, sourceType, role and mxStatus. mxStatus is HAS_MX, NO_MX, DNS_FAILED or NOT_CHECKED. Phones are parsed numbers, not raw digit strings. Social profiles are organization links the site published. Share, intent and login URLs are left out. address is the postal address from the site's Organization or LocalBusiness structured data, or its first HTML address block, and is null when the site publishes none.
Status
| Status | Meaning | Charged |
|---|---|---|
| SUCCESS | Pages loaded and at least one email, phone or social profile was found | Yes |
| NO_CONTACTS | Pages loaded and none of those were found | Yes |
| PARTIAL | At least one page loaded, and a later page failed | Yes |
| BLOCKED | HTTP 401, 403, 429, a challenge page, or robots.txt disallows the homepage or the page a redirect landed on. A disallowed subdomain page is skipped and does not block the domain | No |
| DOWNLOAD_FAILED | DNS, timeout, or HTTP 5xx after retries | No |
| INVALID_DOMAIN | Not a public http(s) website, including private and metadata addresses | No |
| NOT_INSPECTED | The spending limit or the run's time limit was reached before this domain was saved. error says which | No |
One bad domain does not fail the batch. The run fails only when the input envelope is invalid, the Dataset cannot be written, or billing cannot be reconciled.
Run it again
Run the same saved list next week when you want a fresh observation, or paste the next batch of domains from your CRM. fingerprint changes when the published contacts change. An MX result that flips between HAS_MX and DNS_FAILED does not change it. It is set only for SUCCESS and NO_CONTACTS, where the selected pages were read. PARTIAL, BLOCKED, DOWNLOAD_FAILED, INVALID_DOMAIN and NOT_INSPECTED rows have fingerprint: null, so a week the site could not be read never looks like a contact change. Keep the last complete row in that case. A weekly schedule of a domain list is the usual second run. There is no separate monitor mode in this version.
{"websites": ["python.org", "https://www.iana.org/"]}
In Apify, open Schedules and run that input once a week. On the run's webhook, choose a successful finish and post the Dataset to your CRM or sheet. Compare fingerprint with the previous row for the same domain.
What changed is in the CHANGELOG.md.
Limits
Up to 2,000 domains per run. The default spending limit of $1 covers about 495 inspected domains. For a full 2,000-domain list, raise maxTotalChargeUsd to $4.01. Domains past the limit are NOT_INSPECTED and not charged. A run also stops starting new domains two minutes before its timeout, so a long list ends with the inspected rows saved and the rest NOT_INSPECTED, and timeLimitReached is true in RUN_SUMMARY. On staging, 100 large organization sites took about 2.5 minutes at the default 512 MB. For lists of more than 1,000 large sites, give the run more memory or time, or split the list. Each site is the homepage plus a few same-site contact, about, impressum or support links, at most 8 pages and 5 by default. The Actor does not crawl the whole site.
It follows redirects, including http to https. If the bare domain does not serve a page, the www host is tried, and a www host that redirects to the apex is followed. Redirects into private, loopback or link-local addresses are refused. If the homepage lands on a different registrable domain, only that landing page is read. A later link that leaves the domain is skipped. Residential proxy is not part of the product. Leave proxy disabled unless a datacenter Apify Proxy is specifically required. When that proxy is on, the connection uses the address from the DNS check, not a later answer for the same name. If the proxy cannot be created, the run continues over a direct connection and says so.
If robots.txt disallows a URL for a normal browser user agent, that URL is not read. This is checked for the homepage, for a host reached by a redirect, and separately for a subdomain. A disallow of the homepage or of the landing page is BLOCKED, and that row is not charged. A disallow of a later subdomain page skips that page only. The skipped URL is listed in robotsSkipped, and the row stays SUCCESS or NO_CONTACTS.
Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.01 | Once per run at 512 MB |
Domain inspected (domain-processed) | $0.002 | Once per unique domain that was actually inspected |
NO_CONTACTS is charged because the pages were fetched and read. Duplicates, invalid inputs, blocked sites, download failures, retries and spending-limit leftovers are not charged. The event price includes platform usage.
Privacy and lawful use
The Actor collects contact details that the submitted website displays in public HTML, mailto: and tel: links, or structured data. It does not enter accounts, bypass access controls, or enrich people from a third-party database.
You are responsible for the lawful basis of any later outreach and for anti-spam and privacy rules that apply to you. A public page does not, by itself, make every later use lawful. Do not submit websites you are not allowed to request.
MCP
Agents can call this Actor directly:
https://mcp.apify.com?tools=automa-flow/website-contact-enricher
Ask it to turn a list of company domains into one contact record per domain, including the source page for each email and the MX status. Read RUN_SUMMARY before treating a partial batch as complete. Direct execution uses the caller's Apify account. Anonymous search is a separate discovery check and does not run the Actor.
Fields
examples/sample_output.json shows the row shape. It is an illustration of the fields, not a captured live run. schemaVersion is 1. Added fields will not rename these.