Rightmove Scraper — UK Listings for Sale & Rent by Area avatar

Rightmove Scraper — UK Listings for Sale & Rent by Area

Pricing

from $1.20 / 1,000 property listings

Go to Apify Store
Rightmove Scraper — UK Listings for Sale & Rent by Area

Rightmove Scraper — UK Listings for Sale & Rent by Area

UK property for sale and to rent, by area, from Rightmove's own search API: one row per listing with price, bedrooms, type, tenure, size, coordinates, photos, key features, status and the agent branch. Optional full property-page details. No browser, no key.

Pricing

from $1.20 / 1,000 property listings

Rating

0.0

(0)

Developer

Insight Solutions

Insight Solutions

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

UK property for sale and to rent, by area, as data. Give this Actor one or more areas — a Rightmove location identifier, a Rightmove search URL, or a big-city name — and get back one row per listing: price (and the pcm figure for weekly lets), bedrooms, bathrooms, property type, tenure, floor area, coordinates, up to five photos, the key features, the status (added, reduced, under offer, sold STC), when it was first listed and last updated, and the estate agent's branch with its phone number. Switch on includeDetails and each listing's own page adds the full description, council-tax band, lease length, service charge, ground rent, floorplans, EPC images and the nearest stations.

It reads Rightmove's own search API — the JSON endpoint its robots.txt explicitly allows — over plain HTTP: no browser, no login, no cookies, no API key. $2.00 per 1,000 listings on the FREE tier, proxy included; failures are free rows, and a run that returns nothing costs nothing.

Try it in 30 seconds

This is the Store prefill; paste it and run:

{ "locations": ["REGION^93917"], "channel": "sale", "sortBy": "newest", "maxListingsPerLocation": 72 }

REGION^93917 is Greater London. You get the 72 newest listings for sale — three search pages of 24 listings plus the featured listing on each — and one free search row saying Rightmove matches 79,658 properties there. In our offline test suite that is 3 requests and $0.145; live it takes a few seconds.

New lets in Manchester this week, 2 bedrooms or more, under £1,500 a month:

{ "locations": ["Manchester"], "channel": "rent", "minBedrooms": 2, "maxPrice": 1500, "addedWithinDays": 7 }

Any area Rightmove can search — run the search on rightmove.co.uk and paste the results page's address:

{ "locations": ["https://www.rightmove.co.uk/property-for-sale/find.html?locationIdentifier=REGION%5E93917&radius=0.0&sortType=6"], "propertyTypes": ["house"], "keywords": ["garden"], "includeDetails": true, "maxListingsPerLocation": 50 }

From code — client.actor("insight.solutions/rightmove-property-api").call(run_input={"locations": ["REGION^93917"], "maxListingsPerLocation": 72}) with apify-client, or POST https://api.apify.com/v2/acts/insight.solutions~rightmove-property-api/run-sync-get-dataset-items.

What comes back

A listing row (from the captured Greater London search; empty columns cut):

{
"ok": true,
"rowType": "listing",
"listingId": "94414428",
"url": "https://www.rightmove.co.uk/properties/94414428",
"channel": "sale",
"displayAddress": "Charles II Place, Chelsea, London, SW3",
"postcodeArea": "SW3",
"latitude": 51.488159,
"longitude": -0.163878,
"price": 3250000,
"currency": "GBP",
"displayPrice": "£3,250,000",
"priceQualifier": "Guide Price",
"bedrooms": 4,
"bathrooms": 3,
"propertyType": "terraced",
"propertySubType": "Terraced",
"propertyDescription": "4 bedroom terraced house for sale",
"tenure": "FREEHOLD",
"sizeSqFt": 1679,
"summary": "An attractive four-bedroom house in a secure, gated Chelsea mews, featuring a south-facing garden, spacious entertaining rooms including an elegant first-floor sitting room with terrace. Ideally located off King’s Road, with a resident porter and easy access to Sloane Square, Chelsea ...",
"keyFeatures": [
"4 bedrooms and 3 bathrooms, Open plan sitting room/kitchen and dining, Formal first floor reception room with French doors to terrace, Garage, Cloakroom, South facing garden, Gated (truncated)"
],
"status": "reduced",
"addedOrReduced": "Reduced today",
"firstListedAt": "2026-10-16T17:26:57Z",
"updatedAt": "2026-11-04T01:54:11Z",
"updateReason": "price_reduced",
"imageCount": 20,
"images": [
"https://media.rightmove.co.uk/property-photo/bfcd993c9/94414428/bfcd993c922a82427c691909a13040cb.jpeg",
"https://media.rightmove.co.uk/property-photo/9e5d31762/94414428/9e5d317627e6e080e5bb4c62b878c157.jpeg"
],
"floorplanCount": 1,
"virtualTourCount": 0,
"agentBranch": "John D Wood & Co. Sales, Chelsea Green",
"agentBrand": "John D Wood & Co. Sales",
"agentBranchId": "669",
"agentPhone": "020 3835 4101",
"agentUrl": "https://www.rightmove.co.uk/estate-agents/agent/John-D-Wood-and-Co-Sales/Chelsea-Green-669.html",
"isFeatured": false,
"isPremium": false,
"isAuction": false,
"isNewHome": false,
"isStudent": false,
"isCommercial": false,
"onlineViewings": false,
"input": "REGION^93917",
"locationIdentifier": "REGION^93917",
"location": "Greater London",
"scrapedAt": "2026-11-04T02:20:13.512Z"
}

