Rightmove API: Get sold prices
Find recent sold prices and sale histories for a UK postcode, street or area on Rightmove. The average is calculated from the returned properties, not every sale in large areas.
Unofficial. Not affiliated with or endorsed by Rightmove.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Years optional
years Include sales within the last number of years, such as 3.
5
Whole number. One of
1,2,3,5,10,20. Default3.- Location, required
location UK postcode, street or area, such as SW11 6EH or Clapham.
Bolingbroke Grove
- Max Results optional
max_results Maximum properties to return, such as 25.
30
Whole number from 1 to 100. Default
25.- Property Type optional
property_type Property type to include, such as flat.
flat
One of
any,detached,semi_detached,terraced,flat. Defaultany.
Input as JSON
{ "years": 5, "location": "Bolingbroke Grove", "max_results": 30, "property_type": "flat"}Output
{ "currency": "GBP", "area_name": "Bolingbroke Grove, Wandsworth, London, SW11", "properties": [ { "tenure": "leasehold", "address": "Flat B, 41, Bolingbroke Grove, London SW11 6EH", "bedrooms": 4, "date_sold": "2026-07-24", "earlier_sales": [ { "date_sold": "2021-04-20", "price_gbp": 710000 }, { "date_sold": "2011-08-15", "price_gbp": 449950 }, { "date_sold": "1997-04-03", "price_gbp": 158500 } ], "property_link": "https://www.rightmove.co.uk/house-prices/details/3a1fb84f-4029-454c-bc2c-c1ac8bc087c3" , "property_type": "Flat", "last_sold_price_gbp": 700000 }, { "tenure": "leasehold", "address": "19, Lane Court, Bolingbroke Grove, London SW11 6EW", "bedrooms": 4, "date_sold": "2026-06-23", "earlier_sales": [ { "date_sold": "2008-02-22", "price_gbp": 342000 }, { "date_sold": "1996-07-19", "price_gbp": 75000 } ], "property_link": "https://www.rightmove.co.uk/house-prices/details/e2343242-d9bc-47ed-af80-24312b803ce1" , "property_type": "Flat", "last_sold_price_gbp": 535000 }, { "tenure": "leasehold", "address": "97, Bolingbroke Grove, London SW11 1DB", "bedrooms": 2, "date_sold": "2026-02-16", "earlier_sales": [ { "date_sold": "2025-01-24", "price_gbp": 776000 }, { "date_sold": "2019-04-08", "price_gbp": 625000 }, { "date_sold": "2009-10-05", "price_gbp": 442500 } ], "property_link": "https://www.rightmove.co.uk/house-prices/details/cf5844eb-883f-4cb5-ae35-06d67e30bf58" , "property_type": "Flat", "last_sold_price_gbp": 680000 } ], "average_sold_price_gbp": 711511}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"rightmove.co.uk/get_sold_prices","input":{"years":5,"location":"Bolingbroke Grove","max_results":30,"property_type":"flat"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "rightmove.co.uk/get_sold_prices" , "input": { "years": 5, "location": "Bolingbroke Grove", "max_results": 30, "property_type": "flat" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "rightmove.co.uk/get_sold_prices" , "input": { "years": 5, "location": "Bolingbroke Grove", "max_results": 30, "property_type": "flat" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run rightmove.co.uk/get_sold_prices# with {"years":5,"location":"Bolingbroke Grove","max_results":30,"property_type":"flat"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "location" ], "properties": { "years": { "enum": [ 1, 2, 3, 5, 10, 20 ], "type": "integer", "default": 3, "description": "Include sales within the last number of years, such as 3." }, "location": { "type": "string", "description": "UK postcode, street or area, such as SW11 6EH or Clapham." }, "max_results": { "type": "integer", "default": 25, "maximum": 100, "minimum": 1, "description": "Maximum properties to return, such as 25." }, "property_type": { "enum": [ "any", "detached", "semi_detached", "terraced", "flat" ], "type": "string", "default": "any", "description": "Property type to include, such as flat." } }}Output schema
{ "type": "object", "required": [ "area_name", "average_sold_price_gbp", "currency", "properties" ], "properties": { "currency": { "enum": [ "GBP" ], "type": "string" }, "area_name": { "type": "string" }, "properties": { "type": "array", "items": { "type": "object", "required": [ "address", "last_sold_price_gbp", "date_sold", "property_type", "bedrooms", "tenure", "earlier_sales", "property_link" ], "properties": { "tenure": { "type": [ "string", "null" ] }, "address": { "type": "string" }, "bedrooms": { "type": [ "integer", "null" ] }, "date_sold": { "type": "string", "format": "date" }, "earlier_sales": { "type": "array", "items": { "type": "object", "required": [ "date_sold", "price_gbp" ], "properties": { "date_sold": { "type": "string", "format": "date" }, "price_gbp": { "type": "integer" } }, "additionalProperties": false } }, "property_link": { "type": "string" }, "property_type": { "type": [ "string", "null" ] }, "last_sold_price_gbp": { "type": "integer" } }, "additionalProperties": false } }, "average_sold_price_gbp": { "type": [ "integer", "null" ], "description": "Average of the returned most recent property sale prices in GBP." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
rightmove.co.uk/get_sold_prices- Returns
- area name, average sold price, properties with address, last sold price, date, type, bedrooms, tenure, earlier sales, link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method rightmove.co.uk/get_sold_prices with the inputs above.
Ask your agent
- What have terraced houses on Mill Road, Cambridge sold for over the last 5 years?
- Pull recent Rightmove sold prices for flats in SE15 4QL, up to 40 results from the past 2 years
- How much did homes in Headingley go for in the last year? I'd like the average and a list of sales with dates and bedroom counts.
- Show me the sale history for semi-detached properties around BS7 8NE going back 10 years
- Using Rightmove, find detached houses sold in Harpenden within the past 3 years, including tenure and any earlier sale prices
See more
All Rightmove methodsSearches Rightmove homes for sale or to rent around a town, area or postcode, with price, bedroom, property type, radius and under-offer filters, sorted by newest or price.
rightmove.co.uk/search_propertiesSearches Zoopla homes for sale or to rent in a UK town, area or postcode, with price, bedroom, property type and sort options. Prices are in GBP; rents are monthly.
zoopla.co.uk/search_propertiesSearches Realtor.com homes for sale, for rent, or recently sold in a city, neighborhood or ZIP code, with optional price, bedroom, bathroom and home type filters and sort order. Rentals with price ranges use the lowest advertised rent; withheld sold prices are blank.
realtor.com/search_homesSearches Homes.com homes for sale in a US city, neighborhood, or ZIP code, with optional price, bedroom, bathroom and home type filters. Returns listings in site order; days on market is null when not shown.
homes.com/search_homesSearches Zillow homes for sale in a city and state, neighborhood or ZIP code, with optional price, bedroom, bathroom and property type filters and sort order, from Zillow's public search pages (up to 100 listings).
zillow.com/search_homesLooks up Zillow housing market figures for a city and state or five-digit ZIP code: typical home value, one-year change, list and sale prices, inventory and listing activity.
zillow.com/get_housing_marketGets a home's details from Realtor.com by street address or Realtor.com property link: status, list price, value estimate, beds, baths, size, year built, HOA fee, property and tax history, nearby schools, flood risk and photos.
realtor.com/get_homeSearches Redfin homes for sale in a city, neighborhood or ZIP code, with price, home type, bed and bath filters and a sort order, returning each listing's price, size, status, photo and links.
redfin.com/search_homes