# Changelog of French Real Estate Agents · Multi-Network CRM (`corent1robert/fr-realty-agents-hub`) Actor

- **URL**: https://apify.com/corent1robert/fr-realty-agents-hub/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/fr-realty-agents-hub.md

## Changelog

All notable changes to this Actor are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/).

### \[1.15] - 2026-08-24

#### Changed

- Also available no longer links to retired eXp / Espaces Atypiques standalones — those brands run in this hub.

### \[1.14] - 2026-08-20

*Apify actor version: 1.14*

#### Changed

- README: Console is **multi-select** (not one brand per run). Fill-rate table uses a **measured** 25-row cloud sample (20 Aug 2026).
- Console: **How many advisors per brand** (was “How many rows”) — **not** per agency. **0** = full directory of each ticked brand.

#### Fixed

- **eXp France** reads the public [findanagent](https://www.expfrance.fr/findanagent) directory. The old Supabase table now returns permission denied (0 rows).
- **IAD France:** proxy CONNECT timeout raised (Undici default 10s) and transient fetches retry with a new proxy IP. Profile misses are logged as one count, not one line per slug.
- **Espaces Atypiques:** **How many rows** caps **advisors**, not office pages. Agency-inbox rows without a name are skipped.
- **Les Porteclés:** `countryCode` is `FR` (ISO), not the word `France`.

### \[1.13] - 2026-08-20

*Apify actor version: 1.13*

#### Added

- Console **Brands** is a **multi-select**. Tick IAD + KW + SAFTI (or any mix) in one run; same CRM columns. **How many rows** applies **per brand**.

#### Changed

- Legacy API field `network` (string) still works for published examples and older tasks. Prefer `networks` (array) for new runs.

### \[1.12] - 2026-08-20

*Apify actor version: 1.12*

#### Changed

- Console form: **Brand** + **How many rows** only. BARNES country / uniqueness / office URLs are API-only (defaults: France, one row per advisor).
- Brand list ordered by network usefulness for CRM (IAD → KW → SAFTI → eXp → BARNES → … → Les Porteclés).

### \[1.11] - 2026-08-20

*Apify actor version: 1.11*

#### Added

- **Pay-per-event** based on the best contact on each saved row: email · WhatsApp (BARNES, same rate as the dedicated Actor) · phone without inbox · name/profile only. Empty pages are never billed.

### \[1.10] - 2026-08-20

*Apify actor version: 1.10*

#### Added

- **13 published Store examples** (eXp CRM, IAD, KW, SAFTI, BARNES FR/CH/US, Espaces, megAgence, Sextant, IAD Île-de-France, Efficity, BSK) — Try caps at 25 rows.

#### Changed

- Console **Brand** options now show typical contacts in parentheses (e.g. Les Porteclés: email/phone rare).

### \[1.9] - 2026-08-20

*Apify actor version: 1.9*

#### Added

- Dataset view **Outreach / CRM** (first / last name, email, phone, WhatsApp E.164, office URL).
- Console **How many rows** (prefill 25, `0` = full directory).

#### Changed

- Store README rewritten for buyers (persona table, Quick start above the fold, honest fill rates, pricing, legal, BARNES vs hub positioning).
- BARNES country / rows / office URLs sit in a **collapsed Console section** (Apify cannot hide fields with `enableWhen`) — ignored unless Brand is BARNES. **How many rows** is now the second section so first runs stay Brand + 25.
- Input form copy is outcome-first. Standalone BARNES Actor is the WhatsApp-only product; this hub is the multi-brand table.

### \[1.8] - 2026-08-20

*Apify actor version: 1.8*

#### Added

- **Network:** `barnes` — BARNES luxury office teams (France by default, or any of 24 countries). WhatsApp when published (`phoneE164` / `extra.whatsapp`); personal email is never on the cards. Runner `src/lib/runners/barnesInternational.js`; parsers vendored in `src/lib/barnes/` from `barnes-international-agents`. Console: brand last in the list; country / unique vs every-office / optional office URLs at the bottom of the form. Canonical mapping: `fromBarnes`.

#### Changed

- Dataset **Overview** view includes `phoneE164` (WhatsApp on BARNES, E.164 phone on other brands when present).

### \[1.7] - 2026-08-17

#### Changed

- **Store positioning** — this hub is the maintained listing. Standalone brand Actors (IAD, eXp, SAFTI, KW, …) are deprecated and point here.
- **README** — migration table: old Store URL → `network` value.

### \[1.6] - 2026-04-26

#### Added

- **Network:** `espaces_atypiques` — Espaces Atypiques (French agency sitemap + optional `ventes/` listing fallback). Runner `src/lib/runners/espacesAtypiques.js`; HTML extractors vendored in `src/lib/espacesAtypiquesLib/` (sync from `espaces-atypiques-agents-scraper`). Canonical mapping: `fromEspacesAtypiques`. Input options: `mode`, `startUrls`, `maxAgencies`, `maxListingPages`, `listingConcurrency` (plus hub `maxResults` / `listConcurrency`).

#### Changed

- **Espaces Atypiques:** `maxListingPages` default and prefill are **`0`** (no cap); omitted `maxListingPages` in API input matches that (same as standalone actor).
- **Espaces sitemap (hub):** office-page limit follows **Max rows** when `maxAgencies` is 0 (same pattern as IAD / eXp / Efficity list mode). `maxAgencies` 1+ overrides. URL mode does not apply **Max rows** to `startUrls` (same idea as Efficity URL mode).
- **Console form:** `mode` and `startUrls` removed from `input_schema.json` (still accepted via `additionalProperties` and documented in README). Default run is **sitemap = full** French agency list in code; use `"mode": "urls"` in Input JSON for agency URLs only.

### \[1.5] - 2026-04-26

#### Added

- **Network:** `efficity_france` — Efficity national consultant directory and profile pages; `fromEfficityFrance` in `canonical.js`, runner `efficityFrance.js`, extract in `lib/efficity/extract.js`. Same URL-only mode as other brands: `directoryMode` / `mode` + `profileStartUrls` (or `startUrls` / `efficityStartUrls`).

#### Changed

- **Store (`actor.json`):** `description` rewritten to stay within Apify’s 300-character limit while keeping benefit-first, outcome-oriented copy; full nuance and contact for custom work remain in the README.

### \[1.4] - 2026-04-04

#### Added

- **Network:** `iad_france` — advisor list from `iadfrance.fr` public sitemap and agent API; unified via `fromIadFrance` in `canonical.js`. Optional Input JSON filters: `filterRegion`, `filterPostalCode`, `filterMinPropertyCount`, `filterMaxPropertyCount`, `filterMinReviewsCount`.

### \[1.3] - 2026-04-04

#### Added

- **Networks:** `sextant_france` (map + optional `startUrls` / `profileStartUrls`) and `kw_france` (full list or `directoryMode` + `profileStartUrls` for specific profiles).
- Extract modules vendored from the standalone `sextant-agents-scraper` and `kw-france-conseillers` projects (pure JS).

### \[1.2] - 2026-04-04

#### Fixed

- **Input schema:** removed `directoryMode` / `profileStartUrls` from declared properties — Apify Cloud rejects `editor: "hidden"` on enum fields. Advanced options remain available via Input JSON / API (`additionalProperties: true`).

### \[1.1] - 2026-04-04

#### Added

- **Networks:** `les_portecles`, `safti_france`, `bsk_immobilier` with the same canonical schema as existing sources.
- **Input:** optional `directoryMode` (`list` | `urls`) and `profileStartUrls` for supported brands; legacy `lfImmoMode` / `lfImmoStartUrls` still work when passed in raw JSON.

#### Changed

- **Console input:** shorter copy; **directoryMode** / **profileStartUrls** are not part of the Console form (Apify does not allow `hidden` on enum fields). Default remains full public directory; profile-only mode via API or Input JSON (`additionalProperties`).

### \[1.0] - 2026-04-04

#### Added

- Initial release: single Actor with **network** selector (`exp_france`, `megagence`, `lf_immo`).
- **Canonical dataset schema** shared across networks; optional fields omitted when a source does not publish them; `extra` for network-specific keys (`sourceId`, `slug`, etc.).
- README coverage table per network.