images holds up to five full-size photos (two shown here); imageCount says how many the listing has. Rentals add priceFrequency (monthly or weekly), monthlyRent and letAvailableDate. With includeDetails, the row also carries description, councilTaxBand, leaseYearsRemaining, annualServiceCharge, annualGroundRent, floorplanUrls, epcGraphUrls, nearestStations, listingHistory, agentCompany, isSharedOwnership and isRetirement — from the captured property page, for example:

{
"listingId": "90280923",
"detailsRead": true,
"postcodeArea": "E16",
"sizeSqFt": 934,
"tenure": "LEASEHOLD",
"leaseYearsRemaining": 240,
"annualServiceCharge": 6379.44,
"isSharedOwnership": true,
"nearestStations": [
{ "name": "West Silvertown Station", "types": ["LIGHT_RAILWAY"], "distanceMiles": 0.2 },
{ "name": "Pontoon Dock Station", "types": ["LIGHT_RAILWAY"], "distanceMiles": 0.32 }
],
"listingHistory": "Added on 29/06/2026",
"agentCompany": "Spicerhaart"
}

One free search row per location:

{ "rowType": "search", "input": "REGION^93917", "locationIdentifier": "REGION^93917", "location": "Greater London", "channel": "sale", "resultCount": 79658, "pagesRead": 3, "listingsReturned": 72, "filteredOut": 0, "cappedAt1008": true }

Anything that could not be read — a name not in the table, a wall, an empty search — comes back as a free diagnostic row (errorType, error) instead of a charge.

Use cases

  • New-listing alerts — schedule a run per area with addedWithinDays: 1 and sortBy: newest; every row is a property that came on the market (or back on it) since yesterday.
  • Price-reduction watch — status: reduced and updatedAt show what was cut and when; run daily and compare price by listingId.
  • Rental market research — monthlyRent puts weekly and monthly lets on one scale; group by postcodeArea, bedrooms and propertyType.
  • Estate-agent prospecting and market share — every row names the branch, its brand, its Rightmove page and its phone number: count listings per branch per district.
  • Investment screening — price, floor area, tenure, lease length, service charge and ground rent (with details) in one table, ready for £ per sq ft.
  • Maps and dashboards — every listing has coordinates and photo links.

How it compares

  • From Rightmove's own search API, the endpoint its robots.txt allows — not from rendered pages. The same JSON the site's own search reads, so every column is Rightmove's value, not a scraped label.
  • No browser. Plain HTTP through Apify's datacenter proxy: a page of 24 listings is one request of about 370 KB, so runs are fast and cheap.
  • Rightmove's own filters — price, bedrooms, radius, sort — are passed to Rightmove; the ones its URL does not take (maximum bedrooms, property type, keywords, added-within) are applied by the Actor and never billed when they drop a listing.
  • Honest about the cap. A search on Rightmove stops at 1,008 results; the search row says when you hit it (cappedAt1008), so you know to split the area.
  • Failures are rows, not charges — an unresolved name, a wall, an empty search each get a free diagnostic.

