# Changelog of Contact Details Scraper: Google Maps Leads to Emails & Phones (`jfaro19/website-contact-finder`) Actor

- **URL**: https://apify.com/jfaro19/website-contact-finder/changelog.md
- **Full Actor documentation**: https://apify.com/jfaro19/website-contact-finder.md

## Changelog

### 0.2.1 (2026-10-17, Apify build 0.1.12)

- Clear failure messages when there's nothing to process: empty input, entries that aren't websites (with examples), an empty dataset, or a dataset without the website field (lists fields that look like websites).
- A dataset that can't be read (wrong ID or no access) now fails with an explanation instead of a crash.
- Websites given as objects (`{"url": "..."}`) are accepted.

### 0.2 (2026-10-10, Apify build 0.1.11)

#### Added

- **Email verification (paid add-on):** `verifyEmails`, `verifyAllEmails` and an optional `millionVerifierApiKey` (secret).
  - Verified emails get an `emailVerification` object (`result`, `subResult`, `isCatchAll`, `isDisposable`, `isRoleBased`, `provider`, `checkedAt`). There's also a flat `primaryEmailVerification` column.
  - The new `email-verified` event is charged only for decisive results (valid, invalid, disposable). Catch-all, unknown, timeouts and errors are free, and there's no charge when the user supplies their own key.
  - Each address is verified at most once per run.
  - The provider is retried with exponential backoff and disabled for the rest of the run after a fatal error (bad key, no credits) or 5 failures in a row. Scraping always continues.
  - Verification reserves budget so it never uses the run's max charge needed for website charges; when the limit is close it stops verifying and keeps scraping.
- **Browser fallback for JavaScript-built sites:** `browserFallback` (default on) and `maxBrowserPagesPerWebsite` (default 2).
  - When a homepage looks like an empty app shell (an empty `#root`/`#__next`/`#app`, very little visible text, or framework markers on a thin page) and plain HTTP found no contacts, the homepage and its likeliest contact pages are rendered in headless Chromium.
  - Browser pages have their own concurrency limit sized to the run's memory, plus hard per-page and per-site timeouts.
  - New output field `renderedWithBrowser`.
- **Diagnostics:**
  - `noContactReason` on every website without contacts: `js_rendered`, `blocked`, `timeout`, `unreachable`, `redirect_offsite`, `contact_form_only`, `no_contacts_published` or `error`.
  - Bot-protection pages ("Just a moment…") are now treated as blocked instead of as content.
  - A `RUN_SUMMARY` key-value record with aggregate counts and no personal data.
  - An informative final status message.
- A **Leads** dataset view: business name and category, best email, verification result, phone, website, socials and address.
- `tests/`: 47 tests covering the verification provider (mocked), the charging rules and the JavaScript-shell detector, plus 5 JavaScript-built sites rendered end to end in Chromium.

#### Changed

- Title: "Contact Details Scraper: Google Maps Leads to Emails & Phones". The README was rewritten around the Google Maps lead-list workflow.
- Docker image is now `apify/actor-python-playwright` and the default memory is 2 GB.

#### Unchanged

- No existing output fields were renamed or removed, and the price per website with contacts is unchanged.

### 0.1.10 (2026-10-09)

- README: "Use it in n8n" section.
