# Changelog of Bonnes Affaires Immo 🇫🇷 : Prix Annonce vs DVF Vendu (`tagadanar/french-real-estate-deal-score`) Actor

- **URL**: https://apify.com/tagadanar/french-real-estate-deal-score/changelog.md
- **Full Actor documentation**: https://apify.com/tagadanar/french-real-estate-deal-score.md

## Changelog

### 2026-09-23

- **The sold-price benchmark no longer counts block sales.** DVF writes a whole sale's price on every one of its lines, so a deed selling two flats entered the benchmark as two flats each at the price of both. Those sales are now left out of the median, so every deal score is measured against sales of one flat or one house only.

### 2026-08-29

- README: the pricing table now states the actual price ($0.006 per scored
  listing, so $6.00 per 1,000, plus $0.001 to start a run) and says plainly
  that Apify platform usage is included in it. It listed the events without a
  figure, which left you guessing at the cost.
- README: the six filter inputs (`minPrice`, `maxPrice`, `minSurface`,
  `minRooms`, `propertyTypes`, `keywords`) are now documented. They existed in
  the input form but the page never mentioned them.

### 2026-08-29

- Fixed: a short run timeout (180 s or less) reserved the whole budget for
  the finishing phase, so the run stopped immediately and returned nothing.
  Scraping now always keeps at least half of whatever time the run has.
- **A run that ran out of time used to deliver nothing at all.** This actor
  scrapes PAP, then downloads DVF sold prices, and only then scores, charges
  and pushes — so being cut off during the sold-price download threw away the
  entire scrape. The run now splits its own clock into three, and the scoring
  and push phase is **reserved**: a slow search or a slow benchmark costs score
  precision or coverage, never the rows. The run ends **successfully** with
  "Stopped at the run time limit: N rows delivered, raise the run timeout or
  lower maxListings."
- Both the PAP page fetches and the DVF file downloads are now bounded by the
  time actually left, instead of by a fixed retry ladder that could run minutes
  past the point where the run had time for it.
- **A partial benchmark is now visible.** When only some of the requested
  commune/year sold-price files arrive, the status message and the `BENCHMARK`
  record both say how many of how many — instead of silently scoring against a
  smaller sample. A missing or empty benchmark now also explains why the deal
  scores are null.
- **Benchmark years** is a proper year picker (2021–2025, up to 5) with a real
  default, instead of a free-text list with no bounds — the year count is a
  direct multiplier on run time, and a city like Paris is 20 files per year.
- **New input: Max result pages to follow** (`maxPagesPerUrl`, default 20). It
  was always there in the code but you could not see or set it.
- Honest limits in the input form: **Max listings** now tops out at 800 (what
  one PAP search actually holds) instead of advertising 5,000, and **Keywords**
  accepts up to 50.
- Every run now ends with a status message. A run that was challenged by PAP,
  cut short by the clock, or emptied by your own filters says which — instead
  of reporting "no listings matched".

### 2026-08-19

- Synced from the PAP scraper (its `src/pap-*.js` files are copies): DPE /
  `energyClass` is now also read from the listing's own page when detail
  scraping is on, and the always-null `contactName` column is removed — PAP
  never displays an owner name anywhere.

### 2026-07-18

- Docs review: pricing copy audited for who-pays claims, none found (already
  neutral).

### 2026-07-12

- Invalid input no longer fails the run. The run now finishes cleanly with a clear explanation in its status message, so a typo or an empty list is easy to spot and fix.

### 2026-07-11

- Billing: on paid runs every row is billed before it is written, and a run
  now stops visibly if billing fails instead of continuing unbilled.

### 2026-07-06

- Simplified input: pagination depth is now handled automatically (technical field removed).

### 2026-07-04

- Initial release, published on Apify Store.
- Scores PAP owner-direct listings against official DVF sold prices of the same area.
- Per-ad over/under-market deal score from the real prix au m², sorted best deals first.