Where the data comes from

  1. Search — https://www.rightmove.co.uk/api/property-search/listing/search, Rightmove's JSON search endpoint (robots.txt: Allow: /api/property-search/* ahead of Disallow: /api/*). One request per page: locationIdentifier, channel (BUY or RENT), index (0, 24, 48 …), radius, sortType, and minPrice, maxPrice, minBedrooms when you set them. Each page has 24 listings plus, on most pages, one featured listing (isFeatured: true); a listing that appears twice in a run is returned and billed once. Pages are read in order, 250–600 ms apart, until maxListingsPerLocation is reached, the search has no more pages, or index 984 — Rightmove's 42nd and last page, 1,008 results.
  2. Property pages — only with includeDetails: https://www.rightmove.co.uk/properties/<id>, one per listing, read for the page model it embeds. The branch name, its company and its phone are the only names read from it; the branch's address, its marketing copy and the page's analytics and advertising blocks are not.
  3. Locations — an identifier (REGION^…, OUTCODE^…, POSTCODE^…, STATION^…) is used as given; a Rightmove URL gives its locationIdentifier; a name is looked up in a bundled table of large UK cities: Greater London (also London), Manchester, Birmingham, Leeds, Liverpool, Bristol, Sheffield, Edinburgh, Glasgow, Cardiff, Nottingham, Newcastle upon Tyne, Leicester, Oxford, Cambridge, Bath, York, Southampton and Coventry. Every search answer names the place it searched, and a table entry whose answer names a different place becomes a free unresolved row — never somebody else's listings. Rightmove's place-name autocomplete is not used.

Nothing else on rightmove.co.uk is requested, and nothing else under /api/.

Input reference

FieldTypeDefaultWhat it does
locationsstring[]prefill: ["REGION^93917"]Identifiers, Rightmove search URLs or table names, up to 50 locations a run. The same area twice is searched once.
channelselectsalesale or rent.
sortByselectnewestnewest (by last update: a fresh reduction counts), oldest, price-asc, price-desc — Rightmove's own orders.
maxListingsPerLocationinteger240 (prefill 72)1–1,008 listings per location.
minPriceinteger—Sent to Rightmove. Pounds; per calendar month for rentals.
maxPriceinteger—Sent to Rightmove. Pounds; per calendar month for rentals.
minBedroomsinteger—Sent to Rightmove. 0–10.
maxBedroomsinteger—Applied by the Actor. 0 (studios only) to 10.
propertyTypesstring[][]Applied by the Actor: detached, semi-detached, terraced, house (any house), bungalow, flat, house-share, land, park-home.
keywordsstring[][]Applied by the Actor: every word must appear in the summary, key features, type line or address. Up to 10.
addedWithinDaysinteger—Applied by the Actor: only listings first published, or re-added, in the last N days (1–365). With sortBy: newest, paging stops at the first page older than that.
radiusMilesselect0.0Rightmove's radius options, 0.0 (this area only) to 40.0 miles.
includeDetailsbooleanfalseRead each listing's property page too. One extra request per listing; same price.
maxConcurrencyinteger41–8 locations searched, and property pages read, at once.
maxRunSecsinteger24030–3,600. Listings already returned are kept — and billed — when it runs out.
proxyConfigurationobject{ "useApifyProxy": true }Apify's datacenter proxy by default.

A filter applied by the Actor runs on what Rightmove returns, so it does not widen the 1,008-result window: a search of 79,658 listings filtered to studios still reads at most 42 pages. Rows it drops are counted in the search row's filteredOut and are never billed.

A run with nothing usable — no location, an unknown channel, sortBy, radiusMiles or property type, a minimum above its maximum — finishes FAILED before a single request, with a free invalid-input row saying why.

Output reference

Every row has the same columns, null where a column does not apply, so the dataset exports as one table. rowType is listing, search or diagnostic.

Every row: ok, rowType, input (your entry, as typed), locationIdentifier, location (the place Rightmove says it searched), channel, url, scrapedAt.

