# Changelog of Ameli Health Directory · Practitioners by Specialty & City (`corent1robert/ameli-practitioners-scraper`) Actor

- **URL**: https://apify.com/corent1robert/ameli-practitioners-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/corent1robert/ameli-practitioners-scraper.md

## Changelog

All notable changes to this Actor are documented here.
Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)

***

### \[1.4] — 2026-09-03

#### Fixed

- Store **Try** / 5-minute timeout no longer looks like a site outage: a France-wide GP scan needs **15–30 minutes**. The Actor now warns when Run options timeout is too short, and **saves tile progress** so resurrect continues instead of restarting.
- Default Console location is **by department** (Paris 75) with **maxResults 50** so Store Try and daily quality checks finish within 5 minutes (clears the Under maintenance flag). Nationwide remains available; raise timeout to 30 minutes and clear the cap.
- Concurrency log now matches the actual number of specialties in the run.

***

### \[1.3] — 2026-06-05

#### Changed

- **README — Also available** — cross-links to French Accountants, Notaires, companies, and Houzz directories.

***

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

#### Added

- **Adaptive tiling** — tiles returning ≥ 2 000 results are automatically split into 4 sub-tiles (down to 0.18°); eliminates the "long tail" on dense urban areas (Paris was taking 15s alone)
- **Constant-width worker pool** — replaces batch loop; a new tile starts the instant a slot frees, no batch-boundary idle time
- **ETA in progress line** — `[==========----------] 50% | 147/294 areas | 11 527 collected | ETA 38s`
- **Profession labels in logs** — all log lines show the human-readable specialty name, not the internal ID
- **`tileSize` hard cap** — values above 0.7° are silently clamped; Ameli API returns HTTP 500 for tiles wider than ~1.0°

#### Changed

- Default `concurrency` raised from 8 to 25 simultaneous tile workers
- Default `tileSize` is 0.7° (API-enforced maximum); adaptive split handles dense zones automatically
- Console input `profession` is now a single-select (string); multi-specialty runs use `professions` array via API/JSON
- `locationMode: "city"` removed from Console UI — department codes are unambiguous and cover all cases
- Progress logged every ~5% of total work (was every 3 batches) to reduce log noise on parallel runs
- Status message updated on every tile completion for live feedback
- Timeout per tile raised to 30s (was 8s) to handle large-payload tiles before adaptive split kicks in

#### Fixed

- HTTP 500 on tiles with longitude ≤ 0 was a red herring — root cause was tile width > 1.0°; fixed by hard cap
- `tileSize: 1.4` passed via API no longer causes mass 500 errors

***

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

#### Added

- **Multi-specialty input** — `professions` array lets users collect several specialties in one run (merged, deduplicated)
- **Multi-department input** — `departments` array replaces single `department` field; supports any number of codes
- **City-level search** — new `locationMode: "city"` resolves common French cities to a geographic bounding box automatically
- **`hasPhone` filter** — keep only practitioners with any phone number listed
- **`acceptsCarteVitale` filter** — keep only practitioners who accept the French health card
- **Parallel tile fetching** — `concurrency` input (default 8) runs batches of tiles in parallel via `Promise.all`; 4–8× faster on large runs
- **RUN\_LOG** — live progress log written to Apify KV store (`RUN_LOG` key); flushed every 15 lines and on exit
- **`setStatusMessage`** — real-time status visible in the Apify Console run header
- **ASCII progress bars** in run log — `[====------] 42%` per specialty
- **`verboseLogs` input** — gate technical detail (HTTP paths, per-tile traces) behind a flag; default output is outcome-only
- **Modular architecture** — `src/lib/tiles.js`, `src/lib/api.js`, `src/lib/flatten.js`, `src/lib/runLog.js` — pure helpers, unit-testable without network
- **Dataset view "Contacts"** — focused export: name + phone + address columns only
- **`.apifyignore`** — excludes `storage/`, `output.csv`, local secrets from push bundle
- **`CHANGELOG.md`** wired in `actor.json`

#### Changed

- `profession` (single string) still accepted for backward compatibility; mapped to `professions: [value]` internally
- `department` (single string) still accepted; mapped to `departments: [value]` internally
- Input schema restructured as step-by-step sections (Step 1: specialty → Step 2: location → Step 3: filters → Advanced)
- All Console-facing copy rewritten as benefit-first (no HTTP codes, no internal path references)
- `actor.json` title updated to `·`-separated clauses pattern; description ≤300 chars
- Dockerfile base image confirmed as `apify/actor-node:24` (HTTP-only, 512 MB default)

#### Fixed

- Progress log no longer emits one line per tile (was flooding Console on large France-wide runs)
- `fetchTile` now properly consumes response body on error status to avoid connection leak

***

### \[1.0] — 2026-03-01

#### Added

- Initial release — geographic tile-based scraping of `annuairesante.ameli.fr`
- Single specialty + single department or France-wide coverage
- Filters: `mobileOnly`, `liberalOnly`, `maxResults`
- `tileSize` input for tile density control
- Department bounding box map (all 96 metropolitan departments + 5 DOM-TOM)
