Disclosure: I publish the Apify actor tested below (pennydata/website-contact-extractor) and earn a fee when it runs. This post was written with AI assistance (Claude). It is a small benchmark of my own tool, not a neutral comparison.
I wanted to know how often a plain-HTTP contact extractor actually finds something on real business sites, so I ran it on 20 of them and kept the misses.
Result in one line: on 20 public company homepages, 17 loaded and 3 returned HTTP 403. Of the 20, a contact page was found on 13, a contact form URL on 4, at least one public email on 10, a phone on 4, and a social link on 15.
Method
- Tool: the actor's own source code, run locally with Node (
tsx src/main.ts), one process per domain, default settings. No Apify run, no proxy, no browser. robots.txt respected (default). - Input: the bare domain only. The extractor reads the homepage plus up to two same-site contact/about pages and probes
/contactand/contact-usif none is linked. - Sample: 20 company sites I picked by hand: 6 SaaS, 4 agencies, 5 local/independent shops, 5 nonprofits. Not random, and small: treat every percentage as "about 1 in N", not a statistic.
- Recorded per domain: contact page found (y/n), contact form URL found (y/n), count of emails, phones and social links, wall-clock seconds, errors. Runtime includes about a second of Node/tsx start-up because each domain was its own process.
- I did not check correctness of the emails or phones, only that they were found. I am not publishing any address; the CSV holds counts only.
- Run on 2026-10-24 from a single IP.
Results
| Sites | Found | |
|---|---|---|
| Loaded without error | 20 | 17 |
| Contact page URL | 20 | 13 |
| Contact form URL | 20 | 4 |
| At least one email | 20 | 10 (29 emails in total) |
| At least one phone | 20 | 4 (10 phones in total) |
| At least one social link | 20 | 15 (64 links in total) |
By category (contact page / form URL / has email):
| Category | Sites | Contact page | Form URL | Has email |
|---|---|---|---|---|
| SaaS | 6 | 6 | 1 | 3 |
| Agency | 4 | 3 | 2 | 2 |
| Local shop | 5 | 1 | 1 | 2 |
| Nonprofit | 5 | 3 | 0 | 3 |
Runtime for the 20 runs: 1.4 to 3.9 s each, 50.9 s in total, 2.55 s mean (2.72 s mean over the 17 that loaded).
The failures
- 3 of 20 returned HTTP 403 (powells.com, bluebottlecoffee.com, kiva.org). A plain HTTP client with no browser and no proxy gets blocked by some bot protection. The actor reports them as errors and does not charge for them. If your list is full of bigger retail or nonprofit sites, expect misses like this.
- Only 4 of 20 gave a contact form URL. Two more sites (zingermans.com, doctorswithoutborders.org) have a form somewhere (it was detected as an HTML form) but not on a page the actor identified as the contact page, so the form URL field stayed empty.
- thoughtbot.com: no contact page found, even though 2 phones and 3 social links were found. Contact-page detection misses sites whose contact link is not a standard path or anchor text. I did not investigate further.
- Local shops were the weakest group: a contact page on 1 of 5, and 2 of the 5 were blocked outright (HTTP 403).
- posthog.com and buffer.com: contact page found but 0 emails. Many SaaS sites route everything through forms or support portals, so "no email" is often correct, not a bug.
- JavaScript-rendered pages are out of scope for a no-browser tool.
Price
See the actor page for current pay-per-event pricing. Sites that error or are skipped by robots.txt are not charged.
Try it
https://apify.com/pennydata/website-contact-extractor
Per-domain counts (counts only, no addresses):
| Domain | Category | Contact page | Form URL | Emails | Phones | Socials | Status |
|---|---|---|---|---|---|---|---|
| linear.app | SaaS | y | n | 1 | 0 | 2 | ok |
| posthog.com | SaaS | y | n | 0 | 0 | 0 | ok |
| plausible.io | SaaS | y | n | 1 | 0 | 8 | ok |
| basecamp.com | SaaS | y | n | 2 | 0 | 0 | ok |
| buffer.com | SaaS | y | n | 0 | 0 | 4 | ok |
| sentry.io | SaaS | y | y | 0 | 0 | 2 | ok |
| thoughtbot.com | Agency | n | n | 0 | 2 | 3 | ok |
| pentagram.com | Agency | y | n | 4 | 0 | 4 | ok |
| ustwo.com | Agency | y | y | 0 | 0 | 2 | ok |
| hugeinc.com | Agency | y | y | 3 | 5 | 3 | ok |
| katzsdelicatessen.com | Local | y | y | 1 | 1 | 3 | ok |
| powells.com | Local | n | n | 0 | 0 | 0 | HTTP 403 |
| zingermans.com | Local | n | n | 2 | 2 | 3 | ok |
| vermontteddybear.com | Local | n | n | 0 | 0 | 4 | ok |
| bluebottlecoffee.com | Local | n | n | 0 | 0 | 0 | HTTP 403 |
| eff.org | Nonprofit | y | n | 6 | 0 | 4 | ok |
| charitywater.org | Nonprofit | y | n | 4 | 0 | 6 | ok |
| kiva.org | Nonprofit | n | n | 0 | 0 | 0 | HTTP 403 |
| wikimediafoundation.org | Nonprofit | y | n | 5 | 0 | 8 | ok |
| doctorswithoutborders.org | Nonprofit | n | n | 0 | 0 | 8 | ok |
If you have a site where it misses a contact page, leave a comment with the domain; those are the cases I want to fix.
Written with AI (Claude)

