# Changelog of Property24 Scraper - SA Property Listings & Agent Data (`haketa/property24-scraper`) Actor

- **URL**: https://apify.com/haketa/property24-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/haketa/property24-scraper.md

## Changelog

### 1.1.0 — 2026-11-01

- **Fixed title & price extraction on boosted/premium listing tiles.** Property24 renders "boosted" cards with a different internal layout (the agency branding wraps the clickable element, and the price is nested in a child node). The old selectors silently returned `null` for these, so roughly **half of all listings came back with no `title` and no `price`**. Title is now read from the clickable wrapper, the inner listing `[title]` element, and the listing image (in that order); price is read from the first non-empty text node of `.p24_price` with a full-text fallback. In a fresh verification run, **`title` coverage rose from ~48% to ~100%** and **`priceFormatted` from ~43% to ~100%**.
- **Added a `.p24_excerpt` fallback for `description`**, lifting description coverage to ~95% (boosted cards that omit `.p24_description` expose their blurb in `.p24_excerpt`).
- **Fixed numeric `price` on new-development cards that show a price range** ("From R X To R Y"). The amount is now parsed from the first (From) value instead of concatenating both numbers into a nonsense figure; `priceFormatted` still keeps the full original range string.
- **Fixed premature pagination stop.** The crawler only queued the next page when a results page held a full 20 tiles. Property24 pages routinely show 15–19 (boosted cards, interspersed promos, per-request variance), so deep crawls were wrongly ending around page 3. Pagination now continues while a page returns **any** listings, stopping only on an empty page, the `maxItems` limit, or the page safety cap — so large multi-province crawls run to full depth.
- **Hardened against Property24's intermittent 503 error pages.** Datacenter IPs occasionally receive transient 503s; raised `maxRequestRetries` from 4 to 8 and enabled aggressive session rotation (`useSessionPool`, pool size 100) so a soft-blocked IP is retired and the retry goes out on a clean one.
- **Re-pointed the `latest` build tag to the current version.** The default `latest` tag had drifted onto an older build; it now resolves to this release, so every run (and every customer using the default build) gets the fixes above.
- **Verified** a fresh 3-province for-sale run: **`title` 98%, `price` 99%, `priceFormatted` 100%**, core identity fields (`listingNumber`, `location`, `listingUrl`, `image`, `propertyId`) at 95–100%, **0% duplicates** on `listingNumber`, and **no value bugs** (`[object Object]`, scheme-less URLs, wrong types). Every remaining empty `price` corresponds to a legitimate "POA" (Price On Application) listing.
- **Refreshed the README** to the current gold standard: output example and field reference regenerated from the fresh run, pagination/scale and resilience behaviour documented, expanded FAQ and Related scrapers.

### 1.0.0 — 2026-10-25

- Initial public release of the **Property24 Scraper** for South African real-estate listings.
- Scrapes For Sale, To Rent and Sold listings by province, city or suburb, or via advanced Start URLs.
- CheerioCrawler (HTTP-only, datacenter proxies) with automatic `/pN` pagination, de-duplication by listing number, and per-listing fields: price (numeric ZAR + formatted), title, description, location, bedrooms, bathrooms, parking, floor/erf size, listing URL, image and agency details.
- Export to JSON, CSV, Excel or via the Apify API.
