# Changelog of Keller Williams France · Advisor Phones & Emails (`corent1robert/kw-france-conseillers-scraper`) Actor

- **URL**: https://apify.com/corent1robert/kw-france-conseillers-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/kw-france-conseillers-scraper.md

### 1.3 - 2026-10-13

- Fix: KW France site migration (new /fr/ paths, JS pagination) returned 0 advisors. Full directory (~325 advisors) is back, with phones.
- Emails are no longer shown on KW profiles: `email` is deduced (firstname.lastname@kwfrance.com) and flagged `emailSource: "deduced"` (not verified).
- Legacy advisor URLs in URL mode are migrated automatically.

### 1.2 - 2026-10-11

- Fix: each exported advisor is billed with its pay-per-event; free plan capped at 20 advisors per run.

## Changelog

All notable changes to this project will be documented in this file.

### \[1.2.0] - 2026-03-09

#### Added

- **phonePro / phonePerso** — Classify French phones: 06/07 = perso (mobile), 01-05/08-09 = pro (landline)
- **Email deduction** — When no email from API/HTML, deduce from slug or name: firstname.lastname@kwfrance.com

***

### \[1.1.0] - 2026-03-09

#### Added

- **Email extraction via AgentDetail API** — POST to `/webapi/getJson/Templates/AgentDetail` with userId/hash to fetch agent emails not visible in HTML
- `isAgentEmail()` filter — keeps `*@kwfrance.com`, rejects image filenames and legal/mediation emails
- `extractEmailsFromAgentDetailApi()` — parse agent emails from API JSON response
- Unit tests for email extraction

#### Changed

- README Also available: retired eXp / Espaces Atypiques Store listings removed — use the French Real Estate Agents hub.
- Detail scraping now fetches API in addition to HTML when no mailto found
- Logs `withEmail` count when detail pages are done

***

### \[1.0.0] - 2026-03-09

#### Added

- **List mode**: scrape full advisor directory at kwfrance.com/conseillers with pagination
- **URLs mode**: enrich specific advisor profile links
- Parallel list page fetching (all pages in parallel)
- Parallel detail page scraping (30 concurrent requests, no Cheerio)
- JSON-LD Person extraction: name, role, telephone
- Fallback extraction: title, og:title, slug-derived name
- Phone formatting (French +33 format)
- Fees PDF URL and listings URL extraction
- CSV export for local runs
- Apify Actor configuration (actor.json, input_schema.json, dataset_schema.json, Dockerfile)
- Unit tests for extractors
