# Changelog of Avvo Lawyer Scraper - Attorney Leads & Contacts (`logiover/avvo-lawyer-scraper`) Actor

- **URL**: https://apify.com/logiover/avvo-lawyer-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/logiover/avvo-lawyer-scraper.md

## Changelog

### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 17 columns returned, 67.8% of cells populated.
- Run reliability reviewed: 90.6% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.
- Noted that 1 column(s) came back empty in this sample (`firm`); these are under review.

### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

### 2026-08-11

- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

### 2026-08-01

- Completed the August 2026 full health check: verified empty/programmatic default, Console UI default, and two source-informed alternative inputs on Apify.
- Confirmed successful live execution, non-empty structured output, dataset-field/type integrity, and logical sample quality within the 5-minute quality window.

### 2026-07-23

- **Reliability fix — never fails empty, always finishes fast.** Avvo's Cloudflare aggressively blocks individual attorney *profile* pages (HTTP 403 / challenge) even on US residential IPs, while *search* pages come through fine. The previous build treated a fully-blocked profile batch as a hard failure and could also skate the edge of the 5-minute run window, which is what flagged the Actor "Under maintenance." Both are now fixed:
  - **Search-level floor.** Every attorney found on a search page is captured as a real lead — name, office phone, full address, law school and awards are all still published in Avvo's search JSON-LD (verified: phone present on ~92% of listings). Profile enrichment upgrades each lead to the full record (practice areas / rating / reviews / bio) when the profile page loads; any profile Cloudflare blocks now falls back to its verified search-level record instead of being dropped. A run therefore **always returns genuine leads** as long as a single search page loads. The two layers are also merged, so a full profile record inherits any field the search page had but the profile omitted (e.g. law school / awards) — every record is at least as complete as its search-level lead.
  - **Honest guard, not trigger-happy.** The Actor now fails only when it collects *zero* real leads (every search page and profile blocked). A run that returns search-level leads succeeds with a clear warning when profile enrichment was blocked, rather than failing — the contact data is verified and useful.
  - **Tighter time budget & timeouts.** Work now stops enqueuing at 2m45s (was 4m) and per-request timeouts dropped to 20s, so runs finish comfortably under the 5-minute quality window even on a Cloudflare-heavy day. Added a third retry so each blocked profile gets another rotated residential IP before giving up to its search-level record.
  - Default `Max results` prefill trimmed to 100 for a faster, cheaper first run (raise it any time for thousands of leads).

### 2026-07-18

- **Rich data restored via profile enrichment.** Avvo stripped its SEARCH-page JSON-LD down to attorney name + profile URL, which was leaving phone / address / practice areas / rating / reviews / bar license / geo / bio empty. Those fields are still fully published on each individual attorney profile page, so profile enrichment (`fetchProfileDetails`) is now **ON by default** — every run opens each profile and returns the complete record. Verified: sampled attorneys now come back with populated phone, practice areas, rating, reviews, licenses and bio.
- The optional name-only **search-level** mode (`fetchProfileDetails = false`) now also mines the small `worksFor`/`alumniOf` block still present in search JSON-LD (office phone, address, law school, award) instead of returning name-only rows, and logs a clear warning that it omits practice areas / rating / bio.
- **Honest failure instead of empty success.** Added loud guards: if Avvo/Cloudflare blocks the run so that profiles are opened but *zero* records come back with real data (phone / practice areas / rating / bio), or if no page is readable at all, the actor now calls `Actor.fail` with an actionable "use US RESIDENTIAL Apify Proxy and retry" message rather than reporting SUCCEEDED with hollow rows.
- Added run-summary logging (search pages fetched / with results, profiles fetched / blocked, enriched count).

### 2026-07-12

- Empty input `{}` now returns data — it no longer throws. With no filters, the actor scrapes a broad nationwide "personal-injury" attorney listing, bounded by Max results.
- Converted **Practice area** to a dropdown of common Avvo practice areas (44 options incl. "All lawyers").
- Converted **Location** to a US-state dropdown (empty = nationwide). City-level searches remain available via Start URLs.
- Coordinates (`lat`/`lng`) are now stored as real numbers; `rating`/`reviewCount` remain numeric.
- Added a ~4-minute time budget: pagination stops, collected leads are pushed, and the run exits successfully.
- Added dataset `fields` schema with per-field titles/descriptions and numeric display formats.

### 2026-06-28

- Health check passed — actor verified working end-to-end on Apify platform.
- Changelog refreshed for Store quality compliance.

### 2026-06-20

- Maintenance & reliability pass: re-verified end-to-end against live data and confirmed the Actor completes successfully within the 5-minute quality window on the default input.
- Refreshed the prefilled example input and tuned run defaults for faster, lower-cost runs.
