# Changelog of Rightmove, Zoopla & OnTheMarket UK Property Listings + Planning (`yappman/uk-property-listings`) Actor

- **URL**: https://apify.com/yappman/uk-property-listings/changelog.md
- **Full Actor documentation**: https://apify.com/yappman/uk-property-listings.md

## Changelog

### Notice: sold-prices mode changes in 0.3 (not before 5 November 2026)

Posted 5 October 2026 (also at data.yappman.com/notices/sold-prices-0-3/). From 0.3, `mode: "sold-prices"` reads our own monthly copy of HM Land Registry's Price Paid Data instead of Rightmove's sold-price pages. Listings mode does not change.

- One row per sale (`transactionId`, `price`, `date`, plus `tenure`, `newBuild`, `category`, `localAuthority`) instead of one per property: `propertyId`, `sales`, `lastSoldPrice`, `lastSoldDate`, `area` and `landRegistryUpdatedAt` go. `portal` becomes `"landregistry"`.
- Sales back to 1995, every registered sale in the chosen category with no per-area limit; the 1,000-rows-per-run ceiling stays. A run with no dates set looks back 10 years, as today's rows do; `soldWithinYears` (up to 40) or `soldFrom` reaches back to 1 January 1995. Updated 8 October 2026.
- By default, standard sales only (HM Land Registry's category A, the sales Rightmove's sold pages show). `saleCategory: "additional"` (category B: repossessions, buy-to-let and company purchases, and transfers not at market value) or `"any"` widens it. Clarified 6 October 2026.
- Inputs: full postcodes, postcode sectors, outcodes and local authority names. Rightmove `/house-prices/` URLs are no longer accepted.
- Bedrooms and bathrooms become opt-in (`includeBedsBaths`, off by default), filled only where a sale matches Rightmove's sold record exactly.
- Price: `sold-price` falls from $3.00 to $2.00 per 1,000 rows (higher plans $1.80, $1.60 and $1.40 per 1,000), plus `run-start` as today. Changed 7 October 2026.
- Unchanged: postcode level only (coordinates are the postcode's centroid), England and Wales only.

### 0.2.9 — OnTheMarket fix

- OnTheMarket changed its pages on 7–8 October 2026, and from then until this build its searches and listings returned nothing (and charged nothing). Fixed.
- A portal that returns nothing because every one of its searches or listings failed is now reported as failed, with the reason, instead of finishing as an empty success. If no portal returned anything, the run fails, saying nothing was scraped or charged. A search that simply has no results is still a normal empty result.

### Planning applications

- New add-on `includePlanningApplications` (with `planningRadiusMetres`, default 150 m, and `planningYears`, default 1, up to 3): planning applications near each listing from a nightly copy of PlanIt's UK planning data, nearest first (up to 100), with the copy's start date on every answered row (about 12 months at launch; nothing older is included, whatever `planningYears` says, and applications with no received date are left out). Charged as `planning-applications` whenever it answers, including "none nearby" where the roughly 1 km grid cells around the listing hold applications from a council PlanIt collects; never when the copy is out of date or unreadable (reported as unavailable), nor for a listing whose grid cells hold no applications at all.
- New answer `planning.coverage.applications: "not-covered"`, for a listing in an area PlanIt does not currently collect (none of the councils with applications in the roughly 1 km grid cells around the listing has had PlanIt's latest date for it within the last 90 days): no applications, and not charged. RUN_SUMMARY counts these as `rowsSkipped.notCovered`. Where those grid cells hold no applications from a council that counts (county councils, other non-local bodies and councils PlanIt's list does not know do not count), the listing is never charged: it is `not-covered` if its 10 km grid square names no council PlanIt currently collects, and `unavailable` otherwise.
- Until the copy has finished indexing every area, the earlier rule applies everywhere: an area with no applications at all is reported as `unavailable` and is free. Near a council boundary, a covered neighbour's applications in the grid cells around a listing (about 1 km) make it count as covered.

### OnTheMarket

- OnTheMarket is a new opt-in portal: add `"onthemarket"` to `portals` (the default stays `["rightmove", "zoopla"]`). For-sale, to-rent and new-homes listings on the same schema, from pasted unfiltered search URLs (`/for-sale/property/<place>/` and the to-rent and new-homes equivalents), typed place names or outcodes (resolved with OnTheMarket's own place lookup), or listing URLs (`/details/<id>/`).
- A place name that matches several places, none of them the plain name, is skipped with a note listing the choices, so you can paste the right search URL. A pasted search URL carrying OnTheMarket's own filter parameters is not accepted and is reported as unrecognised.
- `minPrice`, `maxPrice`, `minBeds`, `maxBeds` and `propertyType` are applied by the Actor to the rows it fetches, after OnTheMarket's cap of 1,020 results (34 pages) per search, so a narrow filter over a large area returns fewer rows than on the other portals. `radiusMiles` is ignored for OnTheMarket, with a note in `filterNotes`. An OnTheMarket location with `addedSinceDays` set, or with `propertyType: land`, is skipped with a note rather than searched wider or for nothing, and a filtered search stops after 3 pages in a row with no matching rows.
- Portal differences: `epcRating`, `status`, `uprn`, `chainFree`, `retirement`, `publishedAt` and `receptions` are always `null` and `priceHistory` is `[]`; tenure, lease years, council tax band, floor area and postcode come only with `includeDetails`. `propertyType` is one of the six types where OnTheMarket's label maps to one, and OnTheMarket's own text otherwise.
- Pricing is unchanged: the same events and prices as the other portals, and `maxItems` is shared across all selected portals.

### 0.2.7 — Store text

- The Actor's description now mentions Rightmove sold prices; the README's pricing note says sold-price rows have their own event and no add-ons.

### 0.2.6 — sold prices (Rightmove)

- New `mode: "sold-prices"` (Rightmove only): HM Land Registry sale history for an area, one row per sold property, from pasted `/house-prices/<area>.html` URLs, place names or outcodes (e.g. `LS6`).
- Rows are postcode level only — no street address, listing link, Rightmove id, or Rightmove coordinates. `propertyId` is a keyed hash of Rightmove's own id, the same from run to run while Rightmove keeps that id; `latitude`/`longitude` are the postcode's own centroid from postcodes.io (`coordinatesSource: "postcode-centroid"`).
- New filter `soldWithinYears` (Rightmove's windows: 1, 2, 3, 5, 10, 15, 20, 30 years, rounded down); `propertyType` is narrowed to detached, semi-detached, terraced and flat in this mode.
- New pricing event `sold-price`, $3.00 per 1,000 rows.
- A record whose postcode can't be read is skipped, not charged, and counted in RUN_SUMMARY (`rowsSkipped.noPostcode`).

### 0.2.5 — filter notes in the run summary

- RUN_SUMMARY now lists, per portal, any filter that was rounded to the portal's own window or step (`filterNotes`), so a scheduled run can tell its results are narrower than asked.
- A portal whose share of `maxItems` is already full no longer looks up further locations or fetches more pages; the rows returned are unchanged.

### 0.2.4 — narrower date filters

- `addedSinceDays` now rounds **down** to each portal's nearest window on both portals, with a note in the log, so a search is never wider than asked: on Zoopla, 2–6 days means the last 24 hours and anything over 7 means the last 7 days (previously 2–6 widened to 7 days and longer windows dropped the filter). Rightmove also supports 3- and 14-day windows and 0.5, 3, 5 and 10-mile radii.

### 0.2 — Rightmove

- Rightmove for-sale and to-rent listings, from pasted search URLs, from place names or postcodes with filters, or from listing URLs — search and detail pages, on the same schema as Zoopla.
- New `portals` input, default `["rightmove", "zoopla"]`, controlling which site(s) `locations` and the default search run on; pasted search and listing URLs are always routed to their own portal by host.
- `maxItems` is now shared across portals: each selected portal gets an equal share, and a portal that runs out of results passes the rest of its share to the others.
- Portal differences: Rightmove rows always have `uprn: null`, `priceHistory: []`, `epcRating: null` and `status: null`; full postcode, tenure, lease years, floor area, council tax band, floor plans, images, description, key features and agent details come from the Rightmove detail page with `includeDetails`.
- New homes remain Zoopla only; Rightmove skips `locations` when `listingType` is `new-homes`.
- Pricing is unchanged: the same events and prices apply to Rightmove rows, and the planning add-ons work the same on both portals.

### 0.1 — first release

- Zoopla for-sale, to-rent and new-homes listings from pasted search URLs, from place names or postcodes with filters (price, beds, property type, radius, added in the last day or week), or from listing URLs.
- Optional detail fields: EPC rating, floor area, tenure and lease length, council tax band, UPRN, full postcode, price-change history, description, features, photos and floor plans.
- Optional planning constraints for England from planning.data.gov.uk: conservation area, flood risk zone, green belt, Article 4 direction, tree preservation zone, and the nearest listed building or structure within 25 m.
- Pay per event: a run is only charged once listings reach your dataset; blocked or empty runs cost nothing.
- Up to 1,000 listings per run.
- Launch prices: $0.005 per run, $3.00 per 1,000 listings, $5.00 per 1,000 listing details, $5.00 per 1,000 planning-constraint lookups.
