# Changelog of Espaces Atypiques Agents · Names, Phones & Emails (`corent1robert/espaces-atypiques-agents`) Actor

- **URL**: https://apify.com/corent1robert/espaces-atypiques-agents/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/espaces-atypiques-agents.md

## Changelog

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

### \[1.16] - 2026-08-27

#### Fixed

- Store Try: prefill **URLs** mode with one Paris agency page and `maxResults` **15**, stop ~40s before platform timeout in the page pool, and exit **0** when start URLs are missing.

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

#### Changed

- Store listing is live again: title, SEO and README are the product (emails / phones / CRM), not a retired-hub redirect. `isDeprecated` cleared on the platform.

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

#### Changed

- Store title is **Espaces Atypiques Agents · Names, Phones & Emails** (no longer the retired-hub placeholder).

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

#### Changed

- Store listing retired: use [French Real Estate Agents hub](https://apify.com/corent1robert/fr-realty-agents-hub) with `network=espaces_atypiques`.

#### Fixed

- **`maxResults` caps advisors**, not office pages. `maxAgencies` still limits how many agency pages are opened. Rows with no person name (agency inboxes) are skipped.

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

#### Changed

- **Input defaults:** `maxAgencies` and `maxListingPages` prefill / schema default are `0` (no cap). Omitted `maxListingPages` in API runs now matches that behavior (was 40 before). README documents `maxListingPages` and `listingConcurrency` in the input table.
- **Sitemap cap (parity with `fr-realty-agents-hub`):** optional **API-only** `maxResults` — when `maxAgencies` is 0, sitemap mode uses `maxResults` as the office-page limit (same as the hub’s **Max rows**). Set `maxAgencies` to 1+ to override. **URLs mode** does not trim by `maxResults`; `maxAgencies` > 0 can cap the pasted URL list.
- **Local CSV export:** rows sorted by `agencyPath` (then last name, first name, email); fixed column set (no `Extra: …` columns); `sourceKey` moved to the last column; Role category column removed from CSV (still present on dataset JSON). `agencyUrlRegion`: first path segment is always set (single-segment URLs repeat the city slug in the area column).

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

#### Changed

- **Dataset / CSV:** only rows with a **non-empty email** are pushed; people discovered without an address are excluded and counted in the run log.

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

#### Added

- **ETA** on progress lines: estimated remaining time for the agency phase (`Offices done`) and for long **Saving** batches, from average time per unit so far.

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

#### Added

- `**maxListingPages: 0`\*\* (no cap on how many `ventes/…` fiches to open in listings fallback) with a high internal limit on WordPress list-page walks to avoid runaway loops.

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

#### Added

- **Phone:** all numbers are normalized to `**+33 X XX XX XX XX`\*\* (spacing, `06…` / `04…` / dots / `tel:` handled; non-French or unparseable strings are left as-is).

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

#### Added

- **Name columns:** `firstName` and `lastName` are formatted before saving (French locale) — prénom in title case, nom de famille in uppercase. `fullName` is recomputed as `Prénom NOM`.

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

#### Added

- **CTA `pl` filter:** forms that submit to `/ventes/?pl=…` (e.g. “115 biens à découvrir”) expose a location id (`pl=521`). The Actor reads that id, then walks `**/ventes/?pl=…`\*\* and `**/ventes/page/N/?pl=…**` (WordPress pagination) to collect **all** listing URLs on the public HTML, up to `**maxListingPages`\*\*, merged with links from the home grid.

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

#### Fixed

- **Listing fallback:** some agency home pages (e.g. Vendée La Roche-sur-Yon) expose properties under `**#biens`\*\* / `#last.annonces`, not `#annonces-localisations`. The collector now scans `#annonces-localisations`, `#biens`, and `.biens-localisation`.
- **Vente URL filter:** slugs that end with an alphanumeric ref (`-5332`, `-lry5056`, `-SA5047`) are accepted, not only `-digits` patterns.

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

#### Changed

- **No `/collaborateurs/` fetch:** that URL often redirects to the national team page; the Actor no longer requests it.
- **Listings fallback:** when the agency home has no `#equipe-trombi` / `.preview-collaborateur` team block, the Actor collects links to `ventes/…` sale pages from `#annonces-localisations`, then parses each **listing**’s negotiator card (`.header-nego` / `.contact-nego`: name, role, phone, `mailto` including when hidden in an HTML comment). Rows are deduped by email within the office. New inputs: `maxListingPages` (default 40), `listingConcurrency` (default 6).

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

#### Fixed

- **Per-agency teams:** `…/collaborateurs/` under an agency path often **301-redirects** to the site-wide `https://www.espaces-atypiques.com/collaborateurs/` page (same 24 people everywhere). The Actor now follows redirects, detects that national URL, and **does not** treat that HTML as the local team. Extraction uses the **agency home** when the trombi is in the first response (e.g. `/savoie/` with several cards). Offices with no people in static HTML and only the national collaborateurs page yield **0 rows** for that office (honest) instead of wrong duplicates.

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

#### Added

- **Location / office context:** each row includes `agencyName` (resolved from the page title or, when the title is generic like “Nos collaborateurs”, from the URL slug), `agencyNameRaw`, `agencyPath`, `agencyUrlRegion`, and `agencyUrlCitySlug` for filtering and CRM joins.
- **CSV:** same fields exported (semicolon-separated local file).

#### Fixed

- **Logs:** progress shows a **running total** of unique rows (`unique rows` / `unique in run`), per-office lines show `+N new`, `M on page`, and duplicate emails skipped; summary mentions skipped duplicates when applicable. Office index uses the URL path so parallel runs stay readable.

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

#### Fixed

- **Extraction:** team blocks are not always in `#equipe-trombi` in the first HTML response; the parser now takes `.preview-collaborateur` cards with a visible `mailto` when the legacy container is missing.
- **Agency subpage:** if the sitemap home page has no people, the Actor automatically fetches `…/collaborateurs/` (same path the site uses for many agencies). `agencyPageUrl` stays the sitemap office URL; `dataFetchedFrom` records the page that contained the cards when it differs.
- **Requests:** `fetch` already follows redirects (required for the collaborateurs subpage).

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

#### Added

- Initial release: load French agency pages from `agence-sitemap.xml` (via `sitemap_index.xml`) or from pasted URLs; parse `#equipe-trombi` / `.preview-collaborateur` for names, photos, job titles, phones, emails, bios.
- `band` and `roleCategory` to separate director-level titles from staff (heuristic on French job text).
- Optional Apify Proxy; local UTF-8 CSV export with semicolon separator.
