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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Health check passed — actor verified working end-to-end on Apify platform.
- Changelog refreshed for Store quality compliance.
- 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.