# Changelog of Website Contact Scraper — Bulk Emails, Phones & Socials | $1/1k (`pro100chok/extract-emails`) Actor

- **URL**: https://apify.com/pro100chok/extract-emails/changelog.md
- **Full Actor documentation**: https://apify.com/pro100chok/extract-emails.md

## Changelog

### 0.2 (2026-08-27)

- Tiered fetching: every request now goes out direct first, falls back to the
  datacenter proxy, and only reaches for the residential proxy on a website's
  first page — and only while the run's residential ration lasts.
- Response bodies are streamed and capped at 1.5 MB; non-HTML replies and error
  statuses are no longer downloaded at all.
- Per-website wall-clock budget (90s, 45s for the first page) so a stalling
  site returns what it has instead of holding the run open.
- New input option **Stop early when contacts are found** (on by default):
  crawling stops once an email on the website's own domain has been found.
- The max-pages-per-domain limit is now enforced exactly; it could previously
  be overshot by the parallel page workers.
- Alternate-TLD fallback only fires when the domain does not resolve at all,
  probes five TLDs in parallel instead of sixteen sequentially, and never uses
  a paid proxy.
- Faster failure handling: shorter request timeout, fewer retries, shorter
  politeness delay between pages.
- Much lower memory use: page markup was being serialised and re-parsed
  twice per page, which is what pushed larger runs into out-of-memory
  failures. Runs of 10+ websites are now well clear of the limit.

### 0.1 (2026-07-07)

- Initial release: bulk website contact scraper for up to 100 domains crawled in parallel.
- Extracts on-domain emails, external emails, and phone numbers per website.
- Detects profile links for 7 social platforms: Facebook, Twitter/X, LinkedIn, Instagram, YouTube, TikTok, and GitHub.
- Decodes obfuscated emails (\[at], (at), \[dot], (dot) variants and HTML/URL-encoded characters).
- Multi-page crawl with contact-page prioritization plus configurable depth and max pages per domain.
- Pay-per-result billing: domains that fail (DNS, SSL, blocked, timeout) are skipped and not charged.
- Output fields per domain: url, requestedUrl, domain, emails, externalEmails, phones, socialLinks, pagesScanned, scrapedAt.