Listing rows (paid): listingId, displayAddress, postcodeArea (outward code, from the address or the property page), latitude, longitude, price, priceFrequency, currency, displayPrice, priceQualifier, monthlyRent, bedrooms, bathrooms, propertyType (detached, semi-detached, terraced, house, bungalow, flat, house-share, land, park-home, other), propertySubType, propertyDescription, tenure, sizeSqFt, summary, keyFeatures[], status, displayStatus, addedOrReduced, firstListedAt, updatedAt, updateReason, letAvailableDate, imageCount, images[] (five photos at most), floorplanCount, virtualTourCount, agentBranch, agentBrand, agentBranchId, agentPhone, agentUrl, productLabel, isFeatured, isPremium, isAuction, isNewHome, isStudent, isCommercial, onlineViewings.

With includeDetails: detailsRead (whether the page was read; false when it was gone or unreadable — the listing is still returned), description, councilTaxBand, leaseYearsRemaining, annualServiceCharge, annualGroundRent, epcGraphUrls[], floorplanUrls[], nearestStations[] (name, types, distanceMiles), listingHistory, ukCountry, agentCompany, isRetirement, isSharedOwnership; the page also fills postcodeArea, sizeSqFt, tenure when the search left them empty, and replaces keyFeatures with the full list.

Search rows (free): resultCount, pagesRead, listingsReturned, filteredOut, cappedAt1008.

Diagnostic rows (free): errorType, error.

errorTypeMeaning
invalid-inputThe input cannot be used (see Input reference). The run is then FAILED.
unresolvedA name not in the table, a URL without locationIdentifier, an identifier Rightmove rejects, or a table entry whose answer named a different place.
blockedRightmove refused the run (HTTP 403 / 429, or a bot-check page). Written once; nothing more is requested in that run.
no-resultsThe search matches nothing, or nothing it returned passed your filters.
parse-failedRightmove answered with something other than its search JSON.
source-unavailableRightmove did not answer (network fault, or a 5xx twice).
timeoutmaxRunSecs ran out before a location was finished. Listings already returned are kept.
internalThis Actor's own error. The run is then FAILED.

Pricing

EventWhat it isFREEBRONZESILVERGOLD
actor-startOnce per run, only after the run has returned a listing$0.001$0.001$0.001$0.001
listingOne property listing, property-page details included when you ask for them$0.002$0.002$0.0016$0.0012

$2.00 per 1,000 listings, the datacenter proxy included.

