Rightmove Property Scraper — UK Sale & Rent Listings
Pricing
from $1.05 / 1,000 result items
Rightmove Property Scraper — UK Sale & Rent Listings
Rightmove property listings for AI agents and analysts: any UK location (town, outcode, postcode, station), for sale / to rent / new homes / commercial, with all site filters, exact listing timestamps, price per sq ft, agent & phone, optional full property pages. Location lookup built in.
Pricing
from $1.05 / 1,000 result items
Rating
0.0
(0)
Developer
Samat Makatov
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Search rightmove.co.uk — the UK's largest property portal — the way its own search does: any town, area, outcode, postcode or station; for sale, to rent, new homes or commercial; every filter the site offers (price, bedrooms, type, radius, must-haves, added-since, SSTC/let-agreed). Each property comes back as clean JSON with exact listing timestamps, coordinates, size and price per sq ft, agent and phone; detail: true adds the full description, key features, tenure & lease years, council tax band, service charge, deposit, nearest stations and floorplans. Built for analysts and AI agents: no browser, no proxies, no API key.
Need it tailored to your workflow? Missing a field, a filter, another source or a different output format? Open an issue and describe what you need — we read every request and adapt the actor.
Use cases
- New-listing alerts —
sortType: 6+sinceHours: 2every couple of hours → only what appeared since the last run, with agent phone numbers. - Price-reduction tracking —
sinceField: "updated"catches reductions and re-listings; comparepriceacross runs byid. - Buy-to-let yield screening — run the same postcode on
buyandrent, join on bedrooms/type, dividepricePcm × 12by saleprice. - Comparable evidence for valuations —
includeSSTC: true+detail: truegives sold-subject-to-contract comps with size,pricePerSqFt, tenure and lease years. - Agent / developer market share — count listings per
agent(oragentCompany) in an area, spot new branches and developments (agentIsDeveloper). - Commercial-property sourcing —
commercial-buy/commercial-rentwithbusinessForSale, use classes and sizes.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
location | string | — (prefill "London") | Required unless locationIdentifier or searchUrl is given (the run stops with a clear message otherwise). Free text as typed on the site: town ("St. Albans"), area, "city, district" ("Clapham, London"), outcode ("M3"), full postcode, station ("Leeds station"), or a pasted Rightmove search URL. Resolved through Rightmove's own location search — see How location is read below. |
locationIdentifier | string | — | Exact identifier, e.g. REGION^904, OUTCODE^2506, POSTCODE^123456, STATION^5462. Overrides location. Copy from a site URL or from mode: "locations". |
searchUrl | string | — | A results page copied from rightmove.co.uk (…/property-for-sale/find.html?locationIdentifier=REGION%5E904&minBedrooms=2…). Its location, channel and filters are searched; the fields of this form add the filters the URL does not set. Overrides location and locationIdentifier. A property page or another site is refused. |
locationType | enum | — | REGION | OUTCODE | POSTCODE | STATION | STREET — preferred match type when the text is ambiguous. |
mode | enum | search | search or locations (returns the typeahead candidates for location without searching). |
channel | enum | buy | buy · rent · new-homes · commercial-buy · commercial-rent |
minPrice, maxPrice | integer | — | £ sale price; £ per calendar month for rentals. |
minBedrooms, maxBedrooms | integer 0–10 | — | 0 = studio. Ignored on commercial channels. |
radius | enum | "0.0" | Miles: 0.0 0.25 0.5 1.0 3.0 5.0 10.0 15.0 20.0 30.0 40.0 — the only values the site accepts; Apify refuses any other value before the run starts. |
propertyTypes | enum[] | — | detached semi-detached terraced flat bungalow land park-home private-halls |
mustHave | enum[] | — | garden parking newHome retirement sharedOwnership auction |
dontShow | enum[] | — | newHome retirement sharedOwnership auction houseShare (houseShare rentals only) |
maxDaysSinceAdded | enum | — | 1 3 7 14 — server-side; finer cut-offs via sinceHours. |
furnishTypes | enum[] | — | Rentals: furnished partFurnished unfurnished |
letType | enum | — | Rentals: longTerm shortTerm student |
includeSSTC | boolean | false | Sales: include sold-subject-to-contract / under-offer listings. |
includeLetAgreed | boolean | false | Rentals: include let-agreed listings. |
keywords | string[] | — | Must-appear words, e.g. ["garage","annexe"]; the site reports keywordMatchType. |
sortType | enum | "6" | 6 newest listed · 10 oldest · 1 lowest price · 2 highest price |
sinceHours | integer | — | Keep only listings whose firstVisibleDate (or listingUpdateDate, see sinceField) is younger than N hours. Exact timestamps come with the list — no detail needed. With sortType 6 the run stops early. |
sinceField | enum | added | added (new listings) or updated (also price reductions / re-listings). |
detail | boolean | false | Open every property page (0.7 s apart, about 50 properties a minute) for description, key features, sizes, tenure, costs, stations, floorplans, brochures, EPC. A page that cannot be read leaves detailError on its row; see Blocking below for when property pages stop. |
maxItems | integer 1–1000 | 40 | Stop after N properties. Mode locations returns every match (at most 10). |
maxPages | integer 1–42 | 42 | Result pages (24 listings plus the page's featured property each). Rightmove serves at most ~1,000 results per search. |
fields | string[] | — | Keep only these top-level fields per item, in this order. Every row keeps id (mode locations: locationIdentifier), and with detail: true also detailError when a property page was not read; they come first unless you list them. Another letter case or a near miss ("bedroms") is read as the output field and noted in the status; detail-only fields without detail: true and unknown names are ignored with a note; if no name is an output field the run fails and lists the valid names. |
Reference
Location identifiers (sample — any place works via location)
| Place | locationIdentifier |
|---|---|
| London | REGION^87490 |
| Manchester | REGION^904 |
| Birmingham | REGION^162 |
| Leeds | REGION^787 |
| Glasgow | REGION^550 |
| Edinburgh | REGION^475 |
| Liverpool | REGION^813 |
| Bristol | REGION^219 |
| Sheffield | REGION^1195 |
| Nottingham | REGION^1019 |
| Cardiff | REGION^281 |
| Belfast | REGION^133 |
| Oxford | REGION^1036 |
| Cambridge | REGION^274 |
| Brighton | REGION^93554 |
| Leicester | REGION^789 |
| Reading | REGION^1114 |
| Southampton | REGION^1231 |
| Milton Keynes | REGION^940 |
| Outcode SW1A | OUTCODE^2506 |
| Leeds Station | STATION^5462 |
Identifier types: REGION (towns, boroughs, counties, London areas), OUTCODE (first half of a postcode), POSTCODE (full postcode), STATION, STREET. Run mode: "locations" with any text to list the candidates with their identifiers.
How location is read
- Punctuation does not matter:
St. Albans,King's Lynn,Stoke-on-Trent,Brighton & Hove, extra spaces or capitals are looked up as words (Rightmove's location search itself refuses punctuation). - One town of that name: a name that is one of Rightmove's main towns is that town —
Leedsis Leeds, West Yorkshire (not Leeds, Maidstone, Kent or Leeds Station),Sheffieldis not Sheffield, Penzance. - Several towns of that name:
Newcastle(Upon Tyne, Under Lyme, County Down),Newport,Richmondstop the run before anything is searched, naming each candidate with itslocationIdentifier— type the full name (Newcastle Upon Tyne,Richmond, North Yorkshire) or pass the identifier. - City and district:
Clapham, London,London, ClaphamorGosforth / Newcastle upon Tyne— the place whose name contains every part is searched; if none does, the run stops with the closest matches. - Anything else (areas, outcodes, postcodes, stations, small places): Rightmove's first match that is not a street, as on the site. When other places share the name, the status names them.
- A pasted search URL (in
locationorsearchUrl): itslocationIdentifier, channel and filters are used. - Text Rightmove does not know stops the run with "did you mean …", saving nothing.
How the location was read is in the run's status and in SUMMARY.locationReadAs. The first results page is also checked: if Rightmove searched another place than the one sent (or none), the run stops before saving or charging anything.
Channels
channel | Site section | Rental-only options apply |
|---|---|---|
buy | property-for-sale | no |
rent | property-to-rent | yes (furnishTypes, letType, includeLetAgreed, dontShow: houseShare) |
new-homes | new-homes-for-sale | no |
commercial-buy | commercial-property-for-sale | no (bedrooms / residential types ignored) |
commercial-rent | commercial-property-to-let | yes |
Sort, radius, added-since
sortType: 6 newest · 10 oldest · 1 price ↑ · 2 price ↓. radius miles: 0.0, 0.25, 0.5, 1.0, 3.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0. maxDaysSinceAdded: 1, 3, 7, 14. These are select fields: Apify refuses any other value (another spelling or case included) before the run starts.
Examples
New flats in Manchester since the last run (alerting)
{ "location": "Manchester", "channel": "buy", "propertyTypes": ["flat"], "sortType": "6", "sinceHours": 6, "maxItems": 200 }
Furnished 2-bed rentals within a mile of SW1A, full details
{ "location": "SW1A", "locationType": "OUTCODE", "channel": "rent", "minBedrooms": 2, "maxPrice": 4000, "furnishTypes": ["furnished"], "radius": "1.0", "detail": true, "maxItems": 50 }
Sold-STC comparables with size and lease for a valuation
{ "locationIdentifier": "OUTCODE^2506", "channel": "buy", "includeSSTC": true, "propertyTypes": ["flat"], "detail": true, "fields": ["id","displayAddress","price","bedrooms","sizeSqFt","pricePerSqFt","tenure","yearsRemainingOnLease","annualServiceCharge","listingUpdateReason","url"], "maxItems": 100 }
Price reductions in Leeds this week
{ "location": "Leeds", "channel": "buy", "sinceField": "updated", "sinceHours": 168, "maxPrice": 300000, "maxItems": 300 }
Which identifiers does "Newcastle" resolve to?
{ "mode": "locations", "location": "Newcastle" }
Output
{"id": 92854638,"url": "https://www.rightmove.co.uk/properties/92854638","displayAddress": "Belfield Road, Didsbury Village, M20","price": 1500000, "currency": "GBP", "frequency": "not specified","priceDisplay": "£1,500,000", "priceQualifier": null, "pricePcm": null, "pricePw": null,"bedrooms": 6, "bathrooms": 3,"propertySubType": "Detached", "propertyTypeFullDescription": "6 bedroom detached house for sale","tenure": "FREEHOLD", "transactionType": "buy", "channel": "BUY","latitude": 53.419401, "longitude": -2.229238, "distanceMiles": null,"displaySize": "2,806 sq. ft.", "sizeSqFt": 2806, "pricePerSqFt": 535,"addedOrReduced": "Added on 07/09/2026", "firstVisibleDate": "2026-09-07T16:40:18.000Z","listingUpdateReason": "new", "listingUpdateDate": "2026-09-07T16:46:06.000Z","agent": "Philip James Kennedy, Didsbury", "agentBranchId": 7572, "agentPhone": "0161 524 4262", "agentIsDeveloper": false,"premiumListing": true, "featured": true, "auction": false, "development": false,"image": "https://media.rightmove.co.uk/…_max_476x317.jpeg", "images": ["…"], "imagesCount": 29, "floorplansCount": 1,"locationIdentifier": "REGION^904", "locationName": "Manchester, Greater Manchester","searchUrl": "https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E904&…","fetchedAt": "2026-09-13T07:55:11.933Z"}
| Field | Meaning |
|---|---|
id, url | Rightmove property id and page |
price, currency, frequency, priceDisplay, priceQualifier | Amount as listed; rentals may be weekly — see pricePcm / pricePw (normalised monthly and weekly rent) |
bedrooms, bathrooms, propertySubType, propertyTypeFullDescription, tenure | Basics |
latitude, longitude, distanceMiles | Location; distance only with a radius search |
displaySize, sizeSqFt, pricePerSqFt | Size when the agent supplied it; computed £/sq ft |
firstVisibleDate, listingUpdateReason, listingUpdateDate, addedOrReduced | Exact listing timeline (new, price_reduced, …), timestamps in real UTC |
letAvailableDate | Rentals: the day the property is available, YYYY-MM-DD (or Rightmove's text, e.g. Now) |
agent, agentBranchId, agentPhone, agentIsDeveloper | Listing agent / developer |
premiumListing, featured, enhancedListing, auction, development, students, onlineViewingsAvailable, displayStatus | Flags (displayStatus e.g. "Sold STC", "Let agreed") |
image, images, imagesCount, floorplansCount, virtualToursCount | Media |
keywordMatchType, locationIdentifier, locationName, searchUrl, fetchedAt | Provenance |
detail only: description, keyFeatures, propertyPhrase, outcode, incode, ukCountry, sizeSqM, pricePerSqM, pricePerSqFtSite, yearsRemainingOnLease, councilTaxBand, annualGroundRent, annualServiceCharge, deposit, letAvailableDate, furnishType, letType, minimumTermInMonths, listingHistory, published, archived, entranceFloor ({alias, displayText}), parking, heating, garden, accessibility, nearestStations[], agentCompany, agentBranchName, agentAddress, agentLogo, brochures[], floorplans[], epcGraphs[], allImages[], sharedOwnership, affordableBuyingScheme, businessForSale, commercialUseClasses[], tags[], detailError | From the property page |
mode: "locations" rows: query, locationIdentifier, type, id, displayName, howToUse, fetchedAt. When nothing matches, the run ends with the status No Rightmove location matches "…" and saves no rows.
Every run also writes a SUMMARY record to its key-value store (linked in the run's Output tab): rows saved, Rightmove's total, pages read, detail counts with the reason property pages stopped, notes on ignored inputs and why the run ended early.
Use it from code / agents
curl -X POST "https://api.apify.com/v2/acts/yadroo~rightmove-uk/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"location":"Bristol","channel":"buy","maxPrice":350000,"minBedrooms":2,"maxItems":50}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('yadroo/rightmove-uk').call({ location: 'Manchester', channel: 'rent', sinceHours: 3, maxItems: 100 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("yadroo/rightmove-uk").call(run_input={"locationIdentifier": "OUTCODE^2506", "channel": "buy", "includeSSTC": True, "detail": True, "maxItems": 60})items = client.dataset(run["defaultDatasetId"]).list_items().items
MCP: add https://mcp.apify.com to your agent (Claude, Cursor, custom) and call the yadroo/rightmove-uk tool with the same JSON input — the input schema descriptions are written for agents.
Pricing
Pay per event: $0.005 per run start + $0.0015 per property. A 100-property search costs about $0.155; detail: true costs the same per item but takes ~0.7 s per property. mode: locations rows are billed as items too (usually < 10). Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the property price; the start event is the same on every plan; platform usage is included.
Your max cost per run is respected: the run stops before the next property it could not pay for, saves what it has and ends with Stopped at your spending limit: N rows delivered. A run that nears its timeout stops starting new pages, keeps every row already read and ends with Stopped before the run timeout: N rows saved. Rows are saved page by page (every 10 properties with detail: true), and a restarted run never saves or bills a property twice.
Limits & FAQ
- Rate limits — one request per results page (24 listings + 1 featured property) plus one per property page, 0.7–0.8 s apart. Measured in the cloud: about 660 properties a minute from results pages, about 50 a minute with
detail: true(1,000 properties ≈ 20 min). Rightmove caps any search at ~1,000 results (42 pages); split by price band, outcode or type for full coverage — the status says when the cap ended the paging. - Freshness — live search results with exact
firstVisibleDate/listingUpdateDateon every list item, sosinceHoursmonitoring needs no detail pages. - Time zone — Rightmove sends these timestamps as UK wall-clock time with a
Z(UTC) suffix, so in summer (BST) they run one hour ahead of real UTC; its own page timestamp is off the same way. The actor converts them from Europe/London to real UTC (no change in winter, when UK time is UTC).letAvailableDateis a calendar day and is returned as a plain date. - Rentals —
priceis the amount as listed (may be weekly); usepricePcm/pricePw.minPrice/maxPriceare always per month. - Blocking — the search and property pages have been stable without proxies (no block in 1,300 requests, 02.10.2026). If the first results page is refused (403 or a challenge page), the run fails with that message; a later results page that fails ends the paging, keeps the rows saved and says so in the status. On property pages, a 403 or three failed pages in a row stop them for the rest of the run: the rest of the current results page is saved with list data only and
detailError: "skipped: …", no further results pages are read, and the status reports detail k/N and why. A single page that fails (a removed listing included) only setsdetailErroron its own row. - Newer property pages — listings with 15-digit ids (most commercial listings, a few residential ones) use a newer page layout.
detail: truereads it too, but that layout carries no council tax band, ground rent, deposit, furnishing, agent company/address/logo, Rightmove's own price texts, feature lists (parking, heating, garden, accessibility) or tags: those fields staynull/[]on such rows. A page in a layout the actor cannot read keeps the list fields withdetailErrorand does not stop the other property pages. - Ambiguous places — "Newcastle" names several towns: the run stops and lists them with their identifiers (see How
locationis read); type the full name, passlocationIdentifier, or checkmode: locations. Streets are only chosen whenlocationType: STREETor no area matches (Rightmove's search pages do not accept a street identifier, so such a run stops with a clear message). - Not included — sold-price history, agent e-mail, anything behind login. Only what the public page shows.
- Roadmap — saved-search diffing (only items not seen in a previous run), sold-prices dataset.
Made by Yadroo. Related actors: otodom-pl · willhaben-at · kleinanzeigen-de · marktplaats-nl · krisha-kz · autoscout24-cars