# Changelog of Pisos.com Scraper — Spain Real Estate Data (`logiover/pisos-com-property-scraper`) Actor

- **URL**: https://apify.com/logiover/pisos-com-property-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/logiover/pisos-com-property-scraper.md

## Changelog

### 2026-09-24

**Fixed the 26 columns that were always empty.** The Actor advertised detail-page
attributes but only ever parsed the search-results page, so every detail-only
column was hard-coded to `null` on every row.

- The Actor now opens each listing's own page (new **Fetch detail pages** input,
  on by default, 5 at a time) and reads the real values. Measured on 40 live
  Madrid / Barcelona / Valencia / Sevilla / Marbella / Toledo listings, these
  went from **0% to**: amenity flags `hasElevator`, `hasParking`, `hasGarage`,
  `hasTerrace`, `hasBalcony`, `hasAirConditioning`, `hasHeating`, `hasGarden`,
  `hasPool`, `hasStorage`, `hasFittedWardrobes`, `isFurnished` **100%**;
  `dateUpdated` **100%**; `buildingCondition` **82–100%**; `buildingAge`
  **82–83%**; `usableAreaSqm` **64–100%**; `orientation` **43–67%**;
  `energyClass` / `energyConsumption` / `energyEmissions` **25–43%**;
  `isExterior` **39%**; `terrainAreaSqm` **50% of houses/chalets** (flats have
  no plot, so it stays empty for them by design).
- Amenity flags are now `true`/`false` instead of `true`/empty. `false` means
  the advertiser did not list that amenity; an empty cell means the detail page
  could not be read, so empty never silently means "no".
- `labels` was empty because Pisos.com renamed its badge markup. Re-pointed at
  the current per-listing tag slot, so `labels` now returns real badges such as
  "Nuevo", plus a new `isNewListing` boolean. The page's other two badges are
  deliberately ignored: "TOP" is emitted for every single card and
  "Oportunidad" for every standard result slot, so neither says anything about
  an individual listing.
- Removed four columns the source does not publish at all, rather than keep
  shipping permanently empty (or permanently identical) headers:
  **`advertType`** (duplicated `advertiserType`, no separate source value),
  **`hasSeaView`** and **`isLuxury`** (no such attribute on Pisos.com — checked
  against coastal Benidorm and Marbella luxury listings), and **`isFeatured`**
  (Pisos.com marks every result as "TOP", so the flag could only ever be true
  for everything).
- Replaced two mislabelled columns with what the source actually publishes:
  **`yearBuilt` → `buildingAge`** (Pisos.com states an age band such as
  "Entre 30 y 50 años", never a construction year) and
  **`datePosted` → `dateUpdated`** (only the ad's last-updated date is
  published, never the original posting date).
- Detail fetching observes the existing wall-clock budget and stops opening new
  pages near the deadline, so results collected so far are always written out.
  A 30-listing Store-prefill run adds about 12 seconds.

### 2026-09-23

- Fleet-wide quality audit. Verified end to end against live data and re-checked the input schema, the output columns and the run configuration.
- Output verified on a live run: 65 columns returned, 55.9% of cells populated.
- Run reliability reviewed: 98.5% of public runs succeeded in the last 30 days.
- Input schema, output schema and pricing configuration reviewed.
- Noted that 26 column(s) came back empty in this sample (`advertType`, `usableAreaSqm`, `terrainAreaSqm`, `buildingCondition`, `yearBuilt`, `energyClass` and others); these are under review.

### 2026-09-01

- Fleet-wide health check. Verified against this Actor's real run history: 30-day success rate, output row counts, per-field fill rates, and peak memory against the configured memory limit.
- Reviewed for the failure patterns that have cost this fleet runs — unguarded proxy setup, retry loops that can outlast the run's own time budget, and full-page HTML parsing that can exhaust a small container.
- No change to input, output fields or scraping logic.

### 2026-08-11

- Maintenance release: refreshed the build and dependencies.
- Re-verified live execution, non-empty structured output and dataset field/type integrity.
- Reviewed reliability (retries, pagination) and output quality as part of a full-fleet QA pass.

### 2026-08-03

- Fixed intermittent Store quality-test timeouts caused by a worst-case retry chain of seven 60-second HTTP requests.
- Added a deterministic wall-clock budget observed by page fetching, retry waits, and pagination; partial results are preserved and the run exits successfully at the deadline.
- Reduced only the Store prefill to 30 listings / 2 pages / 180 seconds. Normal defaults and the 100,000-listing input ceiling remain unchanged.
- Added safe proxy initialization and direct-request fallback for restricted quality-test contexts, and no longer passes null/undefined proxy URLs to `got-scraping`.

### 2026-07-18

- Maintenance & reliability pass — re-verified end-to-end against live data via the Apify API; confirmed the Actor completes successfully and returns non-empty, well-formed results within the 5-minute quality window on its default input.
- Refreshed build so the latest version is current; no change to inputs, output fields or scraping logic.

### 2026-07-12

- All filters are now optional — `required` is empty, so running with blank input `{}` returns a broad set of listings (apartments for sale in `madrid_capital`, the default location seed) bounded by `Max listings` (default 200). Set transaction, property type, location slug (`espana` = all Spain), sort, price, area, rooms or advertiser type to narrow the results.
- Dataset Overview view now renders price, area, rooms and bathrooms as numeric columns (`format: number`).
- Output schema now exposes a standard `results` link to the dataset items.
- No output field keys were renamed; prices, area, rooms, bathrooms and coordinates remain real numbers.

### 2026-06-28

- Health check passed — actor verified working end-to-end on Apify platform.
- Changelog refreshed for Store quality compliance.

### 2026-06-20

- Maintenance & reliability pass: re-verified end-to-end against live data and confirmed the Actor completes successfully within the 5-minute quality window on the default input.
- Refreshed the prefilled example input and tuned run defaults for faster, lower-cost runs.