RunCost
The prefill — 72 listings in Greater London$0.145
240 listings (the default) for one area$0.481
1,008 listings (Rightmove's cap) for one area$2.017
The same at GOLD$1.211
10 areas × 100 listings, with details$2.001
Five names not in the table$0.00

Charging is charge-after-push: rows are in your dataset before the event is recorded. Under a maximum total charge (ACTOR_MAX_TOTAL_CHARGE_USD), a page is cut to the listings the budget still pays for, the run stops there, and the status line says so. Never charged: search rows, diagnostic rows, listings your filters dropped, a listing seen twice, and a run that returns nothing (start fee included).

Limits

  • UK only, Rightmove only. Other UK portals are not read, and Rightmove's overseas and commercial searches are not offered.
  • 1,008 results per search, by Rightmove's design — 42 pages of 24. A bigger area returns its first 1,008 in your sort order; split it (outcodes, a smaller radius, price bands) to get more. cappedAt1008 on the search row tells you when.
  • Names resolve through a bundled table of 19 large cities. For anything else — a town, an outcode, a station — paste a Rightmove search URL or its locationIdentifier. Of the table, only Greater London's identifier is proven by our captures; the others are checked against Rightmove's answer on every run.
  • Some filters are applied by the Actor, after Rightmove's own: maxBedrooms, propertyTypes, keywords, addedWithinDays. They narrow what comes back; they do not reach further than Rightmove's 1,008.
  • Sold STC and under-offer listings come back as Rightmove's search serves them by default; status says which is which.
  • Search key features can be one truncated line for standard listings; includeDetails returns the full list.
  • EPC ratings are images. Rightmove publishes energy-performance charts, not a letter, so epcGraphUrls links them.
  • Details cost time, not money: one ≈ 420 KB page per listing, so a run with includeDetails is several times slower. Property pages read in parallel, maxConcurrency at a time.
  • Up to 50 locations a run; maxRunSecs bounds the whole run.
  • Not affiliated with, endorsed by or sponsored by Rightmove plc or any agent named in the output. Names are used descriptively.

Use it from an AI agent, or from code

One JSON object in, one flat array out — the shape agent runtimes want. The Actor runs with limited permissions and pay-per-event pricing and never stays resident, so it works over the Apify MCP server (mcp.apify.com) and with agentic (x402) payments. The Integrations tab pushes results to Slack, a webhook, Zapier, Make, Google Sheets, Snowflake or BigQuery, and Apify Schedules run it unattended — daily with addedWithinDays: 1 is a new-listings feed.

curl -X POST "https://api.apify.com/v2/acts/insight.solutions~rightmove-property-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locations":["REGION^93917"],"channel":"rent","maxPrice":2000,"maxListingsPerLocation":100}'
# pip install apify-client
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("insight.solutions/rightmove-property-api").call(run_input={
"locations": ["Manchester", "Leeds"],
"channel": "sale",
"addedWithinDays": 7,
"maxListingsPerLocation": 500,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["rowType"] == "listing":
print(row["location"], row["displayPrice"], row["bedrooms"], row["propertyType"], row["displayAddress"], row["url"], sep=" | ")

Building an app with Lovable? Apify's Lovable connector runs any Actor from inside a Lovable project with your Apify token. Connect Apify in Lovable once, then ask it: "Use Apify to run insight.solutions/rightmove-property-api for my area daily and build a new-listings dashboard around the results." At the default settings a run finishes well inside Lovable's 300-second synchronous limit, and every result is one JSON object per row, so the generated app needs no extra parsing. Usage bills to the Apify account whose token is connected.

FAQ

How do I search a town that is not in the table? Search for it on rightmove.co.uk, then copy the address of the results page — it carries locationIdentifier=REGION%5E… (or OUTCODE%5E…, STATION%5E…) — into locations. The identifier alone works too.

Why did my area return 1,008 listings when Rightmove says there are 30,000? Rightmove serves at most 42 pages of 24 for one search. Split the area — by outcode, by price band, or with a smaller radius — and run the parts.

Why do I sometimes get 25 listings from a page? Most pages carry one featured listing on top of the 24. It is a real listing in your area, marked isFeatured: true; drop those rows if you only want the sorted results.

Does "newest" mean newly listed? It is Rightmove's "Newest Listed" sort, which orders by the last update — so a listing reduced today sorts with one added today. Use addedWithinDays to keep only additions; status and updateReason say which is which.

Are rental prices monthly? price is as the agent sets it, per priceFrequency; monthlyRent is always the per-calendar-month figure Rightmove shows, and minPrice / maxPrice are per month for rentals, as on the site.

Do I need a Rightmove account or an API key? No. Nothing is logged into and no key is used; the Actor reads what any visitor's browser reads.

What happens if Rightmove blocks the run? You get one free blocked row and the run stops sending requests — nothing is charged for it. Try again later, or set the proxy to the RESIDENTIAL group.

  • Public listings only. The search API and property pages Rightmove serves to any anonymous visitor. The Actor never logs in, never sends cookies or session tokens, never accepts credentials, and requests only the search endpoint its robots.txt allows and the listing pages themselves.
  • Businesses, not people. A listing is an advert, and the agent columns describe an estate-agent branch — its name, brand, company, branch id, phone and Rightmove page. Rightmove's search answer and property pages carry no vendor, landlord or buyer data, and none is collected; e-mail addresses in agent copy are removed. The full postcode is not returned — only the outward code (postcodeArea).
  • No profiling of individuals. There is no person search and no input that names a person.
  • We are not a data broker. This Actor holds no database and sells no list. It reads listings on demand and writes the result to your dataset on your account.
  • Photos and descriptions belong to their owners — the agents and Rightmove. Links are returned, not copies; republishing them is your decision, under your own permissions.
  • Not affiliated with, endorsed by or sponsored by Rightmove plc or any agent named. Names and trademarks are used descriptively.
  • You are responsible for how you use the output, including any contact with the agents it names, under the UK GDPR, PECR, the Data Protection Act 2018 and other applicable law, and for complying with Rightmove's terms where they apply to you.

Our other Actors

Every Insight Solutions Actor is pay-per-result with no browser, no login and no API key, and every one of them returns free diagnostic rows instead of billing for failures. Prices are per 1,000 results.

Video, audio & social

News, documents & the web

Business, finance & jobs

Apps & games