# Changelog of DVF France 🇫🇷 Sold House Prices & Prix au m² by Commune (`tagadanar/french-real-estate-dvf`) Actor

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

## Changelog

### 2026-09-23

- **`pricePerM2` no longer inflates block sales.** DVF repeats the whole sale price on every line of a sale, so two flats sold in one deed each showed the price of both divided by one flat's surface (in Clichy 2025 those rows had a median of 72,222 €/m², about ten times the town's). `pricePerM2` is now only filled when the sale covers exactly one flat, house or commercial unit, and a new field, `unitsInSale`, says how many units the price covers. Cellars and parking sold with a flat do not count. `price` is unchanged: it is still the full sale price.

### 2026-09-19

- **Every run now ends by saying what it delivered, what it was asked for and,
  when it returns little or nothing, why.** A run that returns no transactions
  now tells you whether the open-data server did not answer, whether a location
  matched no French commune (and which one), whether the register simply has no
  sales recorded for those communes and years, whether your filters dropped
  everything that was read, or whether a limit — the transaction cap, your
  charge limit or the run timeout — stopped it early, naming how many
  commune/year searches were left unrun.

### 2026-09-08

- **A run can no longer spend more time than it has.** The retry ladder booked
  its worst case up front, under loops with no ceiling, so a slow or wobbling
  source could push the run past the platform timeout. A run killed that way
  loses its own closing message entirely.
- Every request now plans against the time actually left, and a backoff that
  would outlive the run is not slept.
- A run that hits its time limit now delivers everything it did read and says
  so plainly, naming the searches it never reached — rather than reporting an
  empty result, which is a claim it has not earned.

### 2026-09-02

- The run now ends with a status message in the Console (the "Done" line was log-only, so a run could not explain itself in the Store).

### 2026-08-29

- README: the pricing table now states the actual price ($1.00 per 1,000
  transactions, $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: added a table of every input, including `maxPrice`, which was the
  one filter the page never mentioned.

### 2026-08-19

- Cost bounds enforced in code ahead of the 2026-08-26 we-pay flip: at most
  100 locations are processed per run (the schema's `maxItems: 100` was
  bypassable through a single comma/newline-joined string) and location
  resolution stops once 500 communes have been collected. Both caps warn
  loudly in the log and suggest splitting the job across runs.

### 2026-08-09

- Copy only, no code or input change. The Store card was written entirely in
  French, so English searches for the same job ("French sold house prices",
  "price per square meter France") never matched it. Title, card description
  and README now carry both languages, and lead with sold prices and
  comparables rather than the dataset acronym.
- README: added a coverage table (years 2021–2025 re-verified live against
  `files.data.gouv.fr/geo-dvf` on 2026-08-09; 2026 not published yet), an
  explicit sold-vs-asking-price answer, and a note that rows are deduplicated
  by mutation/parcel/type/surface.

### 2026-07-18

- README: dropped a "nothing more" pricing claim so the copy holds regardless
  of who covers platform usage.

### 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.
- List inputs now accept datasets piped straight from another scraper: entries
  that are objects are read through their usual key names (url/link,
  query/keyword/title, name/company and similar) instead of being rejected.

### 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-09

- Input is now tolerant of common shapes that previously failed the run: a bare
  string / bare object / delimited string for "locations" is coerced into a list
  instead of erroring. Empty input still errors.

### 2026-07-04

- Published on Apify Store.

### 2026-07-03

- Initial release.
- Official French sold-property prices (DVF — valeurs foncières) by commune, postal code or INSEE code.
- Price, address, type, surface, rooms, land and prix au m² per transaction.
- Filters: property type, price, surface, year (2021–2025).
